Memecah urutan undo secara manual
Anda dapat memecahkan urutan undo secara manual dalam mode Insert with <C-G>u
. Dari bantuan :
CTRL-G u break undo sequence, start new change
Contoh
iHello<C-G>u world!<Esc>u
Ini akan meninggalkan Anda dengan teks
Hello
Kerusakan perintah
i " Enter Insert mode
Hello " Type 'Hello'
<C-G>u " Break the undo sequence
world! " Type ' world!'
<Esc> " Return to Normal mode
u " Undo
Solusi otomatis
Kontrol undo-level berbutir halus
Berikut ini adalah potongan kecil VimScript yang digunakan <C-G>u
untuk membuat jeda ketika Anda mulai menghapus teks, dan juga ketika Anda mulai memasukkan teks lagi setelah penghapusan.
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>")
Catatan
Ini akan berfungsi untuk <BS>
, <C-W>
(menghapus kata), dan <C-U>
(hapus ke awal baris). Jika ada lebih banyak cara untuk menghapus dalam mode Sisipkan, mereka dapat didukung dengan menambahkan inoremap
panggilan tambahan di akhir.
:help
file tentang itu ... Lihat: Bagaimana cara saya debug file vimrc saya? ... Juga, menggunakan<C-c>
untuk keluar dari mode penyisipan mungkin memiliki efek samping ( lihat ini ) dan mungkin menjadi bagian dari masalah ... Saya akan menyarankan menggunakanEsc
atau<C-[>
( lihat ini )