Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

Vim 8.0 Advent Calendar 13 日目 undo を分割せずにカーソルを移動

$
0
0

この記事は Vim 8.0 Advent Calendarの 13 日目の記事です。

普段はあまり気にしないかもしれませんが、undo の単位は重要です。この undo について、新しい機能が追加されました。

挿入モードでの操作の分割

挿入モードでの操作中に、<Left>などでカーソル位置を動かすと、undo 情報や .でのリピートが壊れてしまいます。
例えば以下のキーマッピングがあった場合、

inoremap(()<Left>

挿入モードで foo(barと入力することで foo(bar)が入力できます。

入力: afoo(bar<Esc>
↓
foo(bar)

しかし、ここで uコマンドで undo を行うとfoo()となってしまいます。また、.コマンドでリピートを実行すると、barが挿入されます。

foo(bar)
↓
入力: u
↓
foo()
foo(bar)
↓
入力: j.
↓
foo(bar)
bar

これは <Left>により入力情報が途切れてしまうためです。つまり、<Left>を行った時点で、挿入モードを一旦抜けて入り直したのと同じことになります。

挿入モードでの <C-g>Uコマンド

この問題を避けるために、<C-g>Uコマンドが追加されました。これはカーソルを動かすコマンドの直前で使用します。
このコマンドを使うために、キーマッピングを以下のように書き換えます。

inoremap(()<C-g>U<Left>

最初の例と同様に foo(barを入力し、その後それぞれ uコマンドや .コマンドを実行すると、入力された foo(bar)全体が 1 つの入力として動作します。

foo(bar)
↓
入力: u
↓

foo(bar)
↓
入力: j.
↓
foo(bar)
foo(bar)

この <C-g>Uコマンドは、カーソルが行を跨がない移動をする場合のみ有効です。

<C-g>Uコマンドは便利ですが、手で入力するにはちょっと複雑です。今回の例のように、キーマッピングで使うとよいでしょう。


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>