Değiştirme komutu için önizleme nasıl alınır?


9

Sık sık kendimi büyük bir dosya üzerinde ve önemsiz olmayan arama ve değiştirme ifadeleri ile ayrılmış maçlar yerine koyma ihtiyacı buluyorum.

Örneğin, bazı işlev çağrılarım olduğunu varsayalım okFunction(arg1, arg2 arg3). Args elbette her fonksiyon çağrısında farklı olacaktır. Şimdi diyelim ki ihtiyaç duymayan daha iyi bir fonksiyon keşfettim arg2. İle tüm dosyayı kolayca ayarlayabilirim

:%s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/gc

Kavramsal olarak basit olmasına rağmen, bu uzun kalıpta sözdiziminin doğru olduğundan emin değilim. cBayrak gerçekten burada yardımcı olur, ancak sorun teyidi talebinde, vim maç ile değiştirilir ne olacağını göstermez olmasıdır. Yani, yerine koyma ifadesini gösterecek, ama değerlendirilen sonucu göstermeyecek. Eğer oyuncu değişikliğini onaylarsam y, vim hemen bir sonraki maça atlayacak ve herhangi bir hata yapıp yapmadığımı göremeyeceğim.

Sorunu kısmen çözen vim-over eklentisini buldum , ancak sadece komutu yazarken ekranda tüm matematik görünürse. Enter tuşuna basarsanız, davranış yukarıda tarif ettiğimle tamamen aynıdır ve önizleme almıyorum.

Peki, yerine komutlar için onay isterken yerine koyma ifadesini değerlendirmek için vim almanın bir yolu var mı?


2
bu vim-böcek izci bir whishlist öğedir (üzgünüm şu anda bulamıyorum)
Christian Brabandt

2
Değeri için genellikle olmadan ilk satırında ikame kullanın, %sonuç beklediğim şey olup olmadığını kontrol edin ve sonra ikame ile kullanın %(sadece birkaç tuş vuruşları:) :<up><c-b>%. Açıkçası bir önizleme seçeneği bundan çok daha verimli olacaktır. Hiçbir yama mevcut olmasa da, bir vimscript işlevinde bu tür bir seçenekle ikameyi sarabilir, ancak bu çok fazla iş gibi geliyor ...
statox

2
@ChristianBrabandt Bulundu . Henüz sınıflandırılmamış önceliğe sahip ...
Vitor Eiji

2
@VitorEiji düşündüğüm kişi değildi. Ama şu anda mümkün olmadığı için aslında önemli değil. Neovim işe yarayan 'inccommand' seçeneğini sunuyor (ya da değil, gerçekten yapmıyorum)
Christian Brabandt

Kötülük oyuncu değişikliğinin önizlemesini yapar; Yine de nasıl yaptığını bilmiyorum.
Geremia

Yanıtlar:


2

Çözümlerden biri makrolardır. Tüm sorunlu alanları vurgulayın ve her seferinde bir satırda değiştirme yapın. Sonra isteyip istemediğinize karar verin. Bir kez nsonraki alana.

Sizin durumunuz için özellikle:

  1. Alan ara: /\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))
  2. Makro kaydetmeye başlayın qq.
  3. Uygulamak :s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/g
  4. Makro kaydetmeyi durdur q
  5. Ya geri alın ( u) veya sonraki arama sonucuna ( n) gidin.
  6. Makro uygula @q.
  7. Gerektiği gibi 5. ve 6. adımları tekrarlayın.

Açıkçası tam olarak aradığınız şey değil, ama genellikle yaptığım bu.


çok havalı! Hiç bir arama yaptığınızda /görsel bir seçim olarak davrandığını fark etmedim - güzel.
the_velour_fog

@the_velour_fog " /... görsel bir seçim gibi davranır." Aslında öyle değil. Bunun çalışmasının nedeni :s//, mevcut hatta ve kullanımda etkili nolmanızın sizi bir sonraki tekrarlamaya götürmesidir.
Tumbler41

1
Bunun için bir desen belirtmezseniz :s/pattern/replacement, son arama dizesini kullanır, bu nedenle 3. adımda :s//betterFunction(\1, \3)/gbazı yazımları kaydetmek için başvurabilirsiniz .
Haegin

@ Tumbler41 ah, açıkladığın için teşekkürler. Evet, bu temel arama tekniğini de yapıyorum , sonra makro uyguluyorum, genellikle önce arglist'i dolduruyorum ve :vimgrep /pattern/ ##daha sonra makro uyguluyorum , bu şekilde kalıbım aslında tutarlı bir şekilde eşleşiyorsa ve makro şey çok sıkıcıysa, hızlı bir şekilde yapabilirim geri :argdo %s/.../..../gc
dönün
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.