Vim
Vim2Day 10

今年作ったプラグイン、使って良かったプラグイン

Vim2 Advent Calendar 2017の10日目の記事です!
9日目は @misato8310 さんの Windowsでdein導入したい&&オレオレvimrcのお話 でした。私もそのうち.vimrc晒すとかやってみようかな…!

今回、私は『今年作ったプラグイン、使って良かったプラグイン』という内容でお送りさせて頂きます。

作ったプラグイン

まずは作ったプラグインをご紹介します。
今年は初めて自分でVimプラグインを作って公開までできました。

CCSpellCheck.vim

Github
https://github.com/kmszk/CCSpellCheck.vim

これはスペルチェックプラグインです。
いつもコードレビューでTypoを指摘されていた私が、脱Typoを目指すためだけに作ったプラグインで、キャメルケースを考慮したスペルチェックができます。

利用イメージ:CaseをCeseとtypoした場合
ccs.png

内部的にはVimの機能だけで作られているため、Vimの本来のspellチェックや修正を使うことができます。処理的にはファイル内のキャメルケースの単語を抜き出し、正規表現で単語毎に分けてVimのspellの機能でチェックする形になります。

とりあえず、自分はこれでTypoが無くなり、コードレビューで指摘されることも無くなりました。なければ自作することができるのがVimの良いところですね。

Vimでキャメルケースのスペルチェックをするプラグインを作った 〜 CCSpellCheck.vim 〜

カラースキーム

Vimconf2017のcocoponさんの発表に影響を受けて、Vimのカラースキームを作ってみました。(※ただ、どちらも言語毎の調整まではしていません。)

skyhawk

skyhawk_ss.png

Vimconf2017のcocoponさんの発表ではicebergは『氷山』がテーマでしたが、今回自作したskyhawkはおおよそ下記のようなイメージで作成しました。

skyhawk2.jpg
※ 使用色は、空の青系統色(Statement、Identifier、Operator、Typeなど)、機体の色(この写真では山吹色?)(String、Booleanなど)、差し色のオレンジ(Special,Keywordなど)と黄色(SpecialCharなど)…そして色が足りなくなったので、地上の緑のイメージの緑系統色(Function)など。

skyknight

skyknightはskyhawkをベースにもう少し色を減らし、スッキリとした印象です。
skyknight_ss.png

※イメージ
300px-EF-10B_VMCJ-1.jpg
スッキリとした配色のデザインと、差し色の赤が特徴的だったので使っています。

最近は自分でもよくskyknightを使っています。

使って良かったプラグイン

今年入れて、個人的に人に勧めたくなるほど良かったプラグインは…

  • fzf (junegunn/fzf.vim)
  • junegunn/vim-easy-align
  • w0rp/ale (以前はvim-syntastic/syntasticを使用)
  • Shougo/deoplete.nvim (以前はいろいろ試していたが、満足できないものが多く…)

辺りですね。

fzf

https://github.com/junegunn/fzf
https://github.com/junegunn/fzf.vim

自分はzsh側でfzfを使っていて、Vimで呼ぶようにしているのですが、fzfの製作者からプラグインも提供されていて、多分これを使ってもほぼ同じかと思います。

Vimだけではなくzshでもかなりお世話になっています。というわけで自分はVimとzshでの使い方の記事も書いています。
https://qiita.com/kmszk/items/aa9920f07487559c0c7e#vim%E3%81%A7%E4%BD%BF%E3%81%86

Vimで選択的インターフェースとなるとUniteやCtrl-pになるかと思うのですが、fzfはgolangで書かれているので実行スピードとしては申し分なく、大きめのプロジェクトでもガツガツ候補を上げてもらえます。

自分はVimでは、ファイル検索、MRUのファイル選択、バッファのファイル選択辺りでよく使っています。
大体やりたいことはfzfのGithubのvimのページにまとまっています。
https://github.com/junegunn/fzf/wiki/Examples-(vim)

あと先週、fzfをつかってtagを検索して記述箇所を開くようなものを作ってみました。

.vimrc
" 呼び出し元
let s:tags_file_full_path = '.tagファイルのパス'
call s:fzf_tag(s:tags_file_full_path)

" 呼び出し先
function! s:fzf_tag(fzf_tags_file_full_path)
    let s:fzf_tags_file_full_path = a:fzf_tags_file_full_path

    " https://stackoverflow.com/questions/11532157/unix-removing-duplicate-lines-without-sorting
    " sort -u の代わりに awk '!x[$0]++' を使うことで行毎の処理を維持
    " awk '!x[$1]++ {print $1}' は awk {'print $1'} | awk '!x[$0]++'と一緒 
    command! FZFTagList call fzf#run({
                \ 'source': "cat " . s:fzf_tags_file_full_path . " | awk '!x[$1]++ {print $1}' |  grep -v '^[!\(\=]'",
                \ 'sink': 'tag',
                \ 'down':    '40%'})
endfunction

自分はこの関数の呼び出し元はPlugで管理しているszw/vim-tagsの記述のところにある為、tagファイルのパスをそこから引数で渡しています。

唐突に現れたawk '!x[$1]++ {print $1}' の部分ですが、やりたいことはつまるところawk {'print $1'} | sort -uです。sort -uではすべて読み込んでからsortし、結果を出力するためボトルネックになっていたところを、stackoverflowの受け売りでawkに書き換えてみたところ!x[$1]++sort -u相当のことをすることで行毎の処理を維持することができたという感じです。

途中のgrep -v '^[!\(\=]とかで要らなさそうなやつを適当に消しているのが自分の中でまだ消化不良感があります。(なんか他にもでてきそう…)

(※ shell部分はそのままではwindowsでは動かないかと思いますのでご了承を…!)

junegunn/vim-easy-align

https://github.com/junegunn/vim-easy-align

これは変数に代入をまとめて書いているブロックの『=』をきれいに揃えたりするときによく使います。

自分は ga*=とか覚えなさそうなので、選択した範囲をスペースを打つだけで整うようにしていて、とりあえず自分はこれで満足です。

" 選んだ範囲で整える
xmap <Space> <Plug>(EasyAlign)*<Space>
xmap ,  <Plug>(EasyAlign)*,

w0rp/ale

https://github.com/w0rp/ale

自分の場合、業務がPHP使用なのですが、phpmdやらphpcdやら通常の言語のチェック+αを走らせる目的で入れたような気がします。とにかくカバーしている言語も多く、速度的にも満足できます。

自分はairlineは重く感じるのでitchyny/lightline.vimを使っているのですが、maximbaz/lightline-aleを使うことによってステータスライン上にもエラー件数を出していたりします。

maximbaz/lightline-ale
https://github.com/maximbaz/lightline-ale

Shougo/deoplete.nvim

https://github.com/Shougo/deoplete.nvim

自分はMacでVim8を使っています。
名前にnvimとなってますが、vim8なら最近使えるようになりました。

業務がPHP使用なので型が明示的ではなく(-> なのでコメントで補足したりするとIDEが読んでくれたりします)、今までいろいろな補完のプラグインを使いましたが、検索が始まって返ってこないものや、欲しい結果が得られない物が多い中、deopleteは今のところ一番良い結果が帰ってきます。

vim8で対応されたのが11月の初めのほうで、まだまだ使い始めたばかりなので引き続き使わせていただきます。

まとめ

作ったもの&使ったものということで、ちょっと記事が長くなってしまいましたが、来年はもう少しよいプラグインが作りたいという抱負で行きたいです。