Vimmerなら2013年中に試しておきたい海外産Vim plugin 8選

Vim

この記事はVim Advent Calendar 2013の15日目の記事です。
14日目はjoker1007さんによるwebapi-vimとBufWriteCmdでWeb上のリソースをVimで編集するでした。

本記事では、2013年中に試しておきた海外産Vim pluginを8個ご紹介します。

はじめに

なんで海外産限定なの?

理由は以下のとおりです。

  • 日本産のVim pluginは入れている人が多く日本語での情報も多い(vimrc読書会に参加した感覚として)
  • Vim Advent Calendar 2012が1年続いたこともあり、興味深い日本産Vim pluginが多すぎる…

海外でそこそこ流行っていても日本ではあまり知られていないVim pluginが多いのでもったいなーと思ったので、本記事を書こうと考えました。

ちなみに、今回ご紹介するのは今年私が見つけたVim pluginに限定しています。このため、海外産でも昔からある有名な plugin(surround.vimやsyntastic.vimなどなど)についてはご紹介していません。

なお、海外産Vim pluginは日本産と比較すると、以下のようにあまりお行儀のよろしくないVim pluginの比率が多いので、使うときには注意した方がいいです。
(今回ご紹介したもののなかではほとんどありませんが)

  • pluginディレクトリ配下にすべてのコードを配置していてる(plugin配下は起動時に読み込まれるため起動が遅くなる)
  • デフォルトキーマッピングを無効化出来ない
  • キーマッピングを変更できない

もちろん全部が全部ではないですし、日本産でも同じようなものもありますが、比較すると多いように感じます。

海外産Vim pluginはアイディアが面白いものも多いので、どんどん新しいpluginを試してみることをおすすめします。 使ってみて気になる所があればpull requestを送るか、最悪気に入らない所があればforkしてオレオレ魔改造版を作るのもありです。 (それでも足りなければオレオレpluginを1から…)

では、本編に移ります。

vim-startify

Vimの起動画面に、直近で開いたファイルや、ブックマークしたファイルなどをショートカットで開ける画面を表示するpluginです。

以下にスクリーンショットを載せます。

画像

本pluginをインストールしておくと、上記画像記載のように、Vimの起動画面に 最近使ったファイルなどのパスが表示されます。 該当ファイルの先頭の数字、アルファベットをタイプするか、該当ファイルに カーソルをあわせ<Enter>を押下すると、対応するファイルを開けます。

インストールするだけでも便利ですが、自分で表示するファイルをカスタマイズしたりもできます。

設定項目は色々あるので、詳細は:help startifyでhelpを見ていただきたいですが、便利な設定を3つほど載せておきます。 以下の様に用意されている変数で設定できます。

" startifyのヘッダー部分に表示する文字列を設定する(dateコマンドを実行して日付を設定している)
let g:startify_custom_header =
  \ map(split(system('date'), '\n'), '"   ". v:val') + ['','']
" デフォルトだと、最近使ったファイルの先頭は数字なので、使用するアルファベットを指定
let g:startify_custom_indices = ['f', 'g', 'h', 'r', 'i', 'o', 'b']
" よく使うファイルをブックマークとして登録しておく
let g:startify_bookmarks = [
  \ '~/.vimrc',
  \ '~/localrepos/blog/vac_20131215.md',
  \ ]

vim-multiple-cursors

Sublime Text の機能として有名な、multiple cursorsの機能をVimに移植したpluginです。

multiple cursorsの機能とは、操作対象の箇所を複数選択した状態で、視覚的に操作内容を 確認しながら一括操作できる機能です。

Vimは、操作対象の特定、操作、そして操作繰り返すということが容易なので、Vim的に常用して 便利かというと微妙なところですが、内容的に興味深いので載せました。

(久しぶりに使ってみたら変な挙動をしたので試される方はご注意ください)

(海外でも一時的に話題になっていたのでgithubでのstarが1900近くいっています。すごい)

ちなみに、Vimでのmultiple cursors実装は、これ以外も色々あるようです。

ただ、私は上記理由から使ってません。Vimmerなら検索、操作、.での繰り返し、 マクロ、:substituteコマンドなどを組合せて使ったほうが速い、ですよね?

複数箇所を視覚的に操作内容を確認しながら編集したいのであれば、 操作感、機能的には異なるものですが、manga_osyoさん作のover.vim を使った方が使い勝手が良いように思います。

over.vimは、昨年のVim Advent Calendar 2012でも ご本人が紹介されていたので、ここではブログ記事のご紹介までにします。

