ぼくのかんがえたさいしょうのvimrc

この記事はVim Advent Calendar 2013の171日目の記事です。
170日目はmanga_osyoさんによるvim-operator-alignta つくったでした。

本記事では、ぼくのかんがえたさいしょうのvimrcを紹介します。

はじめに

さいしょうのvimrcとは?

何か中二病っぽいタイトルですが、わりとまじめに考えて作ったものです。

タイトルをパッと見て、「最小?最強のタイポじゃないの?」 と思われた方もいるかもしれません。 しかし、最強のvimrcではありません。 最小 のvimrcです。

私がここで言っている最小のvimrcとは以下のような意味です。

Vim pluginを入れず、必要最小限の設定だけをまとめたvimrc

Vim pluginを入れずというのがミソです。 また、ここで言っている最小限の設定とは、(個人的に)どうしても 必要なオプション設定とキーマッピングなどのことです。

さいしょうのvimrc作った理由

仕事上テスト機などの共用で使うようなマシンで、 ちょっと設定ファイルなどを編集したい場合に、 勝手にVimプラグインを入れづらかったり、 わざわざVimプラグインをいれるまでもなかったりする場合があります。

こういう時、私は今まで特に設定なしでVimを使っていたのですが、 バリバリカスタマイズした自分のvimrcに慣れきっていると、 操作が微妙にぎこちなくなります。 (もちろん操作できないということはないですが。。。)

かと言って、いつも使っているvimrcをそのまま入れると プラグインの設定がたくさんあるため、大量のエラーで まともに動きません。

このような背景があり、カスタマイズバリバリのvimrcとは別に ちょっとしたvimrc、つまり自分にとって最小限の設定を記載した vimrcを書くことにしました。 小さいvimrcであれば、さっとコピーしてさっと使うことが でき便利です。

さいしょうのvimrc

ぼくのかんがえたさいしょうのvimrcは、 .minimal_vimrcにおいてます。

今後変更するかもしれないので現時点(2014/5/21)での最新にリンクしています。

中身について簡単にざっとご紹介します。

なお、下記設定は全部を自分で考えたものではなく どなたかのvimrcを真似させていただいたものもあります。 どれがどなたの設定か覚えていないのですが、 この場を借りて御礼申し上げます。

syntax enable

構文ハイライトを有効にしています。 これでファイルタイプ別に色付けされるようになります。

set number
set ruler
set list
set listchars=tab:>-,trail:-,nbsp:%,extends:>,precedes:<,eol:<
set incsearch
set hlsearch
set nowrap
set showmatch
set whichwrap=h,l
set nowrapscan
set ignorecase
set smartcase
set hidden
set history=2000
set autoindent
set expandtab
set tabstop=2
set shiftwidth=2
set helplang=en

オプション設定は完全に好みなので、細かく説明はしません。
個人的には、行番号表示(number)や、検索周り(incsearch,hlsearch,ignorecase)、 行頭/行末でのカーソル移動(whichwrap)、隠れバッファ(hidden) あたりは、設定しておかないと操作しづらいです。

colorscheme desert

背景色黒ベースのカラースキーマが好きなのでdesertに設定しています。

nnoremap <Space>w  :<C-u>w<CR>
nnoremap <Space>q  :<C-u>q<CR>
nnoremap <Space>Q  :<C-u>q!<CR>

