vim: Surround.vim을 사용하여 상황에 맞는 대괄호를 자동으로 교체합니다.

vim: Surround.vim을 사용하여 상황에 맞는 대괄호를 자동으로 교체합니다.

나는 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(.

관련 정보