1

在使用 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 变量,而不是如上所述对复制+粘贴变量进行操作。)

4

2 回答 2

2

修复映射

您的映射不起作用,因为它使用:noremap. 尽可能避免重新映射(通过nore命令的一部分)是正确的,但是当您ys在那里调用环绕.vim 的映射时,没有(简单的)方法可以解决它:

nmap <C-J> ysiw}lysiw{

一个环绕.vim 的替代品

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

以下定义了一个新的替换d(for "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

你的其他问题

环绕.vim 插件还提供了插入模式<C-g>s映射。我建议不要对这些类型的编辑进行插入模式映射;这与 Vim 基于模式的模型背道而驰,那里只有几个(并且带有Ctrlor的键组合很尴尬Alt)可用。

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

:nnoremap <C-g>d a{{  }}<Left><Left><Left>
:inoremap <C-g>d {{  }}<Left><Left><Left>
于 2018-09-14T11:25:54.920 回答
0

为了执行正常模式命令,请尝试

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

详情请参阅:help normal

于 2018-09-14T10:40:22.487 回答