Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

NeoVimの非同期シンタックスハイライトプラグイン

$
0
0

Vimのシンタックスハイライト

Vimでは多くの言語がシンタックスハイライトがされますが,自身で定義した関数などはされません.でもやっぱりハイライトされた方が見やすいですよね.ということでシンタックスハイライト用のプラグインを作ってみました.

特徴

  • ctagsを利用している.
  • tagのデータの作成などはバックグラウンドで非同期で行われる.
  • (今のところ)コードがとっても短い(500行弱程度).
  • ctagsがサポートしている言語なら原理上どんな言語にでも使える.
  • プロジェクトのルートディレクトリを設定でき,開いているバッファで関連のあるものは全て自動でハイライトが更新される.

良い点ばかり挙げましたが,悪い点もあります.

  • ctagsで吐き出されるリストを使っているので,精度が完璧とは言えない.設定のカスタマイズ次第で向上は可能(後述).
  • Vimのsyntaxを乱用しているので,タグ情報が大量にある場合はVimのカーソル移動などが遅くなります.:set nocursorlineで改善された場合はこれが原因です.

Demo

demo.gif

ちょっとあまりいい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を用いている場合は,

vimrc
Plug 'KeitaNakamura/highlighter.nvim', {'do': ':UpdateRemotePlugins'}

とすればOKですが,他のプラグインマネージャを使っている場合は,インストール後:UpdateRemotePluginsをVim内で実行して下さい.

設定

自動更新

vimrc
" 0: 自動更新なし(デフォルト)" 1: 保存後自動更新" 2: ファイルを開いた時と保存後に自動更新letg:highlighter#auto_update =0

プロジェクトのルートディレクトリ

vimrc
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_typekeyword(デフォルト)もしくはmatchを入力.詳しくは,:h syn_keywordもしくは:h syn_matchで.
syntax_prefixsyntax_typematchを選択している場合のみ有効.
syntax_suffixsyntax_typematchを選択している場合のみ有効.

上記のsyntax_prefixsyntax_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

全てをチェックした訳ではないので,おかしな点があれば言って頂ければと思います.

参考にさせて頂いたもの


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>