Как работает: нормально! / что-то <cr>относится к incsearch и оператору /? - PullRequest
0 голосов
/ 01 декабря 2011

Несколько микро-вопросов, касающихся normal !, incsearch и оператора / (search) .Я не решаю какую-то конкретную проблему здесь, просто пытаюсь понять отношения между упомянутыми, поэтому я могу провести какую-то аналогию в моей голове.

Если у меня есть, set incsearch включен, в то время как в обычном режиме после нажатия / что-то Vim перейдет к первому экземпляру что-то даже до того, как я нажму клавишу ввода / без меня.1013 * нормально!/ что-то должно сделать то же самое. Почему бы и нет?

Точно так же normal! не распознает специальные символы.Так что, если у меня есть текстовый файл с этим текстом,

something<cr>

(это не специальный символ, а буквально набранный текст)

`normal! /something<cr>`

должен поднять меняк этому тексту. Почему бы и нет?

Мне это нравится, но иногда несоответствия Вима, мягко говоря, наиболее интересны:)

1 Ответ

4 голосов
/ 14 февраля 2012

В :help :normal соответствующий текст:

{commands} should be a complete command.  If
{commands} does not finish a command, the last one
will be aborted as if <Esc> or <C-C> was typed.

Строка команды, которую вы указываете normal, должна быть полной командой, или она прерывается. Однако normal! /something не завершено; если бы вы печатали его, Вим бы ждал, когда вы закончите. Вы можете нажать Esc или Ctrl - C для отмены. Или вы можете завершить его, нажав Enter . Таким образом, команда не завершена и прерывается вместо прыжка. Чтобы завершить его, введите желаемое значение Enter (в командной строке):

:normal! /something^M

Вы можете получить ^M, набрав Ctrl - V , а затем Введите . (Если в Windows и Ctrl - V , используйте Ctrl - Q .) Затем вам нужно будет нажать Введите еще раз, чтобы завершить всю команду. Если бы вы использовали execute, вы могли бы сделать это с помощью:

:execute "normal! /something\<cr>"

Обязательно используйте двойные кавычки, чтобы \<cr> был интерпретирован правильно.

Я полагаю, что ваш второй вопрос - это то же самое. Буквально напечатанный <cr> не влияет на эту ситуацию, вам просто нужно указать возврат каретки, который завершит команду поиска, или normal прервет ее.

Поскольку вы пометили этот вопрос , я предполагаю, что по крайней мере часть вашего интереса заключается в использовании этого в сценарии. Возвращение буквального каретки в сценарий и правильная работа - это своего рода боль. В этих случаях я бы использовал execute, как показано выше, поэтому вы можете использовать метод интерпретируемой строки с двойными кавычками для получения возврата каретки.

Что касается incsearch, он не будет иметь эффекта, потому что вы не можете частично выполнять поиск с помощью normal, как мы видели. Вы можете отправить только весь поиск. Однако он обновит регистр самого последнего поиска "/, поэтому выделение будет обновляться правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...