Nhiều lựa chọn thay thế?


15

Thông thường, một thay thế với ctùy chọn cho tôi hai tùy chọn: (y) es hoặc (n) o. Có thể có một số tùy chọn có đánh số để lựa chọn không?

Thí dụ

Tập tin

person: Alice
dog: Tobby
person: Bob

Mẫu 1 :%s/person:/woman:/c

Mẫu 2 :%s/person:/man:/c

Mẫu 1 và 2 có cùng mẫu tìm kiếm nhưng mẫu thay thế khác nhau. Tôi muốn hợp nhất chúng thành một mẫu với tùy chọn nhấn (1) để thay thế 1, (2) để thay thế 2 hoặc (n) để không thay thế.

Câu trả lời:


19

Việc thực hiện :s//clà cố định; những gì bạn đang tìm kiếm là sự thay thế bằng biểu thức Vimscript ( :help sub-replace-expr). Bạn có thể truy vấn một chữ số thông qua getchar()hoặc nhắc nhở các số dài hơn thông qua input():

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

Bạn có thể nhập số cao hơn ( 3trong ví dụ của bạn) để thực hiện không thay thế.


Nếu bạn cần điều này thường xuyên, sẽ có ý nghĩa khi xác định một Query()chức năng tùy chỉnh cho điều đó. Trong đó, bạn cũng có thể thêm một :redraw, để bạn thấy sự thay thế đã xảy ra.


Lệnh có vẻ có vấn đề. Chỉ sau khi tôi thêm lệnh kiểm tra, nó mới hoạt động::%s/person:/\=get(['woman', 'man'], input('Your choice: ') - 1, submatch(0)) . ':'/c
Lerner Zhang

Nhưng thêm clệnh sẽ dẫn đến tôi cần hai bước để thay thế một chuỗi, mà tôi nghĩ là không cần thiết.
Lerner Zhang

1

Cảm ơn tất cả các upvote cho câu hỏi ban đầu của tôi! Bây giờ tôi đã kết hợp một :SubstituteChoiceslệnh vào plugin FormsOnText , cung cấp một triển khai mạnh mẽ. Ví dụ trong câu hỏi sẽ được giải quyết thông qua:

:%SubstituteChoices/person:/woman:/man:/
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.