Vim绑定以双大括号将单词包装在光标下

Vim绑定以双大括号将单词包装在光标下,vim,vim-plugin,surround,Vim,Vim Plugin,Surround,在使用Jinja模板和YAML进行Ansible配置时,我经常复制并粘贴一个变量名(比如,nginx_root),然后需要将其用双大括号括起来:{{nginx_root}。手动执行这项操作会很麻烦,因此我希望能够键入一个Vim键绑定,将当前单词用双大括号括在光标下 使用,我可以通过ysiw}lysiw{向光标下的单词添加所需的大括号,但这比我希望的要多。我尝试了以下Vim键绑定,但在正常模式下调用它根本没有明显效果: " Wrap text under cursor with double cu

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

使用,我可以通过
ysiw}lysiw{
向光标下的单词添加所需的大括号,但这比我希望的要多。我尝试了以下Vim键绑定,但在正常模式下调用它根本没有明显效果:

" Wrap text under cursor with double curly braces (e.g., for Jinja variables)
nnoremap <C-J> ysiw}lysiw{
“用双大括号将文本包裹在光标下(例如,用于Jinja变量)
nnoremap ysiw}lysiw{
因此,我的问题是:

  • 使用stock Vim功能、和/或任何其他工具组合,如何绑定将当前单词用空格填充的双大括号括在光标下的键?例如,
    nginx_root
    → <代码>{{nginx_root}}

  • 在插入模式下,光标正好位于单词右侧,是否也有办法实现这一点?(
    nginx\u root*
    ,其中
    *
    是光标位置)

  • 如何绑定一个键(最好在正常和插入模式下可用)在当前光标位置插入
    {*}
    ,其中
    *
    是插入后光标的位置?(这将有助于输入新的Jinja变量,而不是如上所述对复制+粘贴的变量进行操作。)


  • 要执行正常模式命令,请尝试

    nnoremap <C-J> :normal ysiw}lysiw{<CR>
    
    nnoremap:normal ysiw}lysiw{
    
    有关详细信息,请参见
    :帮助正常化

    修复映射 您的映射不起作用,因为它使用了
    :noremap
    。尽可能避免重新映射(通过命令的
    nore
    部分)是正确的,但是当您调用环绕时。vim的
    ys
    映射在其中,没有(简单的)方法:

    nmap <C-J> ysiw}lysiw{
    
    要仅定义某些文件类型的映射,请将
    g:
    替换为
    b:
    。我建议将其放入
    ~/.vim/ftplugin/{filetype}{u whatever.vim
    (或
    {filetype}/whatever.vim
    ;cp.
    :help ftplugin name
    )中,而不是定义大量的
    :autocmd filetype{filetype}…
    ;它更干净,可扩展性更好;但要求您在
    上有
    :文件类型插件

    你的其他问题 surround.vim插件还提供了一个插入模式
    s
    映射。我建议不要在这些编辑中使用插入模式映射;这是针对vim基于模式的模型的,并且只有很少的键(以及与Ctrl或Alt组合的笨拙键)可用

    要插入模板,只需简单的映射即可。您可以通过特殊的
    键将光标定位在添加的卷曲之间:

    :nnoremap <C-g>d a{{  }}<Left><Left><Left>
    :inoremap <C-g>d {{  }}<Left><Left><Left>
    
    :nnoremap d a{{}
    :inoremap d{{}
    
    这是可行的,但它以一种非常迂回的方式解决了这个问题。只要切换到
    :nmap
    就足够了。很棒的建议!虽然没有那么干净/可伸缩,但对于包装器,我选择了一行:
    autocmd文件类型ansible,ansible_模板,htmljinja,htmldjango let b:round_100=“{\r}“
    是的,在这种情况下,没有什么比这句话更简洁了!如果这句话回答了你的问题,请别忘了接受答案。接受!感谢你提供的详细和准确的答案。你太棒了!
    :nnoremap <C-g>d a{{  }}<Left><Left><Left>
    :inoremap <C-g>d {{  }}<Left><Left><Left>