Сопоставления, ожидающие оператора Vimscript, выдают ошибку «Конечные символы» - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь воспроизвести пример из 15-й главы Стива Лоша «Изучай Vimscript с трудом» (http://learnvimscriptthehardway.stevelosh.com/chapters/15.html), в разделе «Изменение начала».

Сначала я запускаю vim с помощью следующей команды:

vim -u NONE foo

чтобы убедиться, что плагины не загружены. Далее я печатаю

print foo(bar)

в буфере и затем введите

:onoremap in( :<c-u>normal! f(vi(<cr>

Наконец, я помещаю курсор на «p» в «print» и ввожу cin(. В строке состояния отображается:

:<c-u>normal! f(vi(<cr>

с мигающим курсором в конце. Я нажимаю Enter и в строке состояния отображается:

E488: Trailing characters

Согласно книге ожидается, что vim удалит содержимое скобок и поместит вас в режим вставки между ними.

Вот информация о версии:

VIM - Vi IMproved 8.0 (2016 Sep 12, compiled May  2 2017 03:55:34)
MacOS X (unix) version
Included patches: 1-596
Compiled by Homebrew

1 Ответ

0 голосов
/ 18 июля 2019

TL; DR: используйте vim -u DEFAULTS foo вместо.

Это должно поддерживать Vim в режиме 'nocompatible', который необходим для распознавания <Key> кодов в отображениях.


Симптомы, которые вы описываете, соответствуют включению < в 'cpoptions', который документирован для:

Отключить распознавание специальных кодов клавиш в форме <> в отображениях, сокращениях и в части «to» команд меню. Например, команда :map X <Tab> приводит к преобразованию X в "<Tab>" (5 символов), если включено <; но "^I" (^I является действительным <Tab>), когда исключено <.

Это согласуется с тем, что вы получаете буквальный результат сопоставления в командной строке без правильного расширения кодов клавиш <c-u> и <cr>.

Значения по умолчанию для 'cpoptions':

Vim по умолчанию: "aABceFs",
По умолчанию: все флаги

Таким образом, это означает, что < (вместе со всеми остальными флагами) будет включен по умолчанию в режиме Vi, который срабатывает при установке 'compatible' (или, возможно, более точно, когда 'nocompatible' не установлено.)

Оказывается, когда вы используете -u NONE в командной строке, запускающей Vim, он запускается в режиме 'compatible'.

Вы можете использовать вместо -u DEFAULTS, что очень похоже на -u NONE, но все равно будет загружен скрипт defaults.vim, поставляемый с Vim runtime , который, среди прочего, установит 'nocompatible' .

С документы :

Когда передается -u DEFAULTS (все заглавные буквы), это имеет тот же эффект, что и -u NONE, но загружается скрипт defaults.vim, который также устанавливает 'nocompatible'.

Использование аргумента -u с аргументом, отличным от DEFAULTS, имеет побочный эффект, что опция 'compatible' будет включена по умолчанию. Это может иметь неожиданные эффекты.

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