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

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

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

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

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

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

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

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

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

:Snippet def <{}>():

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

Может быть, для коротких сниппетов лучше подойдут макросы?

mk. 19.08.2008 02:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
29
1
25 896
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

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

Ваш ответ только по ссылке отправляет меня кое-что о CouchDB. Вот почему ответы только по ссылкам ужасны. По общему признанию, вы хотя бы сформулировали ссылку, чтобы я мог, по крайней мере, искать в Google. Вы должны изменить свою ссылку на официальную, как в OP / question.

James 12.03.2015 22:10

Как отмечает 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.

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

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

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}

и XPTemplate, и UltiSnips являются улучшением по сравнению со snipMate

user1825480 10.12.2012 17:22

У Snipmate есть актуальная вилка на github.com/garbas/vim-snipmate и репо фрагментов на github.com/honza/snipmate-snippets

BeeZee 20.01.2013 08:36

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

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

Я пробовал и Snipmate, и UltiSnips, и, без сомнения, UltiSnips намного лучше, потому что в нем проще вносить изменения и создавать фрагменты.

SergioAraujo 27.12.2013 13:03

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

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