人類はもっとvim本来の機能を使うべきだった

反省

自分は、vim本来の機能を使いこなす前にpluginの力に染まってしまった。 そのことを強く後悔している。デフォルトのmappingを潰し,vimrcをメタボ化させ... そういったvimmerが今後増えないように,今回はこのアドベントカレンダーを通して vim本来の素晴らしさを伝えたいと考えている. vim本来の機能に詳しくなることは,vimrcのダイエットにも繋がる.

はじめに

所属サークルにいるvimmerが使っていなさそうな機能に焦点を当てているので, 若干紹介している機能に偏りがある恐れがあります. vim本来の機能について網羅して知りたい人は,vim-helpを熟読しましょう.

あ,SLP KBIT アドベントカレンダー2015 12日目です

www.adventar.org

便利機能

  • <C-o> : 直近のジャンプポイントへジャンプする.

まずjumpのvim help を見てみよう. (vimmerググる前にvim helpを見るべし)

==============================================================================                                                                                
8. ジャンプ                                     jump-motions                                                                                                  
                                                                                                                                                              
「ジャンプ」とは次のコマンドのどれかを意味します: 新しいファイルの編集を始める                                                                                
コマンドと、"'", "`", "G", "/", "?","n", "N", "%", "(", ")", "[[", "]]",                                                                                      
"{","}", ":s", ":tag", "L", "M", "H" です。これらのコマンドのうちのどれかを                                                                                   
使ってカーソルを「ジャンプ」させた場合、ジャンプする前のカーソルの位置は覚えて                                                                                
おかれます。その位置を含む行を削除したり変更したりしていなければ、"''" と                                                                                     
"``" コマンドを使ってその位置に戻ることができます。

helpを見たとこで私が実際に使用するタイミングを紹介したいと思う. 例えば,javaソースコードvimで書いていたとしよう.その際,おそらく不要なimport文の削除や, import文の追加,package名の修正がしたい時が来るだろう.そのとき, gg でページトップに 行くとする.ggで1行目に移動したものの十中八九,その作業を終えたあとは,前の位置に戻りたいだろう. そこで <C-o> をタイプする.そうすると,前回編集した場所に移動することができる. jumpするポイントは :jumplist で確認することができる. jump地点の登録は,"'", "`", "G", "/", "?","n", "N", "%", "(", ")", "", "",
"{","}", ":s", ":tag", "L", "M", "H"を利用した時に登録される

とりあいず少し前の位置に戻りたいときは押して見る.使っていくうちにどこに飛ぶかがわかってくると思います. <C-o>も数字と組み合わせることができます. 3<C-o>だと,3つ前のジャンプポイントに移動します. vimマッピングは組み合わせの幅がとても広いので積極的に使っていきましょう.

  • gf : カーソル位置の文字列をパスとみなして,そのファイルを編集する

たとえば,C言語を編集していたとする.その時に自分で作成したヘッダファイルをインクルードするとする. そうした時,よくヘッダーファイルを編集したい時が出てくる.そういった時,このマッピングの出番だ.

#include "../path/to/hea■er.h"  

このとき,にgfをタイプすることで,ヘッダファイルに移動することができる. これは,ファイルだけではなく,URLにも適用できる. markdownにリンクを埋め込むとき,ちょっとサイトを確認したい時にも活用できるのでぜひ覚えておこう.

  • <C-^> : 直前のバッファに移動する

これは,gf と組み合わせると非常に強力です. gfして移動したファイルの先で,<C-^>をタイプすることで直前のバッファつまり移動前のファイルに移動することができます.

  | file A |   gf ----------->  | file B |
               <---------- <C-o>
  • オペレータ,テキストオブジェクト

vimの各種mappingは,オペレータとテキストオブジェクトの組み合わせで出来ています. オペレータ,テキストオブジェクトについて知らないサークル生も居るかもしれませんが, ひとまず一覧を見てみましょう.

オペレータ一覧 ※1

マッピング 動作
c 変更する
d 削除する
y yankする

※1 他にもたくさんのオペレータがありますが,ここでは多用するこの3つにしぼります.

マッピング 範囲
aw iw word
a( i( a) i ) () ※2
a" i" ""
a' i' ''

※2 括弧の種類を変更すると対応した括弧に

これらを組み合わせることで,直感的にテキストを編集することが出来ます. 例えば, ciw としましょう. 覚えかたは, change inner word です. ちなみに,cawだと単語の外側の空白を含めて削除します.

