2

構文の強調表示を動的に (つまり、現在のファイルの内容に応じて) 適応させたいと考えています。これは一般的に役立つかもしれませんが、私の特定の設定は次のとおりです。

私が考えるファイルの種類には、形式の(任意の多くの)ブロックが含まれる場合があります(VAR ...)。このような「VARブロック」には、変数と見なされる識別子のスペース区切りのリストが含まれます(VARブロックにない識別子は固定機能シンボルまたは定数と見なされます)。trs.vimさらに、そのようなファイルの構文強調表示を処理するファイルが既に存在します。trs.vim構文グループtrsKeywordで宣言されています。ここでの目標は、このグループを使用してすべての変数を強調表示することです。

次の例を考えてみましょう (それを と呼びましょうadd.trs):

(VAR x y)(RULES
  add(z, y) -> y  
  add(s(x), y) -> s(add(x, y))
)

vimで開くときadd.trs、それが必要であり、キーワードとして出力されます(たとえば、引数がないにもかかわらず、そうではありません)。xyz

4

1 に答える 1

2

私はすでに望ましい結果を達成しました(しかし、SOで共有したかったのです)。ここにあります(次のスニペットはファイルに結合する必要がありますvars.vim)。

まず、VAR ブロックを認識するパターンを定義します。

" pattern that matches VAR-blocks of *.trs files
let varblock = '(VAR\s*\(.*\))'

次に、VAR ブロックについて現在のファイルをチェックし (そのために使用するよりも良い方法があるのではないでしょ%うか?)、一致が見つからなかった場合は無視します。

" create list of variables from all VAR-blocks 
try
  silent exe "vimgrep /" . varblock . "/j %"
catch /^Vim\%((\a\+)\)\=:E480/ " no match
  " do nothing
endtry

見つかった一致はgetqfilst()、私がコピーした によって取得されます。次に、このリストのすべての要素を、パターンに一致した最初のサブグループvarblock(スペースで区切られた識別子を含む文字列) に置き換えます。このようなすべての文字列を 1 つの文字列に結合し、スペースで分割して識別子のリストを取得します。

let vars = split(join(map(copy(getqflist()), 'matchlist(v:val.text, varblock)[1]')))

最後に、これらの識別子に一致するパターンを作成し、trsKeywordグループに登録します。

" activate syntax highlighting for variables
exe "syn match trsKeyword \"\\<\\(" . join(vars, '\|') . "\\)\\>\""
" echo "variables: " . join(vars, ", ")

と連携させるためにtrs.vim、ディレクトリを作成し、中~/.vim/syntax/trsに入れtrs.vimましたvars.vim。それから私~/.vimrcは追加しました

" TRS files
au BufNewFile,BufRead,BufWrite *.trs setf trs

で終わるファイルの構文強調表示を有効にします.trs(また、バッファーが保存されるたびに変数のリストを更新します)。

于 2013-04-17T06:38:22.483 に答える