読者です 読者をやめる 読者になる 読者になる

kick the base

好きな映画、音楽、マンガ、プログラム、デザイン、3DCG、ゲームのこと。

Vim: キーマッピング基礎2 - ヤンク設定、数の増減、行移動など

Vim

コピペではなく自分自身で.vimrcを育てていこうシリーズ第3回目、キーマッピングのお話の続きです。

前回までのお話

  • 最終的なキーマッピング
  • デフォルト状態でVimを起動する方法
  • Vimの環境
  • 表記方法
  • 記事の見解

などは毎回書いてもしょうがないので、キーマッピングの最初の記事をご参照ください。

Vim: キーマッピング基礎1

今回解説する部分のキーマッピング

nnoremap Y y$
nnoremap + <C-a>
nnoremap - <C-x>
cnoremap <C-p> <Up>
cnoremap <C-n> <Down>
nnoremap j gj
nnoremap k gk
nnoremap gj j
nnoremap gk k

Yキーで末尾までヤンクする

まず、各オペレーターの大文字入力時の挙動を再確認しましょう。

キーストローク バッファの内容
{start} We love Python.
D We lo
{start} We love Python.
C We lo|

このように、基本的に大文字のオペレーターはカーソル位置から末尾までに対してアクションを行います。dは削除でcは削除後挿入です)

しかし、Yはデフォルトの挙動が下記のとおりとなっています。

キーストローク バッファの内容
{start} We love Python.
Y We love Python.
p We love Python
We love Python

Yを実行後p(プット)をしてみると分かるように、Yは行全体のヤンクになっています。これはyyと同じ挙動なのでもったいないですね。せっかくなのでDCと同じくカーソル位置から末尾までをヤンクに変更します。これが下記コードになります。

nnoremap Y y$

これで、より直感的な挙動となりました。

数値のインクリメント・デクリメントを簡単に

Vimのデフォルトの挙動では、このようになっています。

キーストローク 意味
<C-a> インクリメント
<C-x> デクリメント

こちらに慣れている方は良いと思うのですが、ぼくはもっと直感的に、+-でインクリメント・デクリメントを行えるように設定しています。下記コードのとおりです。

nnoremap + <C-a>
nnoremap - <C-x>

+-はインパクトの強いキーストロークですので、好みによって他の機能を割り当てても良いでしょう。

<C-p>と<C-n>のカスタマイズ

元Emacsユーザーであるぼくは、<C-p>を<Up>に、<C-n>を<Down>に置き換えています。

cnoremap <C-p> <Up>
cnoremap <C-n> <Down>

論理行移動と表示行移動を入れ替える

デフォルトのVimの挙動では、jkは論理行移動*1となっており、gjgkに表示行移動が割り当てられています。

例としてこんな文章を用意しました。

お腹が痛いから今日は外に出たくない。でも家の中にこもっていると自分自身が家の一部になってしまいそうな気がして気が滅入ってくる。みんなお腹が痛いときはどうしてるんだろう?ああ、薬を取りに行かなきゃ...でも薬はどこの棚にしまっていたんだっけ。思い出せない。思い出せない。薬はどこにあるんだろう。もう何も思い出せない。ぼくが家の一部になってしまったからだろうか。

いつの間にか寝ていたようだ。少し朦朧としているが、腹痛は治ったらしい。それにしても今は何時なんだろう、窓の外を眺めて景色を見たいのだけれど、なぜか首が動かない。おかしい。

例文が不穏な雰囲気なのはさておいて、「長い1文」、「空行」、「短めの1文」という3行の文章です。実際にVimで操作したところを見てみましょう。

f:id:kickbase:20160930115448g:plain

テキストを編集する際、見た目の行移動(表示行移動)をする頻度の方が多いので、より簡単なキーストロークで表示行移動したいものです。なのでそれらを交換しておきましょう。

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

設定後のキーマッピングは下記の通りです。

キーストローク 意味
j カーソルを1行下へ(表示行移動)
k カーソルを1行上へ(表示行移動)
gj カーソルを1行下へ(論理行移動)
gk カーソルを1行上へ(論理行移動)

これで直感的な挙動になりました。*2

f:id:kickbase:20160930115447g:plain

まとめ

今回はYキーで末尾までヤンク、インクリメント・デクリメントの設定、<C-p>と<C-n>のカスタマイズ、論理行・表示行移動について説明しました。Vimとの長いおつきあいにおいて、地味に効いてくる設定かと思います。気に入ったら導入してみてください。

*1:ここで言う論理行とは改行が行われるまでを1行として扱うものです

*2:記事を読んでいるだけだと論理行と表示行の違いは分かりにくいかもしれません。ぜひご自分で試してください。