Vim 将光标下的单词绑定到双花括号中

Vim binding to wrap word under cursor in double curly braces

在使用 Jinja 模板和 YAML 进行 Ansible 配置时,我经常复制并粘贴一个变量名(例如,nginx_root),然后需要将其用双花括号括起来:{{ nginx_root }}。手动操作会很麻烦,所以我希望能够键入一个 Vim 键绑定,将当前单词用双花括号包裹在光标下。

使用 vim-surround plugin,我可以通过 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 plugin,and/or 任何其他工具组合,如何绑定将当前单词换行的键带有 space 填充双花括号的光标?例如,nginx_root{{ nginx_root }}

  2. 有没有办法在插入模式下也能做到这一点,光标就在单词的右边? (nginx_root*,其中*为光标位置)

  3. 如何绑定一个键(最好在普通模式和插入模式下都可用)以在当前光标位置插入{{ * }},其中*是光标的位置插入后的光标? (这将有助于输入新的 Jinja 变量,而不是像上面提到的那样对复制+粘贴的变量进行操作。)

为了执行普通模式命令,尝试

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

详情见:help normal

修复映射

您的映射不起作用,因为它使用了 :noremap。尽可能避免重新映射(通过命令的 nore 部分)是正确的,但是当你在那里调用 surround.vim 的 ys 映射时,没有(容易) 绕过它:

nmap <C-J> ysiw}lysiw{

一个surround.vim备选方案

双重包围很尴尬,实际上没有必要,因为插件允许根据 :help surround-customizing.

定义自定义替换

下面定义了 d 上的新替换(对于 "double";100 = char2nr('d'));有了它,您可以通过 ysiwd:

向单词添加双卷曲
let g:surround_100 = "{{ \r }}"

要仅为特定文件类型定义映射,请将 g: 替换为 b:。我建议将其放入 ~/.vim/ftplugin/{filetype}_whatever.vim(或 {filetype}/whatever.vim;cp.:help ftplugin-name),而不是定义很多 :autocmd FileType {filetype} ...;它更干净,扩展性更好;不过,需要您有 :filetype plugin on

您的其他问题

surround.vim 插件还提供插入模式 <C-g>s 映射。我建议不要对这些类型的编辑使用插入模式映射;它反对 Vim 的基于模式的模型,并且只有少数(以及与 CtrlAlt 的笨拙组合)键可用那里。

要插入模板,一个简单的映射就可以了。您可以通过特殊的 <Left> 键将光标定位在添加的卷曲之间:

:nnoremap <C-g>d a{{  }}<Left><Left><Left>
:inoremap <C-g>d {{  }}<Left><Left><Left>