Почему этот необычный синтаксис конкатенации точек VIM работает, а мой обычный синтаксис VIM - нет? - PullRequest
1 голос
/ 12 марта 2012

Настройка моего .vimrc Я добавил поддержку файла шаблона (скелета). Это правило автокоманды из книги ничего не делало (без ошибок и шаблонов):

:autocmd BufNewFile * silent! Or $HOME/.vim/templates/%:e.tpl

Эта версия, отличная от% e-wildcard, вызвала ошибку:

:autocmd BufNewFile *.html Or $HOME/.vim/templates/html.tpl

"test.html" [New File]
Error detected while processing BufNewFile Auto commands for "*.html":
E492: Not an editor command: Or $HOME/.vim/templates/html.tpl

В другом посте пользователь orftz (+1) показал нам необычный синтаксис (который я бы распознал как PHP), используя конкатенацию и двойные кавычки.

:autocmd BufNewFile * :silent! :exec ":0r " . $HOME . "/.vim/templates/" . &ft . ".tpl"

Что не так с моей версией общего и почему другая версия работает (я не вижу цитирования в других скриптах vim, подобных этой).

1 Ответ

1 голос
/ 23 мая 2014

Цитирование или конкатенация не имеют к этому никакого отношения.

Исходная команда, скорее всего, ничего не делает, потому что вы забыли объявить команду Or. Я, очевидно, не знаю, какую книгу вы используете, но, скорее всего, она выглядит как :command -nargs=1 Or read.

Ваша вторая команда не выполнена, поскольку вы также удалили silent!. Это утверждение подавит все ошибки. Поскольку вы удалили его, Vim теперь предупредит вас, что Or <argument> не известен редактору, поэтому отсутствующий %:e не имеет к этому никакого отношения.

Если вы хотите узнать больше о %:e, прочитайте http://vimdoc.sourceforge.net/htmldoc/cmdline.html#%:e - он будет заменен расширением текущего файла.


EDIT: Я вижу, вас также смутил оператор . , который можно использовать для конкатенации строк, и это правильно.

. просто означает «объединить первую строку со второй», например, let val2 = 'value ' . val1.

Проблема в том, что у Vim есть несколько команд, которые сами выполняют конкатенацию, :execute, :echo и :echomsg, и это лишь некоторые из них. Такие команды автоматически добавят пробел, если вы передадите ему несколько выражений. Следующие команды должны быть эквивалентны:

:exec ":0r" $HOME . "/.vim/templates/" . &ft . ".tpl" :exec ":0r " . $HOME . "/.vim/templates/" . &ft . ".tpl" :exec (":0r " . $HOME . "/.vim/templates/" . &ft . ".tpl") :exec ":0r" ($HOME . "/.vim/templates/" . &ft . ".tpl")

Это просто говорит о том, что скрипт Vim почти красив.

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