Pengganti pilihan ganda?

15

Biasanya, pengganti dengan copsi memberi saya dua opsi: (y) es atau (n) o. Apakah mungkin untuk memiliki beberapa opsi ya bernomor untuk dipilih?

Contoh

Mengajukan

person: Alice
dog: Tobby
person: Bob

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

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

Pola 1 dan 2 memiliki pola pencarian yang sama tetapi pola penggantian yang berbeda. Saya ingin menyatukan mereka menjadi satu pola dengan opsi menekan (1) untuk penggantian 1, (2) untuk penggantian 2 atau (n) tanpa penggantian.

Konrad Höffner
sumber

Jawaban:

19

Implementasi :s//cdiperbaiki; apa yang Anda cari adalah penggantian dengan ekspresi Vimscript ( :help sub-replace-expr). Anda dapat meminta satu digit melalui getchar(), atau meminta nomor yang lebih panjang melalui input():

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

Anda dapat memasukkan nomor yang lebih tinggi ( 3dalam contoh Anda) untuk tidak melakukan penggantian.


Jika Anda sering membutuhkan ini, masuk akal untuk mendefinisikan Query()fungsi khusus untuk itu. Di sana, Anda juga bisa menambahkan :redraw, sehingga Anda melihat penggantian yang sudah terjadi.

Ingo Karkat
sumber
Perintah itu sepertinya bermasalah. Hanya setelah saya tambahkan perintah cek itu berfungsi::%s/person:/\=get(['woman', 'man'], input('Your choice: ') - 1, submatch(0)) . ':'/c
Lerner Zhang
Tetapi menambahkan cperintah akan menghasilkan saya perlu dua langkah untuk mengganti string, yang saya pikir tidak perlu.
Lerner Zhang
1

Terima kasih untuk semua upvotes ke pertanyaan awal saya! Saya sekarang telah memasukkan :SubstituteChoicesperintah ke plugin PatternsOnText saya , yang menyediakan implementasi yang kuat. Contoh dalam pertanyaan akan diselesaikan melalui:

:%SubstituteChoices/person:/woman:/man:/
Ingo Karkat
sumber