Çoktan seçmeli yedek?


15

Normalde, seçenekli bir ikame cbana iki seçenek sunar: (y) es veya (n) o. Aralarından seçim yapabileceğiniz birkaç numaralı evet seçeneğiniz var mı?

Misal

Dosya

person: Alice
dog: Tobby
person: Bob

Desen 1 :%s/person:/woman:/c

Desen 2 :%s/person:/man:/c

Desen 1 ve 2 aynı arama desenine ancak farklı değiştirme desenlerine sahiptir. Onları 1 için (1) yerine, 2 için (2) veya 2 yerine (n) basma seçeneğiyle tek bir desende birleştirmek istiyorum.

Yanıtlar:


19

Uygulaması :s//csabittir; aradığınız şey bir Vimscript ifadesi ( :help sub-replace-expr) ile değiştirilmesidir. Tek basamaklı bir sorguyu sorgulayabilir getchar()veya daha uzun sayıları şu yollarla isteyebilirsiniz input():

:%s/person:/\=get(['woman', 'man'], getchar() - char2nr(1), submatch(0)) . ':'/
:%s/person:/\=get(['woman', 'man'], input('Your choice: ') - 1, submatch(0)) . ':'/

3Değiştirme yapmak için daha yüksek bir sayı ( örneğin) girebilirsiniz .


Buna sık sık ihtiyacınız varsa, bunun için özel bir Query()işlev tanımlamak mantıklı olacaktır . Orada, :redrawzaten eklenmiş olan değişiklikleri görmek için bir de ekleyebilirsiniz .


Komut sorunlu görünüyor. Sadece kontrol komutunu ekledikten sonra işe yarıyor::%s/person:/\=get(['woman', 'man'], input('Your choice: ') - 1, submatch(0)) . ':'/c
Lerner Zhang

Ama ckomut ekleyin sonuçta gereksiz olduğunu düşünüyorum bir dize, değiştirmek için iki adım gerekir.
Lerner Zhang

1

Orijinal sorumdaki tüm vekiller için teşekkürler! Şimdi sağlam bir uygulama sağlayan PatternsOnText eklentisine bir :SubstituteChoiceskomut ekledim . Sorudaki örnek şu şekilde çözülebilir:

:%SubstituteChoices/person:/woman:/man:/
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.