Вопрос
Недавно я начал использовать 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.