Привязка Vim для переноса слова под курсором в двойные фигурные скобки

При работе с шаблонами Jinja и YAML для конфигурации Ansible я часто копирую и вставляю имя переменной (скажем, nginx_root), а затем мне нужно заключить его в двойные фигурные скобки: {{ nginx_root }}. Это неудобно делать вручную, поэтому я хочу иметь возможность ввести привязку клавиши Vim, чтобы заключить текущее слово под курсором в двойные фигурные скобки.

С помощью плагина vim-surround я могу добавить нужные фигурные скобки к слову под курсором через ysiw}lysiw{, но это намного больше, чем я бы предпочел. Я пробовал следующую привязку клавиш Vim, но ее вызов в обычном режиме не дает никакого видимого эффекта:

" Wrap text under cursor with double curly braces (e.g., for Jinja variables)
nnoremap <C-J> ysiw}lysiw{

Итак, мои вопросы:

  1. Используя стандартные функции Vim, плагин vim-surround и/или любую другую комбинацию инструментов, как можно связать клавишу, которая будет переносить текущее слово под курсором с помощью двойных фигурных скобок с пробелами? например, nginx_root{{ nginx_root }}

  2. Есть ли способ добиться этого и в режиме вставки, когда курсор находится справа от слова? (nginx_root*, где * — позиция курсора)

  3. Как связать клавишу (предпочтительно доступную как в обычном режиме, так и в режиме вставки) для вставки {{ * }} в текущую позицию курсора, где * — позиция курсора после вставки? (Это облегчило бы ввод новых переменных Jinja, а не работу с переменными копирования + вставки, как указано выше.)


person Justin Mayer    schedule 14.09.2018    source источник


Ответы (2)


Исправление вашего сопоставления

Ваше сопоставление не работает, потому что оно использует :noremap. Правильно избегать переназначения (через часть nore команды), насколько это возможно, но поскольку вы вызываете сопоставление ys окружения. vim, нет (простого) способа обойти это:

nmap <C-J> ysiw}lysiw{

Альтернатива Surround.vim

Это двойное окружение неудобно и на самом деле не нужно, потому что плагин позволяет определять пользовательские замены, как :help surround-customizing.

Следующее определяет новую замену d (для "двойного"; 100 = char2nr('d')); с его помощью вы можете добавить двойные завитки к слову через ysiwd:

let g:surround_100 = "{{ \r }}"

Чтобы определить сопоставление только для определенных типов файлов, замените g: на b:. Я бы порекомендовал поместить это затем в ~/.vim/ftplugin/{filetype}_whatever.vim (или {filetype}/whatever.vim; см. :help ftplugin-name) вместо определения партий :autocmd FileType {filetype} ...; он чище и лучше масштабируется; однако требует, чтобы у вас было :filetype plugin on.

Ваши другие вопросы

Плагин Surround.vim также предлагает сопоставление режима вставки <C-g>s. Я бы рекомендовал не использовать сопоставления режимов вставки для таких правок; это противоречит модели Vim, основанной на режимах, и там доступно только несколько клавиш (и неудобные комбинации клавиш с Ctrl или Alt).

Для вставки шаблона подойдет простое сопоставление. Вы можете расположить курсор между добавленными фигурками с помощью специальных клавиш <Left>:

:nnoremap <C-g>d a{{  }}<Left><Left><Left>
:inoremap <C-g>d {{  }}<Left><Left><Left>
person Ingo Karkat    schedule 14.09.2018
comment
Блестящие предложения! Хотя он и не такой чистый/масштабируемый, для оболочки я выбрал однострочный: autocmd FileType ansible,ansible_template,htmljinja,htmldjango let b:surround_100 = "{{ \r }}" - person Justin Mayer; 14.09.2018
comment
Да, в таком случае ничто не сравнится с краткостью этой строчки! Если это отвечает на ваш вопрос, пожалуйста, не забудьте принять ответ. - person Ingo Karkat; 14.09.2018
comment
Принятый! Спасибо за подробные и точные ответы. Ты жжешь! - person Justin Mayer; 14.09.2018

Чтобы выполнить команды в обычном режиме, попробуйте

nnoremap <C-J> :normal ysiw}lysiw{<CR>

Подробнее см. :help normal.

person Hans Hohenfeld    schedule 14.09.2018
comment
Это работает, но решает проблему очень окольным путем. Достаточно просто переключиться на :nmap. - person Ingo Karkat; 14.09.2018