ファイル保存、ウィンドウクローズをキーにマッピングしてます。 タイプ数はそんなに変わらないと思われるかもしれませんが、 <Enter>を押さなくていい分、手軽にタイプ出来ますし、 :w[<Enter>などのタイポなども気にしなくてよくなります。
<Space>も非常にタイプしやすくプレフィクスキーにお勧めです。

nnoremap ;  :
nnoremap :  ;
vnoremap ;  :
vnoremap :  ;

よく使うコマンドラインモードに入るための:と、 よりタイプしやすい;を入れ替えています。
特にASCII配列キーボードだと、:はタイプ しづらいので、個人的に必須です。

nnoremap <Space>h  ^
nnoremap <Space>l  $

行頭/行末移動のキーを、マッピングしています。
タイプ数が多くなって押しづらくなってるじゃないかと 思わるかもしれませんが、デフォルトの^$は、 <Shift>と一緒にホームポジションから遠いキーを押す必要があるため、 押しづらく小指が疲弊してしまいます。
マッピングしている<Space>h<Space>lは片手でタイプ できてお勧めです。
<Space>は押しやすいので、Vimでキーをマッピングする際、 <Space>をプレフィクスキーとして使うと便利です。

nnoremap k   gk
nnoremap j   gj
vnoremap k   gk
vnoremap j   gj
nnoremap gk  k
nnoremap gj  j
vnoremap gk  k
vnoremap gj  j

表示行移動であるgjgkと、実際の行移動であるjkを 入れ替えています。
set wrapの設定をして、1行が表示上ラップしている場合に、 gjgkは、表示上の行での移動なのでjkより 便利なときがあるため入れ替えています。

nnoremap <Space>/  *<C-o>
nnoremap g<Space>/ g*<C-o>

*は、カーソル位置の単語で前方検索します。 これは非常に便利なコマンドで、よく使うのですが、 *はASCII配列キーボードだと、<Shift>を押しながら ホームポジションから遠いキーをタイプする必要があるので ちょっと押しづらいです。
そこで、<Space>/マッピングしています。 片手でタイプできてお勧めです。

g*は、*と違い、単語の一部にもマッチします。 こちらも同様にマッピングしています。

nnoremap <expr> n <SID>search_forward_p() ? 'nzv' : 'Nzv'
nnoremap <expr> N <SID>search_forward_p() ? 'Nzv' : 'nzv'
vnoremap <expr> n <SID>search_forward_p() ? 'nzv' : 'Nzv'
vnoremap <expr> N <SID>search_forward_p() ? 'Nzv' : 'nzv'

function! s:search_forward_p()
  return exists('v:searchforward') ? v:searchforward : 1
endfunction

nNは、最後の/?を繰り返します。

/で検索した場合と、?で検索した場合で、 nNで移動する方向が異なるのが不便でした。 このため、/?のどちらで検索した場合でも、nで前方検索 Nで後方検索するよう設定しています。

nnoremap <Space>o  :<C-u>for i in range(v:count1) \| call append(line('.'), '') \| endfor<CR>
nnoremap <Space>O  :<C-u>for i in range(v:count1) \| call append(line('.')-1, '') \| endfor<CR>

インサートモードに入らずに、カーソル行の下もしくは上に空行を挿入します。 countにも対応しているので、10<Space>oで10行挿入できます。

空行を挿入する+αも参考ください。

nnoremap <silent> tt  :<C-u>tabe<CR>
nnoremap <C-p>  gT
nnoremap <C-n>  gt

タブ関連のキーマッピングです。

私はタブを多用するので、新規タブの作成をタイプしやすいttに割り当てています。

また、タブ移動は、複数タブを確認しながら移動する場合に、 gtgtgtgtとタイプするするのがタイプしづらかったため <C-p><C-n>マッピングしています。

nnoremap <silent> <Esc><Esc> :<C-u>nohlsearch<CR>

set hlsearchで、検索時にマッチするテキストが強調表示されます。 検索テキストの強調表示は便利なのですが、検索が終わった後は 強調表示をオフにしたいので、nohlsearchコマンドを使います。

nohlsearchコマンドはちょいちょい使うため、<Esc><Esc>マッピングしています。

nnoremap ZZ <Nop>
nnoremap ZQ <Nop>

nnoremap Q gq

危険なキーを無効 or 別のキーにマッピングしています。

ZZZQはそれぞれ、「ファイルを保存して終了」、 「ファイルを保存せずに終了」です。

タイプしやすくて便利だったりするのですが、あまりに タイプしやすく、ZZをタイプするつもりが誤ってZQを タイプして悲しい気持ちになることが多々あります。 そのため、使わないよう空マップ<Nop>に指定してます。

また、QはExモードに切り替えます。 通常の使用でExモードを使うことはほとんどないため テキストを整形するgqマッピングしています。

onoremap aa  a>
onoremap ia  i>
onoremap ar  a]
onoremap ir  i]
onoremap ad  a"
onoremap id  i"

テキストオブジェクトで、i)i}などは、 ibiBに割り当てられていて、i)i}とタイプするのと 比較してタイプしやすいのですが、 i>i]i"はそのまま記号をタイプする必要があり 押しづらいため、上記のようにマッピングしています。

このキーマッピングの副作用として、上記テキストオブジェクト は、ASCII配列キーボードでもJIS配列キーボードでも同じキーで 操作する事ができるようになります。

inoremap jk  <Esc>

ノーマルモードに戻るための<Esc>はタイプしづらいので、 jkマッピングしています。 jkであれば、編集でjkを入力することはほとんどないですし、 誤ってノーマルモードでタイプしても上下移動するだけですみます。 何よりホームポジションを移動せずにタイプできるので 非常にタイプしやすいです。

このキーマッピングは人を選ぶと思います。

nnoremap gs  :<C-u>%s///g<Left><Left><Left>
vnoremap gs  :s///g<Left><Left><Left>

置換コマンドは多用するのですが、いちいちタイプするのが 面倒なので、gsキーにマッピングしています。
これで、gsとタイプすることで、即座に置換する文字列 の入力に移れます。