Normalモードで以下のカーソル位置でciwすると

i am a hogep■ge
i am a ■

となります.

vimにおける,オペレーターcは,削除してインサートモードに入るを指します. すなわち変更するということですね.

ciwfoobarと入力することで

i am a hogep■ge
i am a ■
i am a foobar

となることがわかります. ciw,ci" di" ci' di' yiw 当たりはほんとによく使うので覚えておいて損はないです.

ここからは,上級生もあんまり使ってなさそうな機能を紹介していきたいと思います.

  • QuickFix

まずは,helpを見てみる.

=============================================================================
1. QuickFixコマンドの使い方                     quickfix Quickfix E42

Vimには編集-コンパイル-編集のサイクルを加速するための特別なモードがある。これ
はAmigaのManx's Aztec C compilerのquickfixオプションにインスパイアされた。Cコ
ンパイラから出力されたエラーメッセージをファイルに保存し、Vimでそのエラーにジャ
ンプするというアイディアである。エラーメッセージを全部覚えておかなくても、それ
ぞれの問題を検証し、修正することができる。

QuickFixコマンドはより一般的に、ファイル中の位置のリストを作成し、ジャンプする
ために使うことができる。例えば、:vimgrepはパターンにマッチした位置をリストす
る。スクリプト中でgetqflist()を使ってこれらの位置を参照することができる。
そのため、編集・コンパイル・修正のサイクル以外にも多くの事に利用できる。

AmigaでManx's Aztec C compilerを使っているなら、Vimと連携させる方法について
quickfix-manxを見よ。別のコンパイラを使用するならば、エラーメッセージを一度
ファイルに保存してVimを "vim -q filename" で起動する。これをする簡単な方法の1
つはコマンド:makeである (後述)。各コンパイラからのエラーメッセージを解釈させ
るためには、オプション 'errorformat' をセットする (下のerrorformatを参照)。

QuickFixは,makeやgrepの出力をwindowに出すことができ,表示された行の上で, <Enter>をタイプすることで,該当ファイルの該当行にジャンプすることができるというものだ.

よくあるのが,vimを一旦閉じ,コマンドラインagしてその結果を目で見て, ファイルを一つ一つ開き,再度vimを開き :行数 で該当箇所に移動している例. これ,vimgrepQuickFixを使えば,vimを閉じずに高速で同じことが出来ますよ!

f:id:maxmellon:20151211032418g:plain

他にも,makeやコンパイルの結果をQuickFixに出力することも出来ます. エラー位置一覧が出るので,すぐに修正が可能です!(多分名前の由来はここから)

f:id:maxmellon:20151211033136g:plain

QuickFix-windowを自動的に使う場合には以下の設定を追加します.

augroup QuickFixCmd
  autocmd!
  autocmd QuickFixCmdPost *grep* cwindow
augroup END

ctags

==============================================================================
5. タグファイルの書式                           tags-file-format E431

                                                ctags jtags
tagsファイルは "ctags" のような外部コマンドによって生成される。それはそれぞれ
の関数へのタグを含んでいる。"ctags" のあるバージョンでは "#defined" マクロや
typedef、enumなどに対してもタグを作ることができる。

コマンドラインctags -R .でタグを作成することができ, vim内で<C-]>をタイプすることで定義元にジャンプすることが出来ます. tagsfileの生成を自動化するプラグインもありますが, まずはvimの機能のみの状態で使うことをおすすめします.

f:id:maxmellon:20151211034536g:plain

関数の定義元にジャンプしたいときは,とても多くかなり作業効率を上げます. ctagsを使うことによってIDEにも負けない大胆な移動が出来ます.

まとめ

  • vim本来の機能だけですごく高機能.
  • pluginをよく理解せずに導入するのは危険,よくない.
  • /*連打を 多用するのではなく,vimgrepを使おう.
  • うちのサークルには,QuickFixを使うvimmerがほとんど居ない.もったいない.
  • もっとhelp読もう

この記事では,一部を除いて移動に関する機能を中心に紹介を行いました. サークルメンバもjを連打して移動するvimmerではなくて,少ないタイプ数で効率よくエディットできる,vimmerを目指しましょう!

Let's Vim Life !!!!!

参考サイト

http://www.infiniteloop.co.jp/blog/2011/11/vim-operator/