나는 vim을 사용하고 있습니다.서라운드.vim
(매우 긴) 수학 표현식(일치하는 괄호 포함)의 모든 항목을 sin(...)
바꾸고 싶습니다 .sin[...]
입력 예:
sin(A*(B+C))+sin((X+Y)*sin((A+D)*C))
원하는 출력:
sin[A*(B+C)]+sin[(X+Y)*sin[(A+D)*C]]
현재는 먼저 커서가 있는 /sin\zs(
다음 표현식으로 이동하기 위해 검색 한 다음 일치하는 괄호를 대체하기 위해 입력합니다. 그런 다음 (다음 검색) 및 (이전 명령 반복)을 사용하여 이 두 명령을 반복할 수 있습니다 . 이것은 작동하지만 표현식이 너무 커서 번거롭습니다.sin
(
cs(]
n
.
전체 명령 시퀀스를 자동화하는 방법이 있습니까, 아니면 vim
완전히 자동화된 방식으로 내부 교체를 수행하는 방법이 있습니까?
vim 외부에서 변환하는 완전히 다른 방법이 있을 수 있지만 교육적인 이유로 저는 다음 방법에 관심이 있습니다.vim 솔루션문제에.
답변1
전형적인 사례인데,재귀 매크로도울 수있다. 키 시퀀스를 재귀 매크로에 넣고 실행하면 됩니다. SE 마스터를 화나게 하지 않기 위해 위키 기사를 요약해 보겠습니다.
- qqq-
q
레지스터 지우기 - qq- 매크로 기록 시작
q
/\msin\zs(
Enter-sin(
커서를 찾아서 유지하세요(
- cs(]-replace
(...)
with[...]
( 추가 공백을 추가하지 않으려면 ]대신 사용)[ - @q-
q
매크로를 실행합니다. (레지스터가 비어 있기 때문에 아직 아무것도 하지 않습니다q
.) - q- 매크로 기록을 종료합니다.
그런 다음 방금 기록한 매크로를 실행합니다 @q. 그게 다입니다. @q
최종적으로는 매크로 호출 자체를 수행합니다. /sin(
더 이상 아무 것도 발견 되지 않으면 첫 번째 오류가 발생하면 중지됩니다 .
참고 사항: 해당 변경 사항을 전체 파일에 적용하지 않고 라인 10과 20 사이에만 적용하고 싶지만 여전히 재귀를 사용하여 수동 확인을 피하려면 정규식 일치만 사용 \%>...l
하고 만들 수 있습니다. \%<...l
원하는 한도 사이: /\m\%>9l\%<21lsin\zs(
.