Vim の :substitute をプレビューするプラグインつくった

vim-expand-region

visual modeでの選択範囲を、さらに外側にあるtextobjectsに拡張して選択したり縮小して選択したりすることが出来るpluginです。

以下にスクリーンショットを載せます。

f:id:deris:20151120010343g:plain

上記スクリーンショットでは、初めはiw、続いてiW、ib、 il(textobj-lineインストール要)と 拡張して、その後、逆順で縮小しています。

拡張、縮小するときに考慮するtextobjectsは以下の様にvim-expand-regionのグローバル変数で変更することができます。

" デフォルトの設定
let g:expand_region_text_objects = {
  \ 'iw'  :0,
  \ 'iW'  :0,
  \ 'i"'  :0,
  \ 'i''' :0,
  \ 'i]'  :1,
  \ 'ib'  :1,
  \ 'iB'  :1,
  \ 'il'  :0,
  \ 'ip'  :0,
  \ 'ie'  :0,
  \ }

上記のようにtextobjectsをキーとした辞書をグローバル変数に設定します。

値は、0か1を指定します。textobjectsがネストする場合は1、しない場合は0を指定します。

ちなみに、il, ieは、標準Vimのtextobjectsではなく、Vim pluginで追加可能なtextobjectsです。ilはtextobj-line、ieはtextobj-entireどちらも便利なtextobjectsなので、試してみることをおすすめします。

また、上記グローバル変数名の後ろに_{filetype}をつけることによって、filetypeごとに設定を変えることができます。

" Rubyのときだけ有効な設定は以下の変数で設定できる
let g:expand_region_text_objects_ruby = {
  \ 'iw'  :0,
  \ 'iW'  :0,
  \ 'i"'  :0,
  \ 'i''' :0,
  \ 'i]'  :1,
  \ 'ib'  :1,
  \ 'iB'  :1,
  \ 'il'  :0,
  \ 'ip'  :0,
  \ 'ie'  :0,
  \ }

脱線(submode.vimを使って入力しやすく)

私はexpand-regionでデフォルトのキーマッピングである+、_は使用していません。 expand-regionを使う時は、大抵の場合、繰り返し拡張を行うため、マッピングするキーによっては 繰り返し入力するのが面倒になります。
私は拡張のキーマッピングを,eに設定しているのですが、単純にキーマッピングすると、 連続して拡張する際は,e,e,eと入力する必要があり、若干入力しづらいです。
また、縮小用に別でキーマッピングする必要があり、これを考慮するとあまりマッピングするキーは 増やしたくないため、拡張は,ee、縮小は,esなどとする必要があり、,ee,ee,eeと更に入力しづらくなります。

こういう、なにかの操作をやっている間に繰り返し入力する必要があるような場合は、 submode.vimを使うと便利です。

submode.vimをインストールして、 以下の設定をすると、,eでexpand-regionのモードに入り、以降はeで拡張、 sで縮小できます。

" expand-regionモードの設定。,eでモードに入り、eで拡張、sで縮小できる
call submode#enter_with('expand-region', 'nv', 'r', '<Leader>e', '<Plug>(expand_region_expand)')
call submode#map('expand-region', 'nv', 'r', 'e', '<Plug>(expand_region_expand)')
call submode#map('expand-region', 'nv', 'r', 's', '<Plug>(expand_region_shrink)')

スクリーンショットでもsubmode.vimを使っています。

,eeeeなどとできて便利です。

splitjoin.vim

1行のコードを文脈的に同じ意味の複数行のコードに相互変換するpluginです。

以下にスクリーンショットを載せます。

f:id:deris:20151120010337g:plain

スクリーンショットでは、Rubyの一行コードを複数行コードに変換しています。

本pluginはfiletypeによっていくつかの変換ルールが定義されています。

12/15(日)現時点では以下の言語の変換ルールが定義されています。

自分が望む言語の変換ルールがなければ、pull requestを送ってみてはいかがでしょうか?

linediff.vim

visual modeで2組の行を選択し、選択した2つのdiffをvimdiffで表示できます。

以下にスクリーンショットを載せます。

f:id:deris:20151120010326g:plain

比較したい行を、visual modeで選択した上で、:'<,'>Linediffコマンドを実行し、 さらに比較対象の行をvisual modeで選択した上で同様に、:'<,'>Linediffコマンド を実行すると、両者のdiffを新しくタブページを開き表示します。

デフォルトでは、新しくタブページを開き垂直分割で開きますが、以下の グローバル変数を変更することにより、好みによってカスタマイズすることもできます。

