객관식 대체?


15

일반적으로 c옵션을 대체 하면 (y) es 또는 (n) o의 두 가지 옵션이 제공됩니다. 몇 가지 예 옵션 중에서 선택할 수 있습니까?

파일

person: Alice
dog: Tobby
person: Bob

패턴 1 :%s/person:/woman:/c

패턴 2 :%s/person:/man:/c

패턴 1과 2는 검색 패턴은 동일하지만 대체 패턴은 다릅니다. 교체 1의 경우 (1), 교체 2의 경우 (2) 또는 교체 없음의 경우 (n)을 누르는 옵션을 사용하여 하나의 패턴으로 통합하고 싶습니다.

답변:


19

구현 :s//c은 고정되어 있습니다. 당신이 찾고있는 것은 Vimscript 표현식 ( :help sub-replace-expr)으로 대체하는 것 입니다. 을 통해 한 자리 숫자를 쿼리 getchar()하거나 input()다음을 통해 더 긴 숫자를 입력하라는 메시지를 표시 할 수 있습니다 .

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

더 높은 숫자 ( 3예 :)를 입력하여 교체를 수행 할 수 없습니다.


이 기능이 자주 필요한 경우이를 위해 사용자 정의 Query()기능 을 정의하는 것이 좋습니다. 거기에을 추가하여 :redraw이미 발생한 교체를 볼 수도 있습니다 .


명령이 문제가있는 것 같습니다. check 명령을 추가 한 후에 만 ​​작동합니다.:%s/person:/\=get(['woman', 'man'], input('Your choice: ') - 1, submatch(0)) . ':'/c
Lerner Zhang

그러나 c명령을 추가하면 문자열을 바꾸려면 두 단계가 필요합니다. 필요하지 않다고 생각합니다.
Lerner Zhang

1

내 원래 질문에 대한 모든 찬성에 감사드립니다! 이제 PatternsOnText 플러그인에:SubstituteChoices 명령을 통합 하여 강력한 구현을 제공합니다. 문제의 예는 다음을 통해 해결됩니다.

:%SubstituteChoices/person:/woman:/man:/
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.