ローカルvimrcに構文強調表示ルールを追加するにはどうすればよいですか?


10

FedoraとWin7の両方にgvimをインストールしました。Fedoraのvimとgvimはどちらもcコードの関数名を強調表示していませんが、win7のgvimは強調表示しています。

win7ではvim73/syntax/c.vim、最後に追加の行があることがわかりました。

syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 
syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 
hi cFunction gui=NONE guifg=#B5A1FF

これらの行をc.vimFedoraのに追加すると、gvimは関数名も強調表示できます。

移植性を維持するため.vimrcに、関数名を強調表示するように変更するだけです。ただし、これらの行をに追加した後.vimrc、機能しませんでした。

それで、誰かが私を助けることができますか?私は検索を行いましたが、vimで関数名を強調表示するための多くの解決策があります。しかし、私はこれらのラインをで機能させる方法に興味があります.vimrc。どうもありがとう!


5
~/.vim/after/syntax/c.vim代わりに追加してみてください。
muru、2015年

@muruはい、動作します。しかし、それを追加するのは.vimrcどうですか?
tamlok、2015年

おそらくのようなものを使用autocmd BufEnter *.c hl ...する必要がありますが、それをに保持する必要がありますafter/syntax/c.vim。Vimの最新バージョンはすべて.vim/after/ディレクトリを認識します。Windowsの場合、パスはになるvimfiles/after/...ため、移植性はそれほど問題になりません(特にプラグインを使用する場合)。
muru

回答:


13

ただし、これらの行を.vimrcに追加した後、機能しませんでした。

これは、Vimが'syntax'オプションを設定するときに既存の構文項目をクリアするためです。これは、古い構文項目を保持すると、奇妙な状況が発生するためです。あなたが持っているバッファをsyntax=foo使用しているset syntax=bar場合は fooとの両方の構文が強調表示されているバッファになりbarます。

Vimが起動すると、vimrc(起動時に)1回ロードされますが、filetypeor syntaxオプションが設定されるたびにファイルタイプと構文ファイルがロードされ、vimrcで設定した値がリセットされます。

リセットしない場合でも、vimrcに追加するだけではお勧めできません。これは、でのバッファだけでなく、すべてのバッファに適用されるためsyntax=cです。


以下のテキストは、Unix-yシステム上のVimを想定していますが、NeovimおよびWindowsユーザーでも機能します。

  • Neovimユーザーはに置き換える必要が~/.vim/あり~/.config/nvim/ます。
  • Windowsユーザーはに置き換える必要が~/.vim/あり%USERPROFILE%\vimfiles\ます。

ファイル全体を上書きする

何かを変更する最も簡単な方法は、単にそれを上書きすることです。そのためには、でファイルを作成します~/.vim/<file>.vim

<file.vim>への相対パスです$VIMRUNTIME(サブディレクトリを含む)。あなたの例では、それはであるべきですsyntax/c.vim。のファイルの代わりに読み込まれます$VIMRUNTIME

この結果、変更を加えるのが簡単になります。既存の構文ファイルを修正するのは、少し難しい場合があります。欠点は、システム全体のファイルに加えられた将来の更新を取得できないことです。

私はしばしばこれを開始点として使用して構文ファイルを実験し、後で以下に説明する方法の1つを使用してローカルの追加に対するローカルの変更を抽出します。

ローカル追加

構文ファイルにローカル追加を追加するには2つの方法があり、それらは機能的に同一であり、好みの方法を使用できます。

Syntax autocmd

Syntaxautocmdを使用します。

augroup ft_c
    autocmd!
    autocmd Syntax c syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 
    autocmd Syntax c syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 
    autocmd Syntax c hi cFunction gui=NONE guifg=#B5A1FF
augroup end

複数のコマンドをチェーン|することは、:synコマンドの一部として解釈される傾向があるため、ここでは問題があることに注意してください。これが、私がautocmd Syntax c数回繰り返した理由です。別の方法は、関数を使用することです。

fun s:c()
    syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 
    syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 
    hi cFunction gui=NONE guifg=#B5A1FF
endfun

augroup ft_c
  autocmd!
  autocmd Syntax c call s:c()
augroup end

利点は、すべての変更を単一のファイルに含めることができることです。不利な点は、特に変更が多い場合は、見苦しいことです。

ディレクトリの後

次のディレクトリを使用します~/.vim/after/<file>.vim

これは、<file>.vimhasの後にロードされます。ここで、<file.vim>$VIMRUNTIME(サブディレクトリを含む)への相対パスです。あなたの例では、それはであるべきですsyntax/c.vim

もご覧ください:help after-directory

利点は、特に多くの変更がある場合、autocmdよりも読みやすくなることです。欠点は、Vimのセットアップを別のマシンにミラーリングする場合、追加のファイルをコピーする必要があることです(これは、多くの人がVitファイルをGitHubリポジトリに保持するため、マシン間で簡単にミラーリングできる重要な理由です) )。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.