vim-users.jp

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