Vim Advent Calendarです
この記事はVim Advent Calendar 2013 : ATNDの 108 日目の記事になります。日付がおかしいとか細かいことは気にしてはいけません。Vim Advent CalendarはVim記事を書きたいという人がいるかぎり続きます。しかしいったい、いつまで続くんでしょう…気になります!
Vimに関することであれば基本的に何を書いてもよいはずなので、興味がある方は気軽に書いてみるとよいのではないでしょうか。
vim-submodeで x の挙動をカイゼンする
Lingrで発言したときに若干反応があったのでVAC Tipsとして簡単なものですが紹介します。
Vimデフォルトのx
はカーソル下の文字を消すという機能です。
x
の挙動のちょっとした不満点として1文字消すためだけにレジスタを汚してしまうというものがあり、それをカイゼンするためにnnoremap x "_x
を設定しているvimrcをたまに見かけます。
しかし、よくみるレジスタの問題の他にも不満点がありました。それはx
後のu
ndoの挙動です。
x
で1文字消すごとにundo履歴が区切られてしまい、いざx
を連打した後に間違っていると判明して、u
ndoしたい!と思っても、x
を押した分だけ何回も何回もu
を押さなくてはいけません。
連続したx
で一気に消した分は、1回のundoで戻せたら素敵じゃないでしょうか?
そんな機能を実現できる、かゆいところに手が届くプラグインがvim-submodeです。
コード
1 2 3 4 5 6 7 8 |
|
簡単に解説すると、最初にx
を押した時に"_x
でブラックホールレジスタに放り込んで1文字消すと同時にmy_x
というsubmode
に入るようにし、このmy_x
というsubmode
下でのx
は事前に定義した<Plug>(my-x)
を呼んで、undojoinを使用することによりundo履歴を1つにまとめています。
:undoj[oin] 以降の変更を直前の undo ブロックにつなげる。
欠点
x
連打してここまで消したい!というときに1〜2カラム分行きすぎてしまったなどといった場合、u
ndoすると初めから全部戻ってしまいます。一長一短ですね…
しかし、undo履歴が汚れ無いようになるし、結構気に入っています。ピンと来た方は使ってみてはいかがでしょうか?