Koşullu olarak bir vim remap'ı nasıl işlenir?


1

Bu / devamı ile silinir satırları yanmadan vim'deki yanmış metni nasıl değiştiririm?

Özetle, vnoremap p "_dPgörsel olarak seçilen metnin üzerine "*, değiştirilen metinle birlikte kayıt defterine yazmadan yapıştırmak için kullanılır . Bu şekilde, sonraki görsel olarak seçilen macunlar aynı tutulur.

Bu remap , karakteristik olarak görsel bir seçimin satır sonuna kadar gitmesi dışında beklendiği gibi çalışır . Bunu koşullu olarak ele almanın bir yolunu bulmaya çalışıyorum, böylece:

  • bu özel durumda, yapmak "_dp
  • aksi takdirde, yap "_dP

vnoremap pBu özel durumu kontrol eden bir vimscript işlevini düşünüyorum , yani "görsel seçim karakteristikse ve imleç satırın sonundaysa" ve buna göre çalıştır.

meta - vimscript cevap ise, belki de StackOverflow'a göndermeliyim?

Güncelleme

Şununla çalışır:

vnoremap <expr> p (getregtype() ==# 'v' && col(".") == col("$") - 1 ? '"_dp' : '"_dP')

Yanıtlar:


2

Koşullu yeniden eşleme için bir ifade eşlemesi ( :help map-expr) kullanabilirsiniz. Bunun senin için zaten işe yarayıp yaramadığını bilmiyorum, ama başlaman gerek:

:vnoremap <expr> p (getregtype() ==# 'v' && col("'>") == col('$') ? '"_dp' : '"_dP')

Bu bana ihtiyacım olanı sağladı, teşekkürler. Bu kesin bir çizgi ile Sorun col("'>"kullanıyorum birine önceki görsel seçimi kullanarak tutar şu anda ve col('$')döndürüyor 'son sütun + 1'.
Kache

1

Kara delik kayıt makinesini kullanmak iki soruna çözüm olabilir: numaralandırılmış kayıtlarınızı yalnızca açıkça yanmış metin içerecek şekilde tutmak veya aynı metni birden çok kez yapıştırmak isteyebilirsiniz.

İlk sorun için, "_dyerine kullanmak ddoğru araçtır çünkü sildiğiniz hiçbir şey herhangi bir kayıtta görünmez.

İkinci problem için, birleştirme "_dve pya Pnedeniyle kaçınılmaz olarak imleç konumu problem ve yönünü oluşturur pve P.

Ingo'nun cevabı mükemmel bir uzlaşma gibi görünüyor.

Ancak, numaralandırılmış kayıtlarınızın durumunu umursamıyorsanız, bir alternatif, "0her zaman en son yazan metni içeren ve etkilenmeyen cya da d?

Test yank:, fooile yanked yiw.

Test çizgisi:, Lorem [i]psum dolor sit amet.imleç üzerinde iile ipsum.

Deney seçimi: v$.

"_dP
Loremfoo <-- trailing whitespace and mashed text, bad

"_dp
Lorem foo <-- good

"0p
Lorem foo <-- good

Deney seçimi: vee.

"_dP
Lorem foo sit amet. <-- good

"_dp
Lorem  foosit amet. <-- bad

"0p
Lorem foo sit amet. <-- good

Bu kesinlikle bir çözüm olabilir ( "0pbiraz ayrıntılı bulmama rağmen ), fakat tam olarak aradığım şeyi aldım.
Kache
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.