Сделать режим командной строки типа <Esc> и Ctrl команды

11

Представьте, что вы хотите процитировать слово ниже. Если |это позиция курсора, вы можете легко заключить слово в кавычки cw""<Esc>Pиз обычного режима.

|below

Я хочу добиться того же поведения в режиме командной строки. У меня вопрос, как я могу сказать в режиме командной строки, что я хочу набрать <Esc>. Я пробовал :norm cw""<Esc>Pи некоторые другие варианты, но я просто получаю ""<Esc>Pвместо "below".

Все еще связанный с этим, я хотел бы знать, как я могу сделать команды Ctrl типа режима командной строки. Например, я мог бы cw"<C-r>""<Esc>вместо этого цитировать вышеупомянутое слово . Но тогда мне понадобится командная строка для ввода <C-r>для меня. Как я могу это сделать?

Гонсалу Рибейро
источник
1
Так же, как <C-x><C-e>в readline для редактирования командной строки $EDITOR, у вас есть <C-f>в Vim, чтобы открыть окно командной строки. См :help cmdline-window.
Ромен

Ответы:

11

<C-v>это то, что вы ищете. Он позволяет вводить буквенные символы (например, литерал Escвместо строки «Esc»), не требуя экранирования чего-либо.

:norm cw""<C-v><Esc>P

отображается как:

:norm cw""^[P

и будет делать то, что вы хотите (т. е. процитировать слово). Вы также можете использовать это с другими <C-?>отображениями. Например, ваш второй запрос:

:norm cw"<C-v><C-r>""

отображается как:

:norm cw"^R""

И приведет к тому же, что и выше. Там нет необходимости включать дополнительные Escв конце.

Зак Ингбретсен
источник
10

Это связано с тем, что специальные клавиши вроде <Esc>не переводятся в normalкоманды и обрабатываются так же, как вы нажали <Esc>. Чтобы исправить это, вы можете использовать execкоманду. Вот так:

:exec "norm cw\"\"\<Esc>P"

Обратите внимание, что перед кавычками необходимо ставить обратную косую черту и <Esc>, и использование одинарных кавычек вместо двойных не будет работать.

Вечнозеленое дерево
источник
Это работает и для команд Ctrl? Как мне написать их в команде?
Гонсалу Рибейру
Да, это должно работать. Вы можете написать их так:"\<C-{insert key}>"
EvergreenTree
2

Режим командной строки отличается; Вы не можете использовать те же (обычный режим) команды редактирования там. Вы можете найти список команд на :help c_CTRL-V.

Теперь есть окно командной строки ( :help command-line-window), в которое можно войти как q:из обычного <C-F>режима, так и из режима командной строки. В этом окне вы можете использовать все обычные команды и сопоставления, так что это будет вариант 1.

Вариант 2 - это специальные отображения для режима командной строки. Как я уже сказал, вы не можете использовать подход через :normalet al. Ключом к их определению является :help c_CTRL-\_eотображение, которое «оценивает [s] {expr} и заменяет [s] всю командную строку результатом». Вот простой пример, который корректно работает только в конце командной строки:

:cnoremap <F1> <C-\>esubstitute(getcmdline(), '\w\+$', '"&"', '')<CR>
Инго Каркат
источник
1
Я не думаю , что ОП означало создать отображение для командной строки, но выполнить отображение из командной строки.
EvergreenTree