Nasıl koşabilirim: yerine sadece çizginin bir kısmını değil, yerine koyabilir miyim?


15

Bunun gibi bir çizgi var:

function my_function(argument, another argument, but there are spaces)

Boşluk karakterlerini (argümanın adlarının içinde) alt çizgi ile değiştirmek istiyorum. Bu yüzden kullanmak istiyorum:

:s/\ /_/g

ancak bunu tüm satıra uygulamayı değil, örneğin imleç konumundan başlayarak nasıl seçebilirim? (Veya üçüncü kelime)?


4
Bir normal ifadede, mevcut imleç konumunu tanımlamak için atomu kullanabilirsiniz \%#. Yani, kullanabilirsiniz: :s/\v(%#.*)@<= /_/g. Bu @<=, imleç konumundan sonra ( ) karakterden önce gelen bir boşluk olarak tanımlanabilir .
user9433424

1
Hem siz hem de Statox \%#hile önerdiniz , eğer bir tane yazmazsanız cevabını kabul edeceğim ... Ama ikiniz de normal ifadeyi biraz daha açık bir şekilde açıklayabilir misiniz?
Feffe

Yanıtlar:


15

Aşağıdaki çözümü kullanabilirsiniz:

İlk v$önce imleçten satırın sonuna kadar metni seçmek için düğmelerini kullanın . Ardından aşağıdaki komutu kullanın:

:s/\%V\ /_/g

Daha \%Vönce görsel olarak seçilen alandaki metnin değiştirileceğini belirtin, bkz :h /\%V.

Örneğinizi alırsam:

function my_function(argument, another argument, but there are spaces)

İmlecim 40. sütundaysa ve az önce yazdığım komutu kullanırsam:

function my_function(argument, another argument,_but_there_are_spaces)

Yorumunuza cevap olarak şunları da kullanabilirsiniz:

  • \%# imleç konumundan eşleşen
  • \%>23c 23. sütundan sonra eşleşir.
  • \%>'m bir işaretin konumundan sonra eşleşen

Bkz :h /\%#, :h /\%>cve :h /\%>'m.

@ User9433424 yorumunda kullanmanın bir yolunu verdi \%#. İşaretli desen için zekayı ayarlayabilir mave ardından kullanabilirsiniz:

:s/\%>'a /_/g

@ User9433424 tarafından verilen paternin açıklaması aşağıdadır:

:s/\v(%#.*)@<= /_/
:s/                    substitution command
   \v                  Enable the very magic mode
      %#.*             Any characters from the cursor position
           @<=         Check for matches just before what follows
              space    Followed by a space
               /_/     Substitute the matches by underscores

Görmek isteyeceksiniz :h \vve:h /\@<=


İyi çalışıyor ! Ama gerçekten görsel seçimlere alışkın değilim ve tüm süreç biraz "ağır" görünüyor ... Sizce daha hızlı bir şey olabilir mi?
Feffe

Evet cevabımı güncellememe izin ver :)
statox

User9433424 bu ipucunu senden hemen önce verdi, ama cevapladın, bu yüzden eğer cevabını kabul edeceğim, eğer sorun değilse - belki biraz daha kullandığı normal ifade modelini açıklayabilir misin? Hala bununla mücadele ediyorum ...
Feffe

Cevabı olabildiğince netleştirmeye çalıştım, ancak @ User9433424 kendi cevabını yazarsa, cevaplamaktan çekinmeyin.
statox

1
Normal ifadenin çok güzel açıklaması, teşekkürler! Ve kimin cevabını kabul edeceğinizle ilgili yorumunuz için teşekkürler :)
Feffe

5

Değişikliğin :h \@<=istediğiniz yerde olduğundan emin olmak için, önceki bir '(' ve kelime sonu sınırı ( :h \>) olduğundan emin olmak için look behind ( ) öğesini kullanabilirsiniz .

Yani, metinle:

function my_function(argument, another argument, but there are spaces)

komutu çalıştırmak:

:s/\((.*\)\@<=\> /_/g

üretecek:

function my_function(argument, another_argument, but_there_are_spaces)

İkame her zaman bilinen bir başlangıç ​​noktasına sahipse, bu imleci her seferinde konumlandırmak zorunda kalmaktan daha kolay olabilir.


2
İkame her zaman bilinen bir başlangıç ​​noktasına sahip değildir: sadece ... yaptığım garip bir yazım hatası dizisini düzeltmekti. Ama cevabınız yine de ilginç, teşekkürler!
Feffe
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.