Vim绑定以双大括号将单词包装在光标下
在使用Jinja模板和YAML进行Ansible配置时,我经常复制并粘贴一个变量名(比如,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
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{
因此,我的问题是:
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>