2016-10-08 3 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/+=/..., но я не уверен, как это сделать.

Я также думал об использовании python в vim, например this, но я предпочел бы более простое решение полностью в VIM, если это возможно.

+1

Связанные пост: [? В Vim, как я могу найти и заменить любой другой матч] (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()' возвращает элемент, который удаляется из предварительно заполненного списка. Таким образом, каждая подстановка удаляет (и использует) один элемент из списка. Второй вариант запрещает, чтобы список пуст, повторно добавляя каждый элемент снова. –

Смежные вопросы