Hack #187: Vimのインサートモードをより安全にする
Posted at 2010/12/07ツイート
たとえば、Vimでインサートモードに移り、テキストを入力します。
そしてインサートモードを抜けます。
間違った部分があったのでu
を押します。
するとVimはインサートモード中に入力した全てのテキストを削除してしまいます。
これはインサートモードで入力した文字はまとめてundoされるというVimの仕様で、
Emacsではundoした場合20文字ごとにテキストが削除されます。
なんとかできないでしょうか?
解決
以下のコードをvimrcに貼り付けます。
するとEmacsと同じく20文字ごとに文字が削除されます。
(<C-g>u
というコマンドを使っています。詳しくは:help i_CTRL-g_u
を参照してください)
function! s:is_changed() "{{{
try
" When no `b:vimrc_changedtick` variable
" (first time), not changed.
return exists('b:vimrc_changedtick')
\ && b:vimrc_changedtick < b:changedtick
finally
let b:vimrc_changedtick = b:changedtick
endtry
endfunction "}}}
autocmd vimrc CursorMovedI * if s:is_changed() | doautocmd User changed-text | endif
let s:current_changed_times = 0
let s:max_changed_times = 20
function! s:changed_text() "{{{
if s:current_changed_times >= s:max_changed_times - 1
call feedkeys("\<C-g>u", 'n')
let s:current_changed_times = 0
else
let s:current_changed_times += 1
endif
endfunction "}}}
autocmd vimrc User changed-text call s:changed_text()
Vimではモードがあり、dやv、テキストオブジェクトを組み合わせた 高い編集能力があるのであまり問題とされていないのでしょう。 EmacsはVimで言えばインサートモードしか存在しないので、 undoした場合どこまで削除すればいいのか明確な基準がなかったために20文字としたのでしょう。
tyruもどる
blog comments powered by Disqus