Vimで元に戻す粒度を変更するにはどうすればよいですか?


11

ある時点で、Vimはを押すと単語全体を元に戻しuます。

[i]typing some words[C-c][u]

結果として

typing some

ただし、取り消しの細分性は、一度に1文字ずつ削除するように変更されたようです。

[i]typing some words[C-c][u]

結果

typing some word

Practical Vimで元に戻す粒度をカスタマイズすることについて何か読んだことを覚えていますが、それを制御する方法を思い出せません。助けてくれてありがとう!


2
これを行うvimrcに何かがある可能性があります。複製できず、:helpファイルに関する情報も見つかりません...参照:vimrcファイルをデバッグするにはどうすればよいですか?...また、<C-c>挿入モードを終了するためにを使用すると、副作用が発生する可能性があり(これを参照)、問題の一部になる可能性があります... Escまたは<C-[>これを参照)を使用することをお勧めします
Martin Tournoij

回答:


11

元に戻すシーケンスを手動で解除する

を使用すると、挿入モードで元に戻すシーケンスを手動で解除できます<C-G>uヘルプから:

CTRL-G u        break undo sequence, start new change

iHello<C-G>u world!<Esc>u

これでテキストが残ります

Hello

コマンドの内訳

i                           " Enter Insert mode
 Hello                      " Type 'Hello'
      <C-G>u                " Break the undo sequence
             world!         " Type ' world!'
                   <Esc>    " Return to Normal mode
                        u   " Undo

自動ソリューション

よりきめの細かいundoレベルの制御

以下は、テキストの削除を開始したとき、および削除後にテキストの再入力を開始したときに、元に戻すブレークを作成するために使用するVimScriptの小さなスニペットです<C-G>u

function! s:start_delete(key)
    let l:result = a:key
    if !s:deleting
        let l:result = "\<C-G>u".l:result
    endif
    let s:deleting = 1
    return l:result
endfunction

function! s:check_undo_break(char)
    if s:deleting
        let s:deleting = 0
        call feedkeys("\<BS>\<C-G>u".a:char, 'n')
    endif
endfunction

augroup smartundo
    autocmd!
    autocmd InsertEnter * let s:deleting = 0
    autocmd InsertCharPre * call s:check_undo_break(v:char)
augroup END

inoremap <expr> <BS> <SID>start_delete("\<BS>")
inoremap <expr> <C-W> <SID>start_delete("\<C-W>")
inoremap <expr> <C-U> <SID>start_delete("\<C-U>")

ノート

これは<BS><C-W>(単語の削除)、および<C-U>(行頭まで削除)で機能します。挿入モードで削除する方法が他にもある場合inoremapは、最後に追加の呼び出しを追加することでサポートできます。


4
問題は、後で元に戻すことを予測できないことです(そうしないと、最初から元に戻せません)。そのため、通常はを使用したかったのに<C-G>u、もう手遅れになります。
Shahbaz 2015年

4
はい。実際、私が自分で見逃していたのはこれです。時々私はこれを行い、iその後に長い文を書き、その後にバックスペースを続けて、私が書いたものの一部を削除します(すべて挿入モード)。それから、私はバックスペースを入れるべきではなく、私が書いたものは大丈夫であることに気づきました。元に戻しますが、挿入したテキスト全体が元に戻ります。ですから、私は長い文章がないか、バックスペースされていない部分が残っています。バックスペース部分を元に戻すことはできません。バックスペースで元に戻すシーケンスを解除するようにvimに指示する方法はありますか?(私が言うように、mapバックスペースを使用することはもちろんオプションです)。
Shahbaz

2
今後の訪問者のinoremap <CR> <C-G>u<CR>ために、各取り消しが1行に含まれるように追加しました(ノンストップで入力していた段落全体を取り消すことはありません)。
Shahbaz 2015年

1
@Shahbaz、絶対に:)
tommcdo 2015年

1
@Shahbaz「私はコピーを許可されていますか?」ページの下部にあるリンクを参照してください:「帰属表示が必要なcc by-sa 3.0でライセンスされたユーザー投稿」
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.