Как запустить команду поиска и замены без перемещения курсора в Vim?

В Vim, когда я делаю:

:%s/foo/bar/g

Он заменит все вхождения «foo» на «bar» во всем документе. Когда он завершится, курсор переместится в последнюю позицию, где «foo» была заменена на «bar».

Как вы запускаете :%s/foo/bar/g без того, чтобы курсор покидал исходную позицию перед выполнением этой команды?

Есть ли какой-то параметр, который я могу установить в файле .vimrc?


person platypus    schedule 06.05.2012    source источник
comment
Не уверен, что можно сделать это, не перемещая курсор, но вы можете переместить его назад, дважды нажав одинарную кавычку.   -  person Vaughn Cato    schedule 06.05.2012


Ответы (2)


Я просто набираю Ctrl+O после замены, чтобы вернуться к предыдущему местоположению.

person Steve Jorgensen    schedule 06.05.2012
comment
@иб. никогда не уставал делать ответы более совершенными :) - person sehe; 06.05.2012

Когда запускается команда :substitute, до выполнения любых замен положение курсора сохраняется в списке переходов. Чтобы вернуться в положение перед последним прыжком, можно использовать команды нормального режима `` или ''. Первый прыгает точно в сохраненную позицию; последний переходит к первому непробельному символу в строке, к которой принадлежит сохраненная позиция.

Можно как вызвать команду подстановки, так и переместить курсор обратно сразу, выполнив команду

:%s/pat/str/g|norm!``

или, если достаточно перейти не в точную позицию, а просто в содержащую строку, с помощью команды

:%s/pat/str/g|''

Нет необходимости предварять '' с помощью norm! в последней команде, потому что адрес '', разрешенный синтаксисом диапазона команд Ex, относится к той же строке, на которую переходит команда нормального режима '' (см. :help :range); оба просто просматривают содержимое псевдо-метки '.

person ib.    schedule 06.05.2012
comment
Хорошая попытка. Но не элегантно. следует использовать Ctrl-o. - person mattn; 07.05.2012
comment
@mattn: По какому критерию использование Ctrl+O элегантно, а `` нет? Последняя команда не длиннее первой по нажатию клавиш; в данном случае оба они приводят к одному и тому же движению курсора. Почему вы находите нажатие `` (вместо Ctrl+O) неэлегантным? - person ib.; 07.05.2012
comment
Это простой ответ. длиннее, чем с-о. И ваша команда обновляет список переходов. Если я использую ваш способ, я буду использовать g`. :) - person mattn; 10.05.2012
comment
Ах, я ошибся. Я буду использовать KeepJumps. - person mattn; 10.05.2012
comment
@mattn: Простите? `` длиннее, чем Ctrl+O?! Кроме того, Ctrl+O также обновляет список прыжков! (См. :help jumplist или просто попробуйте сами.) Таким образом, `` и Ctrl+O опережают друг друга как в отношении изменения списка переходов, так и в отношении количества нажимаемых клавиш. По этим критериям одна команда не превосходит другую. Вы все еще считаете кого-то из них более элегантным? Если да, то по какой причине? - person ib.; 10.05.2012
comment
@иб. and @mattn Думаю, это в основном дело вкуса. Для меня `` козыри ‹Co› (проще вводить, выражает использование регистра и логически соединяется с :'', :g//copy '' и прочим. Я не знаю, кто проголосовал за этот ответ, но я определенно думаю, что несогласие вкусов не должно быть причиной для понижения. - person sehe; 10.05.2012
comment
Я полагал, что ‹c-o› принимает две или более команд, таких как замены, такие как ':%s/a/b/g|%s/c/d/g', с возвратом к исходной позиции курсора. но нет. Хм, это же преимущество. - person mattn; 14.05.2012