2012-01-17 3 views
1

Я часто делаюобратный порядок строки, чтобы найти и заменить строки в Vim

:s/foo/bar/g 
*move to different line* 
:s/bar/foo/g 

на разных линиях. Есть ли простой способ поменять их, чтобы я мог быстро выполнить вторую версию?

+0

Вы хотите поменять местами вокруг? Пример, который вы дали seens делать «ничего» sice «foo», будет «foo» после замены. – Mithrandir

+0

Я отредактировал его, чтобы сделать его более ясным. Я хотел бы сделать что-нибудь найти и заменить где-нибудь, а затем один обратный ему в другом месте. Это бывает достаточно часто для меня ... – invisiblerhino

+0

Возможный дубликат [this] (http://stackoverflow.com/questions/6237908/how-to-write-only-one-pattern-to-exchange-two-strings-in -Два-пути-в-VIM) – kev

ответ

2

Вы можете попробовать Abolish плагин (git homepage):

:Subvert/{foo,bar}/{bar,foo}/g 

Без плагина:

:%s/foo\|bar/\=submatch(0) ==# 'foo' ? 'bar' : 'foo'/g 
1

Вы можете использовать dict в Vim

:%s/foo\|bar/\={'foo':'bar', 'bar':'foo'}[submatch(0)]/g 
2

Быстрое использование только один раз вариант заключается в следующем:

:s/~/<c-r>//g<cr> 

~ совпадает с последней заменой и <c-r>/ вставит текущую строку поиска из "/ регистра. Поэтому переворачивание подстановки. Слово предупреждения состоит в том, что ~ может использоваться только один раз, потому что после замены он будет изменен. Также выполнение поиска между заменами приведет к изменению регистра "/.

В качестве альтернативы вы можете попытаться использовать окно командной строки, чтобы отредактировать команду как текст в любом другом окне.

Используйте q:, чтобы открыть окно командной строки из нормального режима или нажмите Ctrl-F из командной строки (предполагается, что значение по умолчанию для 'cedit').

У Drew Neil есть эпизод vimcasts, который имеет дело с refining search patterns via the command-window, который похож.

:h /~ 
:h c_CTRL-R 
:h quote/ 
:h cmdwin 
:h q: 
:h 'cedit' 
Смежные вопросы