cnoremap <C-f>  <Right>
cnoremap <C-b>  <Left>
cnoremap <C-a>  <C-b>
cnoremap <C-e>  <C-e>
cnoremap <C-u> <C-e><C-u>
cnoremap <C-v> <C-f>a

コマンドラインモードでの移動をEmacsライクなキーに設定しています。

まとめ

以上が、ぼくのかんがえたさいしょうのvimrcのご紹介でした。
皆さんも、自分だけの「ぼくのかんがえたさいしょうのvimrc」を作ってみてはいかがでしょうか?

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

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

momonga.vim#2.2に参加しました

2/1(土)に東京某所で開催されたmomonga.vim#2.2に参加したので、感想レポートをば

昼食

LingrGitHub Issuesにラーメン画像が貼り付けられたおかげでthincaさんのラーメン欲がリミットブレイクし、ラーメンを食べに行くことになりました。

魚介系のつけ麺で、濃厚で美味しゅうございました。

f:id:deris:20140201130152j:plain

もくもく会

以下簡単にもくもく会の成果をば

やったことは以下2点

  1. 最近作ったVim plugin、textobj-ipmacのdocを作成
  2. 汎用ログハイライトVim pluginの作成に着手(未完成)

textobj-ipmacのdocを作成

VACのネタにしたいので詳細は省きますが、最近作ったIPアドレスMACアドレスVimのテキストオブジェクトで扱うためのVim pluginのdocを書いてリポジトリへの pushまで行いました。

毎度思いますが、ドキュメント書くの大変ですね。

(英語力の無さに凹む…)

汎用ログハイライトVim pluginの作成に着手(未完成)

前日に思いついた汎用ログハイライトVim pluginの作成に着手しました。

syntaxや、highlight周りがよくわかっておらず、trial & errorで 頑張りましたが結局完成させることはできませんでした。

進捗…(乂'ω')スッ…

雑多な感想

  • puyo.vimを触ってたところバグを見つけたので、その場でrbtnnさんに報告したところものの数分で修正されました
  • C++のauto変数の実際の型を参照できるVim pluginをLindanさんが作ってて、スゲーとなった
  • thincaさんがその場で話題にしていたVim scriptネタをその場でVACをものの数分で記事にしてました
  • momongaさんが作ってたVim pluginそのうちVACで紹介されるらしいので楽しみ
  • 泊まりで参加できなくて残念だった。それにしても私以外みんな泊まりってスゴイw

終わりに

第1回から参加しているmomonga.vimですが、参加された方から刺激を受けてとても良い時間を過ごすことができました。 次回も参加できれば参加したいです。

主催のsupermomongaさん、参加者の皆さん、ありがとうございました。

また、momonga.vimもしくはxxx.vimでお会いしましょう。

Happy Vim Life!

Vimのタブで開いているバッファのdiffを簡単に表示するpluginを書いた

Vim

この記事はVim Advent Calendar 2013の57日目の記事です。
56日目はmanga_osyoさんによる:substitute をプレビューする over.vim にスクロール機能を実装したでした。

本記事では、Vimのタブで開いているバッファのdiffを簡単に表示するpluginを書いたのでご紹介します。

