Vimのシンタックスハイライト
Vimでは多くの言語がシンタックスハイライトがされますが,自身で定義した関数などはされません.でもやっぱりハイライトされた方が見やすいですよね.ということでシンタックスハイライト用のプラグインを作ってみました.
特徴
ctags
を利用している.- tagのデータの作成などはバックグラウンドで非同期で行われる.
- (今のところ)コードがとっても短い(500行弱程度).
ctags
がサポートしている言語なら原理上どんな言語にでも使える.- プロジェクトのルートディレクトリを設定でき,開いているバッファで関連のあるものは全て自動でハイライトが更新される.
良い点ばかり挙げましたが,悪い点もあります.
ctags
で吐き出されるリストを使っているので,精度が完璧とは言えない.設定のカスタマイズ次第で向上は可能(後述).- Vimの
syntax
を乱用しているので,タグ情報が大量にある場合はVimのカーソル移動などが遅くなります.:set nocursorline
で改善された場合はこれが原因です.
Demo
ちょっとあまりいいDemoが思いつかなかったんですが,上のgifでは:HighlighterUpdate
というコマンドを実行すれば,ユーザー定義の関数やクラスなどがハイライトされています.色などは個人で再設定可能です.完全にオートでやって欲しい場合は,後述するg:highlighter#auto_update
を設定すればファイルを開いた時や保存した時にハイライトが自動更新されます.
使い方
必要なもの
ctags
コマンド
Macの場合はHomebrewを使ってbrew install ctags
とやればインストールできます.
python3の使えるNeoVim
NeoVimの補完プラグインDeopleteと同様に,NeoVim内で:echo has("python3")
とやって1
が返ってくればOKです.0
となる場合は,pip3 install neovim
を実行して下さい.
インストール
ソースコードはこちらにあります.プラグインマネージャにvim-plugを用いている場合は,
Plug 'KeitaNakamura/highlighter.nvim', {'do': ':UpdateRemotePlugins'}
とすればOKですが,他のプラグインマネージャを使っている場合は,インストール後:UpdateRemotePlugins
をVim内で実行して下さい.
設定
自動更新
" 0: 自動更新なし(デフォルト)" 1: 保存後自動更新" 2: ファイルを開いた時と保存後に自動更新letg:highlighter#auto_update =0
プロジェクトのルートディレクトリ
letg:highlighter#project_root_signs = ['.git']
上記のように設定すると,.git
のあるディレクトリがプロジェクトルートとして設定されます(サインはファイル,フォルダを問いません.複数設定も可能(順優先)).プロジェクトルートが設定されている場合,プロジェクト内のすべてのユーザー定義が,ハイライトの更新対象になります.
言語の除外
ハイライトを除外したい言語は以下のようにfiletype
を指定して下さい.
letg:highlighter#disabled_languages = ['c','cpp']
シンタックスハイライトのカスタマイズ
ここは,xolox/vim-easytagsを大いに参考にしました.
カスタマイズ例(python):
letg:highlighter#syntax_python = [
\ { 'hlgroup' : 'HighlighterPythonFunction',
\ 'hlgroup_link' : 'Function',
\ 'tagkinds' : 'f',
\ 'syntax_type' : 'match',
\ 'syntax_suffix' : '(\@=',
\ },
\ { 'hlgroup' : 'HighlighterPythonMethod',
\ 'hlgroup_link' : 'Function',
\ 'tagkinds' : 'm',
\ 'syntax_type' : 'match',
\ 'syntax_prefix' : '\.\@<=',
\ },
\ { 'hlgroup' : 'HighlighterPythonClass',
\ 'hlgroup_link' : 'Type',
\ 'tagkinds' : 'c',
\ }]
上記はデフォルトで定義されているpythonのシンタックス情報です.変数名は,g:highlighter#syntax_{filetype}
です.それぞれの項目は以下のような意味です.
キー | 意味 |
---|---|
hlgroup (必須) | ハイライトのグループ名.このグループ名でハイライトの定義がされる. |
hlgroup_link | ハイライトのリンクを設定したければここで設定できる.もちろん手動もOK |
tagkinds (必須) | hlgroup に関連付けられるタグのkindの情報.詳しくはctags --list-kinds とすれば各言語で対応しているものが見れる.(複数指定の場合はfm のように繋げて入力すれば良い) |
syntax_type | keyword (デフォルト)もしくはmatch を入力.詳しくは,:h syn_keyword もしくは:h syn_match で. |
syntax_prefix | syntax_type でmatch を選択している場合のみ有効. |
syntax_suffix | syntax_type でmatch を選択している場合のみ有効. |
上記のsyntax_prefix
,syntax_suffix
は,ハイライト精度を上げるのに最も重要です.例えばpythonの例を見れば,関数のハイライトにはsyntax_suffix
として(\@=
を指定しています.これは例えば,タグ情報でinfo
という関数があった場合に,info
という文字全てにハイライトしてしまうと,変数宣言した場合のinfo
もハイライトされてしまうためです.(\@=
を設定しておくことで,info
の後に(
が入力されて初めてinfo
がハイライトされます.似たような理由で,pythonのメソッドには\.\@<=
をsyntax_prefix
として設定しています.これは先の例で言えば,.info
とドットをつけなければハイライトされないという意味です.
現在の対応言語
以上のような設定をデフォルトでは以下の言語で既に行なっています(xolox/vim-easytagsのほぼパクリ).
- Lua
- C
- C++
- PHP
- Python
- Java
- C#
- Ruby
- Perl
- Julia
全てをチェックした訳ではないので,おかしな点があれば言って頂ければと思います.