vim tricks 1

こんにちは、エリックです。去年9月入社してから初のブログでどうしようかと悩んでて、text editorの話はどうかなと。 もう██年も使ってたvimって、基礎過ぎない?って思ったけど、同僚の入力とか、ウェブの動画やセミナー見ると、「やっぱこの技あまり知られてないな〜」って思っちゃったことは少なくない。 では、5つのvim技をお伝えさせて頂きます。

1. :x

最初に習うコマンドの中には、保存と終了する時に:wqだね?vimtutorにもそう書いてあるけど、怠け者のプログラマーは「2文字が多すぎ、1つで良い」だね? だからその時にwrite + quitよりexitが速い。変更がなければ保存しない(する理由もない)から更に速い!

2. vimdiff

diffで比べるファイルがあまりにも変更が多いと、diffの出力が長くて、見づらくなる。その時にvimdiffで! 左右に表示され、変更のあるところがハイライトされて明らかに見える。 後、全く同じところは自動的に非表示にされます(ここには時間ないけど、折畳という魔法の技の詳しくは:h foldingで調べるべし!)

3. motion keys

ノーマルモードでhjklでのカーソル移動は基礎だけど、vimtutorでwewordとendも言葉一つ一つ移行出来ることが教わる(まあ、普段スペースで分けてる’word’だから日本語がちょっと違う:ひらがな・カタカナ・漢字の間が「ワード」の区切れになる)。

  • b / w 言葉(word)で後方・前方に移動(keywordみたいに区切られる)
  • B / W 言葉(WORD)で後方・前方に移動(非空白文字で区切られる)
  • ( / ) 文で後方・前方に移動(/[.!?]\s+/で区切られるから「。」が残念ながら対象外)
  • { / } 段落で後方・前方に移動(空行で区切られる)
  • 0 / ^ / $ その行の最初の文字・最初の非空白文字・最後の文字に
  • gg / G ファイルの最初・最後に移動

たまにまだlllllllとか打ってる方を見かけてるから、[count]カウントって知らない?と思っちゃう。lllll5ljjjjjjjj8jで打ち続けなくて済むし、50%とかでファイルの真ん中へ飛ぶことも可能。 もっと知りたい方は:h motionでどうぞ!

4. :set paste

Webからコピペすると、たまにインデントされたコードが自動的にインデントされ過ぎて段々右へ行き続く。

if (foo) {
  bar();
  } else {
      baz();
        hoge(moge);
          # this is getting out of hand
          }

その時にuでundoと:set pasteを設定して再びペースト:

if (foo) {
  bar();
} else { 
  baz();
  hoge(moge);
  # much better
}

終わったら:set nopasteで、自動インデントが元に戻す。

5. statusline

ず〜っと前に作った~/.vimrcで、以下を入れた:

set laststatus=2     " always show filename/status bar
set statusline=%<%f%h%m%r%=%b\ 0x%B\ \ %l,%c%V\ %P

それで、今編集してるファイルでこんなの見える: eric/2020-04-15-vim_tricks.md[+]            20197 0x4EE5 70,44-33 96%

ファイル名はもちろん、[+]で変更ありって分かる、最後に行と列、ファイルのポジションも書いてあり便利です。 列の44-33っていうのは、日本語があるマルチバイト列の44バイト目と画面上の33列目。 でも、20197 0x4EE5のとこって何なんだろうね?

そう、「以」の文字コード。カーソル下の文字コードがいつも表示されると、スペースとタブどれか分かりやすくなり、例えばoption-spaceでノーブレークスペースを打ち間違えたら、すぐに分かるように。“Smart Quotes”という、ASCII以外の引用符もプログラムに入れるとエラーになっちゃうから、それも見えて助かる。ターミナルでかいなら、他の入れるものが一杯あるんで:h statuslineで検討しよう。

ではでは、vimの技一杯あるけど、今回はこれで。いつでも:hでdoc読みまくって、新しい技を習うのお勧めしますよ〜(vim 4?の時ぐらいにマニュアルを印刷してソファでも読んだりしたw)。 次回まで、みんなのvim力をLEVEL UPしようぜ!

〜終〜