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

StackOverflow https://stackoverflow.com/questions/15334

  •  08-06-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

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

Продолжим с предыдущим примером:

:Snippet def <{}>():

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

Это было полезно?

Решение

Фрагменты текста это полезный плагин для создания фрагментов кода.

Другие советы

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}

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

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

Принеси это сюда: фрагменты.vim

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

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

Как отметил MDCore, Фрагменты текста это популярный 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.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top