※ちなみに本日1/26は、私derisの誕生日だったりします。いわゆる誕生日VACです。わーい、めでたいですね(棒

vim-diffbuf

vim-diffbufはタブで 開いているバッファ同士のdiffをとるのが面倒で作ったpluginです。
(同一タブ内で開いていればwindo diffthisで一発なんですけどね…)

diffの対象にしたい1つ目のバッファをカレントバッファとした状態でDiffBufコマンドを 実行し、diff対象にしたいもう1つのバッファでも同様にDiffBufコマンドを実行すると、 新規タブ上で垂直分割した2つのdiff対象のバッファのdiffを開きます。

実際の動作は以下のGIFアニメを見てください。

screenshot

上記GIFアニメの例では、別タブで2つの無名バッファが開かれており、 それぞれのバッファをカレントバッファとした状態でDiffBufコマンドを 実行することで2つのバッファのdiffを新規タブで開いています。

vim-diffbufでは、1つ目のdiff対象でDiffBufコマンドを実行すると 内部で、diff対象を保存します。2つめのdiffでDiffBufコマンドを 実行した時に、2つのdiffを表示します。この際内部で保存したdiff対象 はクリアするため、再度、DiffBufコマンドを実行することで、別の diff対象同士のdiffをとることが可能です。

future work

まだ作りたてなので、インターフェースは、引数なしのDiffBufコマンド (と同様の関数diffbuf#diffbuf)のみと非常に単純なpluginです。 また、diffを開く際も、新規タブ&垂直分割と固定です。 そのうち機能拡張しようと思いますが、とりあえず使いながら使いづらいところを 拡張していこうと思っています。

今のところ思いつくのは以下のような拡張です。

  • バッファ番号指定のdiff
  • 開くウィンドウの指定(新規タブか既存タブか、垂直分割か水平分割か)

もし、要望があればフィードバックしていだけるとうれしいです。

まとめ

以上が、Vimで既存バッファをvimdiffしたいときに便利なpluginについてのご紹介でした。

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

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

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

rengbang.vimにフォーマット指定とコマンドライン確認版コマンドを追加しました

Vim

rengbang.vimにフォーマット指定とコマンドライン確認版コマンドを追加したのでご紹介します。

はじめに

rengbang.vimは、Vimで連番を入力するためのVim pluginです。

以下のブログでご紹介しています。

Vimで連番を入力するためのVim pluginを作った

連番入力時のフォーマットを指定可能に

rengbang.vimで連番入力する際、001.,002.のような連番を入力したい時がちょくちょくあって、 Lingrでもthincaさんからご要望いただいたので追加しました。

以下にようにRengBangコマンドの第5引数に%03d.\ と指定することで、 001.のような連番入力が可能です。

" フォーマットに%03d\ と指定することで001., 002. のように連番入力できます。
:RengBang \(\d\+\)  0  1  0  %03d.\ 

RengBang10

なお、内部でprintf関数を使っているので、フォーマットはprintf関数の フォーマットで指定する必要があります。

printf関数のフォーマットが使えるので、例えば16進数で連番入力したい場合は 以下のようにすることも出来ます。

" フォーマットに%04Xと指定することで16進数で連番入力できます。
:RengBang \(\d\+\)  0  1  0  %04X.

RengBang16

コマンドラインでパラメータを指定できるコマンド追加

以前からRengBangコマンドの引数が多く、入力しづらくてどうにかしたいと 思っていました。

上記フォーマット指定追加により、引数が5個になり、フォーマットを指定するためには、 (他の引数の指定が不要でも)第4引数まで指定が必須で入力しづらく、これはもう駄目だと思い、 別インターフェース(RengBangConfirm)を用意することにしました。

RengBangConfirmコマンドは引数を指定せずに実行するコマンドで、 実行するとコマンドラインでパラメータの入力を確認します。 この際、デフォルト値が入力されている状態で確認するため、 変更の必要がなければそのまま<Enter>を押すだけですむため、 RengBangよりも入力が楽です。

以下のgifアニメのように動作します。

RengBangConfirm

フォーマットだけ変更したい場合は、4回<Enter>をタイプ してフォーマットだけ変更して実行できます。

また、パターンだけ入力したい場合は、1つ目の確認でパターンを入力した後、 <Esc>をタイプすることで、その後のパラメータの確認をスキップ(デフォルト値使用) することもできます。

パラメータ確認の順番のカスタマイズ

RengBangConfirmの追加でパラメータの入力は大分楽になったのですが、 5番目に確認するフォーマットは、他のパラメータよりも使用頻度が高そうなので 確認順番をカスタマイズできるようにしました。

以下の様に変数に確認したい順番を指定することでカスタマイズ可能です。

" デフォルトのRengBangConfirmでの確認の順番の設定
let g:rengbang_default_confirm_sequence = [
  \ 'pattern',
  \ 'start',
  \ 'step',
  \ 'usefirst',
  \ 'format',
  \ ]
" 以下の様にRengBangConfirmでの確認の順番を配列で指定できます。(formatを3番目に変更)
let g:rengbang_default_confirm_sequence = [
  \ 'pattern',
  \ 'start',
  \ 'format',
  \ 'step',
  \ 'usefirst',
  \ ]
" デフォルト値から変更しないパラメータは省略することもできます。
let g:rengbang_default_confirm_sequence = [
  \ 'pattern',
  \ 'start',
  \ 'format',
  \ ]

.vimrcに書いておくことで常に指定した順番で確認するようになります。

上記2番目の設定をした上でのRengBangConfirmの動作は以下です。

RengBangConfirmCustom

一応補足しておくと、g:rengbang_default_confirm_sequenceでのカスタマイズ はRengBangConfirmコマンドの確認順番のみ変更します。 RengBangコマンドなどの他のコマンドの引数の順番を変えるわけではありません。 (少なくとも今のところは。要望があれば変更するかも)

終わりに

自分の作業用に作っているVim pluginですが、興味があれば試してみてください。

Happy Vim Life!

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.vimsyntastic.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、続いてiWibil(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をキーとした辞書をグローバル変数に設定します。

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

ちなみに、il, ieは、標準Vimのtextobjectsではなく、Vim pluginで追加可能なtextobjectsです。iltextobj-lineietextobj-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さんです。