【问题标题】:Vim binding to wrap word under cursor in double curly bracesVim 绑定以在双花括号中将光标下的单词换行
【发布时间】:2018-09-14 10:24:32
【问题描述】:

在使用 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 和/或任何其他工具组合,如何使用空格填充的双花括号绑定将光标下当前单词包裹起来的键?例如,nginx_root{{ nginx_root }}

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

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

【问题讨论】:

    标签: vim vim-plugin surround


    【解决方案1】:

    修复映射

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

    nmap <C-J> ysiw}lysiw{
    

    环绕.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 插件还提供插入模式&lt;C-g&gt;s 映射。我建议不要对这些类型的编辑进行插入模式映射;这违背了 Vim 基于模式的模型,并且那里只有几个(以及与 CtrlAlt 的尴尬组合键)可用的键。

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

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

    【讨论】:

    • 绝妙的建议!虽然没有那么干净/可扩展,但对于包装器,我选择了单线:autocmd FileType ansible,ansible_template,htmljinja,htmldjango let b:surround_100 = "{{ \r }}"
    • 是的,在这种情况下,没有什么比那条线的简洁性更胜一筹了!如果这回答了您的问题,请不要忘记接受答案。
    • 接受!感谢您提供详细而准确的答案。你摇滚!
    【解决方案2】:

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

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

    详情请见:help normal

    【讨论】:

    • 这行得通,但它以一种非常迂回的方式解决了问题。只需切换到:nmap 就足够了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    相关资源
    最近更新 更多