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{
因此,我的问题是:
使用标准 Vim 功能,vim-surround plugin,and/or 任何其他工具组合,如何绑定将当前单词换行的键带有 space 填充双花括号的光标?例如,nginx_root
→ {{ nginx_root }}
有没有办法在插入模式下也能做到这一点,光标就在单词的右边? (nginx_root*
,其中*
为光标位置)
如何绑定一个键(最好在普通模式和插入模式下都可用)以在当前光标位置插入{{ * }}
,其中*
是光标的位置插入后的光标? (这将有助于输入新的 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 的基于模式的模型,并且只有少数(以及与 Ctrl 或 Alt 的笨拙组合)键可用那里。
要插入模板,一个简单的映射就可以了。您可以通过特殊的 <Left>
键将光标定位在添加的卷曲之间:
:nnoremap <C-g>d a{{ }}<Left><Left><Left>
:inoremap <C-g>d {{ }}<Left><Left><Left>
在使用 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{
因此,我的问题是:
使用标准 Vim 功能,vim-surround plugin,and/or 任何其他工具组合,如何绑定将当前单词换行的键带有 space 填充双花括号的光标?例如,
nginx_root
→{{ nginx_root }}
有没有办法在插入模式下也能做到这一点,光标就在单词的右边? (
nginx_root*
,其中*
为光标位置)如何绑定一个键(最好在普通模式和插入模式下都可用)以在当前光标位置插入
{{ * }}
,其中*
是光标的位置插入后的光标? (这将有助于输入新的 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 的基于模式的模型,并且只有少数(以及与 Ctrl 或 Alt 的笨拙组合)键可用那里。
要插入模板,一个简单的映射就可以了。您可以通过特殊的 <Left>
键将光标定位在添加的卷曲之间:
:nnoremap <C-g>d a{{ }}<Left><Left><Left>
:inoremap <C-g>d {{ }}<Left><Left><Left>