Vim'in "küçük silme" işlemlerini "1" kaydına da kaydedebilir miyim?


14

Son zamanlarda YankRing eklentisini kısmen makrolarla ilgili bazı sorunlara neden olduğu için kurulumumdan kaldırdım, ancak çoğunlukla Vim'in kayıtlarını kullanmak için kendimi eğitmenin daha iyi olacağına karar verdim - özellikle, silinen metnin başlangıçta kayıtta saklanma şekli "1ve daha sonra yukarıya kaydırılır "2, "3vb ayrıca silme yapılır olarak çok kullanışlıdır.

Bununla birlikte, bir silme / değişiklik birden fazla metin satırını kaldırdığında, bunun yerine "-küçük silme kaydında saklanır (bazı hareket komutları için birkaç istisna dışında). Sonraki küçük silme işlemleri yapılırsa, o metin parçası kaybolur.

Vim'in tüm silme işlemlerini kayıt altına alması mümkün müdür "1?

nnoremap d "1d Neredeyse çalışır, ancak kayıtları hem de metin ile sona "1 ve "2 .

Küçük silme kaydının işlevselliğinin etkilenip etkilenmediğini umursamıyorum. Küçük silmeleri adlandırılmış bir kayıt defterine kaydetmek için davranışımı değiştirmemi önermek kesinlikle yararlı bir cevap olmaz - şu anda yaptığım şey bu.

Yanıtlar:


10

Bu, eski Vim 7.3 sürümlerinde çalışırken :set clipboard=unnamed( burada bildirdiğim bir hata nedeniyle bu Reddit tartışmasına bakın) .

Bu iplik, Aryeh Leib Taurog tarafından bir 'regone'seçenek sunan bir yama içeriyor . Bu, (aşırı uzun) yapılacaklar listesine girdi, ancak yakında dahil edilmesi pek mümkün değil. Yani, şu anda yalnızca eski bir Vim'e geçme veya Vim'i bu yama ile kendiniz oluşturma seçeneğiniz vardır (ve vim_dev posta listesinde benimsenmesi için itin ).


1
İlginç! (Özellikle eşik hakkındaki fikriniz.) Bilgi için teşekkürler. Birini aralarında bunu yapmak için bazı deli VimScriptler bulmaya teşvik etmek için zaman ayırıp / kabul edeceğim.
Zengin

5

dKomut için hareketlerle ve görsel modda çalışan bir konsept kanıtı çözümüm var . Henüz tam olarak sağlam bir çözüm değil (örneğin, d[count]dişe yaramıyor ve ikisi de çalışmıyor [count]D), ancak neredeyse tüm gerçek kullanım durumlarımı kapsıyor.

Bir müşteri operatörü işlevi ayarlayarak çalışır:

  1. 1–8 kayıtlarının içeriğini sözlükte saklar,
  2. kayıt 1'e silme işlemini gerçekleştirir,
  3. 2–9 arası kayıtları, 1–8 arası kayıtların önceden kaydedilmiş içeriğine ayarlar.

:help map-operatorOperatör işlevlerinin nasıl çalıştığına ilişkin açıklama için bkz .

function! ShiftingDeleteOperator(type)
  let reg_dict = {}
  for k in range(1, 8)
    execute printf("let reg_dict[%d]=getreg('%d', 1)", k, k)
  endfor

  if a:type ==# 'v'
    execute 'normal! `<v`>d'
  elseif a:type ==# 'V'
    execute 'normal! `<V`>d'
  elseif a:type ==# "\<C-V>"
    execute "normal! `<\<C-V>`>d"
  elseif a:type ==# 'char'
    execute 'normal! `[v`]d'
  elseif a:type ==# 'line'
    execute "normal! '[V']d"
  else
    return
  endif

  let deleted = getreg('"', 1)
  call setreg(1, deleted)

  for [k, v] in items(reg_dict)
    execute printf("call setreg(%d, v)", k + 1)
  endfor
endfunction

" Call the function for d{motion} via operatorfunc
nnoremap <silent> d :set operatorfunc=ShiftingDeleteOperator<CR>g@
" Call the function when d or x are hit in visual mode
vnoremap d :<C-U>call ShiftingDeleteOperator(visualmode())<CR>
vnoremap x :<C-U>call ShiftingDeleteOperator(visualmode())<CR>
" Use the d{motion} as defined above to add limited support for `D` command
nmap D d$
" Use the standard dd command
nnoremap dd dd 

Eski bir cevaba yorum yaptığım için üzgünüm. Bu çözümü kabul etmek yve cfakat için cbenim nvim eyleminden sonra modunda ekleme girmezse ... Şu anda var execute lve startinsert(gibi uygun bir düzeltme olmadığı c$yanlış konumda imleci koyardı). Herhangi bir fikir?
Güneşli Pun

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.