" 1つ目に選択した行をタブページで開く
let g:linediff_first_buffer_command = 'tabnew'
" 2つ目に選択した行を垂直分割して新しいウィンドウで開く
let g:linediff_second_buffer_command = 'rightbelow vertical new'

textobj-word-column.vim

同列にある単語を矩形選択で選択したりoperatorの対象として指定したりすることができるpluginです。

以下にスクリーンショットを載せます。

f:id:deris:20151120010345g:plain

例では同列にある単語をvicで選択した後、cで編集してます。同様にしてdicで削除したり、cicで編集したりすることができます。

同列の単語を一括して編集したいときにわざわざ<C-v>で矩形選択して調整しなくても、ざっくり選択できるので便利です。

ちなみに、本pluginは、最初に述べたあまり行儀の良くないpluginに属するため(pluginディレクトリ配下にすべてのコードを配置)、 気になる方は、これを解消したLindanさんのfork版を使うことも検討してもよいかもしれません。

ただ、Lindanさんのfork版は以下2点の外部インターフェースが異なるため、使うのであれば注意が必要です。

  • デフォルトのkey mappingがoriginal版と異なる。(original版が、ic,acなのに対し、Lindanさんのfork版は、iv,av)
  • kanaさん作のVim pluginである、textobj-userが必須となる。(多くの便利なtextobjectsが本pluginを必須としているためインストールしておくことをおすすめします)

switch.vim

文字列のトグルができます。

以下にスクリーンショットを載せます。

f:id:deris:20151120010340g:plain

例えば、trueという文字列上で、:Switchコマンドを実行することによりfalseという文字列に変更できます。 逆も同様です。

毎回コマンドを実行するのはめんどうなので、実際に使う際は直接コマンドを実行するの ではなく、以下の様に何かしらのキーにマッピングして使います。 (上記スクリーンショットでもマッピングしたキーで操作しています。)

" <Space>mに、switch.vimをマッピング
" nnoremap <Space>m  <Plug>(switch-next)
" 12/16 修正
nnoremap <Space>m  :<C-u>Switch<CR>

なお、toggle系のpluginは色々ありますが、本pluginは、 正規表現での設定によりかなり柔軟な設定ができることが特徴です。 また、グローバル変数の辞書で設定するのでカスタマイズも比較的容易です。

vim-signify

VCSの差分をsignで表示するpluginです。

以下にスクリーンショットを載せます。

f:id:deris:20151120010333g:plain

:SignifyToggleコマンドを実行すると、VCSの差分がVimのsignで 表示されます。 また、上記スクリーンショットの例では、次の差分、前の差分 への移動をマッピングしたキーで行っています。

差分の移動は以下の様にキーにマッピングしておくと便利です。 また、合わせて:SignifyToggleもマッピングしておくと便利でしょう。

" 次の差分箇所に移動
nmap <Leader>gj <Plug>(signify-next-hunk)zz
" 前の差分箇所に移動
nmap <Leader>gk <Plug>(signify-prev-hunk)zz
" 差分箇所をハイライト
nmap <Leader>gh <Plug>(signify-toggle-highlight)
" 差分表示をトグルする(:SignifyToggleコマンドと同じ)
nmap <Leader>gt <Plug>(signify-toggle)

おまけ

新しいVim pluginを発掘する方法

新しいVim pluginを発掘するには以下の様な方法があります。

皆さんも試してみてください。そして面白そうなpluginがあったら 是非Vim Advent Calendarに投稿してみてください。

ちなみに、上記の中では「vimrc読書会に参加する」 が特にお勧めです。

今回ご紹介したpluginの作者

今回ご紹介したpluginはよくよく見てみると、作者が同じ方のものが結構あります。

作者ごとにまとめてみました。

AndrewRadevさんのpluginが3つもありますねw 面白いpluginを書く方は、他にも面白いpluginを書いている可能性が高いので、 作者のリポジトリを眺めてみるのも良いかもしれません。

まとめ

以上が、2013年中に試しておきたい海外産Vim plugin 8選でした。

本記事で紹介する以外にも海外産Vim pluginはたくさんあるので、 興味があればいろいろ調べて見てはいかがでしょうか?

(そしてVim Advent Calendar 2013のネタとすると一石二鳥)

本題とはそれますが、Vimレベルが上がるのでvimrc読書会に参加することをおすすめします。毎週土曜日23時からやってます。

それではVim Advent Calendar 2013の15日目を終わります。

明日のVim Advent Calendar 2013はc0hamaさんです。