Как создать короткие фрагменты в Vim? - PullRequest
28 голосов
/ 19 августа 2008

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

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

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

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

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

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

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

Для продолжения предыдущего примера:

:Snippet def <{}>():

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

Ответы [ 6 ]

35 голосов
/ 19 мая 2009

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}
11 голосов
/ 30 октября 2012

Как еще одно предложение (хотя и немного другое) с использованием встроенной функциональности 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), конечно, также является идеальным решением, но приятно знать об альтернативах (особенно когда они встроены).

6 голосов
/ 01 ноября 2008

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

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

5 голосов
/ 29 марта 2012

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

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

5 голосов
/ 19 августа 2008

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

4 голосов
/ 28 августа 2008

Как отмечает 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...