Vim'deki ayrıntı düzeyini nasıl geri alabilirim?


11

Bir noktada Vim'im vurduğumda tüm kelimeyi geri alacaktı u.

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

İle sonuçlanır

typing some

Ancak, geri alma ayrıntı düzeyi bir seferde bir harfi silmeye dönüşmüştür.

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

Sonuçları

typing some word

Pratik Vim'de geri alma ayrıntı düzeyini özelleştirme hakkında bir şey okuduğumu hatırlıyorum, ancak nasıl kontrol edileceğini hatırlayamıyorum. Herhangi bir yardım takdir!


2
Muhtemelen vimrc'nizde bunu yapan bir şey vardır. Kopyalayamıyorum ve :helpdosyalarda hiçbir şey bulamıyorum ... Bkz: vimrc dosyamda nasıl hata ayıklayabilirim? ... Ayrıca, <C-c>ekleme modundan çıkmak için kullanmanın yan etkileri olabilir (buna bakın ) ve sorunun bir parçası olabilir ... Kullanmayı öneririm Escveya <C-[>(buna bakın )
Martin Tournoij

Yanıtlar:


11

Geri alma dizisini manuel olarak kırma

Geri alma sırasını Ekle modunda manuel olarak kırabilirsiniz <C-G>u. Gönderen yardımı :

CTRL-G u        break undo sequence, start new change

Misal

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

Bu size metin bırakacaktır

Hello

Komutların dökümü

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

Otomatik çözüm

İnce taneli geri alma seviyesi kontrolü

Metni silmeye başladığınızda ve ayrıca bir silme işleminden sonra tekrar metin girmeye başladığınızda geri alma sonları oluşturmak için kullanılan küçük bir VimScript snippet'i<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>")

notlar

Bu <BS>, <C-W>(bir kelimeyi silme) ve <C-U>(satır başına kadar silme) için çalışır. Ekle modunda silmenin daha fazla yolu varsa inoremap, sonuna ek aramalar eklenerek bunlar desteklenebilir .


4
Tek sorun, daha sonra geri alacağınızı öngörmemenizdir (aksi takdirde ilk etapta yapmayacaksınız). Genellikle bir durumla sona Yani isteyen sen kullanmıştı <C-G>uzaten çok geç.
Shahbaz

4
Evet. Aslında kendimi özlediğim bir şey bu. Bazen iyazdıklarımın bir kısmını (hepsi ekleme modunda) kaldırmak için bunu uzun cümle ve ardından geri tuşu izlerim . Sonra farkına varmam gerektiğini fark ettim ve yazdığım şey iyiydi. Geri alırım, ancak eklenen tüm metin geri alınır. Bu yüzden ya uzun cümlenin hiçbiriyle kalmadım, ya da geri alınmayan kısım. Geri alınan kısmı geri almak imkansızdır. Vim'e geri alma sırasında geri alma dizisini kırmasını söylemenin bir yolu var mı? (Şimdi söylüyorum map, geri dönüş elbette bir seçenektir).
Shahbaz

2
Gelecekteki ziyaretçiler için, inoremap <CR> <C-G>u<CR>her bir geri almanın tek bir satırda yer almasını da ekledim (durmadan yazdığınız paragrafın tamamını geri almanıza gerek yok).
Shahbaz

1
@Shahbaz, kesinlikle :)
tommcdo

1
@Shahbaz "Kopyalama iznim var mı?" Sayfanın altındaki bağlantıya bakın: "cc by-sa 3.0 altında ilişkilendirme gerekli olan kullanıcı katkıları gerekli"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.