Как создавать короткие сниппеты в Vim?

Недавно я начал использовать Vim в качестве текстового редактора и в настоящее время работаю над собственными настройками.

Я полагаю, что сопоставления клавиатуры могут делать что угодно, но пока я использую их почти исключительно как своего рода средство сниппетов.

Так, например, если я наберу def{TAB} ( :imap def{TAB} def ():<ESC>3ha ), он расширится до:

def |(): # '|' represents the caret

Это работает, как и ожидалось, но меня раздражает, когда Vim ждет полной команды, когда я набираю слово, содержащее «def», и не заинтересован в его расширении.

  • Есть ли способ избежать этого или использовать эту функцию с этой целью более эффективно?
  • Подходит ли для этого какая-либо другая функция Vim?

Бегло взглянув на SnippetsEmu , я понял , что это лучший вариант, и его гораздо проще настроить, чем я думал.

Чтобы продолжить предыдущий пример:

:Snippet def <{}>():

После определения вы можете расширить свой фрагмент, набрав def{TAB} .

Ответов (6)

Решение

SnippetsEmu - полезный плагин для создания сниппетов.

Snipmate - как texmate :) http://www.vim.org/scripts/script.php?script_id=2540

видео: http://vimeo.com/3535418

snippet def 
     """ ${1:docstring} """
     def ${2:name}:
         return ${3:value}

Я только что установил UltiSnips . Есть хорошая статья, в которой объясняется, почему вы можете выбрать UltiSnips: Почему именно UltiSnips?

Я не использовал другие плагины для сниппетов; Я решил сделать решающий шаг, выбрав тот, который казался полнофункциональным и мог бы приспособить меня, поскольку я получаю больше навыков Vim и хочу делать более сложные вещи.

В качестве другого предложения (хотя и немного другого) с использованием встроенных функций vim:

:iabbrev def def(): #<LEFT><LEFT><LEFT><LEFT><LEFT>

Теперь всякий раз, когда вы вводите def, за которым следует пробел или другой символ, не являющийся словом, он будет расширяться до того же значения, что вы дали в качестве вывода SnippetsEmu (пробел берется из введенного вами пробела, чтобы вызвать завершение).

Этот подход не страдает проблемой "запаздывания", с которой вы столкнулись при использовании: inoremap, и встроен в vim. Для получения дополнительной информации об этой функции см :help abbrev ..

Вы можете быть обеспокоены тем, что при срабатывании пробела, а не табуляции он будет запускаться без необходимости, но в целом vim довольно умен, когда его запускать. Проблема может быть дополнительно уменьшена путем включения сокращения только для определенных типов файлов (например, python):

au filetype python :iabbrev ... etc

Snip [ets] (Manager | Emu | Mate | .vim), конечно, тоже идеальное решение, но приятно знать об альтернативах (особенно когда они встроены).

Как отметил MDCore, SnippetsEmu является популярным Vim скрипт , который делает именно это и многое другое. Если вам нужно только развернуть (без возврата каретки), вы можете использовать стандартную :ab[breviate] команду.

:ab[breviate] [<expr>] {lhs} {rhs}
        add abbreviation for {lhs} to {rhs}.  If {lhs} already
        existed it is replaced with the new {rhs}.  {rhs} may
        contain spaces.
        See |:map-<expr>| for the optional <expr> argument.

Если SnippetsEmu слишком тяжелый или амбициозный для того, что вам нужно (это было для меня), я написал плагин, который управляет сниппетами на основе типа файла. У него даже есть завершение табуляции при выборе фрагмента! :)

Получите здесь: snippets.vim