2016-10-08 5 views
0

이의 내가 몇 가지 코드 있다고 가정 해 봅시다 :VIM : 다른 값을 가진 문자열의 각 인스턴스를 교체하는 방법

divide(int x) { 
int a = 0; 
a += x; 
} 

subtract(int x) { 
int b = 0; 
b += x; 
} 

multiply(int x) { 
int c = 0; 
c += x; 
} 

을 나는 VIM을 사용하고 있는데 나는 검색 할 수 있기를 각 인스턴스를 대체 할 것 of + = {'/=', '-=', '*='}의 순서로 vim 명령 줄을 사용하십시오. :%s/+=/...을 사용하고 싶지만 그 방법을 모르겠습니다.

나는 또한 vim에서 this처럼 파이썬을 사용하려고 생각했지만 가능하다면 VIM에서 더 간단한 해결책을 선호합니다. 당신의 +=의 모든 다른 라인에서 발생하는 경우

+1

관련 게시물 : [? 빔에서 내가 검색하고 다른 모든 일치를 대체 할 수있는 방법 (http://stackoverflow.com/q/13763880/438329) –

답변

2

:

:let c=0 | g/\m+=/ s!\m+=!\=['/=', '-=', '*='][c%3]! | let c+=1 

가있을 수 있습니다 경우 같은 줄에 두 개 이상의 += :

:fu! Cycle() | let c+=1 | return ['/=', '-=', '*='][c%3] | endf 
:let c=-1 | %s/\m+=/\=Cycle()/g 

참고 :

  • :h :global
  • :h s/\=
+0

답변 주셔서 감사합니다. 왜 이것이 효과가 있는지 자세히 설명해 주시겠습니까? – luca590

1

여기에는 @ SatoKatsura의 답변의 변종이 있습니다. 먼저 대체 목록을 정의한 다음 :help sub-replace-expression을 사용하여 목록의 첫 번째 요소를 제거합니다.

:let replacements = ['/=', '-=', '*='] | %s#+=#\=remove(replacements, 0)# 

가 3 개 이상 교체는, 당신은 대체의 반복하려면이를 사용

:let replacements = ['/=', '-=', '*='] | %s#+=#\=add(replacements, remove(replacements, 0))[-1]# 
+0

좋습니다. 그렇다면 이것이 정확히 작동하는 이유는 무엇입니까? % s 다음에 오는 모든 것을 이해합니다. – luca590

+1

'remove()'는 미리 채워진리스트에서 제거 된 요소를 반환합니다. 따라서 각 대체는 목록에서 하나의 요소를 제거 (사용)합니다. 두 번째 변형은 각 요소를 다시 추가하여 목록이 비게되는 것을 방지합니다. –