Vim正常模式下CTRL-A的同义词是什么?

7
我有一个想法,认为Vim正常模式下的<C-a>不仅应该增加数字,还应该切换布尔值。如果你将truefalse视为2的整数次幂,那么这一点就很有意义。

于是,我下载了一个优秀的脚本来完成这个棘手的工作,并编写了一个新的<C-a>定义:

fun! NewCA()
    let cw = tolower(expand("<cword>"))
    if cw == "true" || cw == "false"
        ToggleWord
    else
        " run the built-in <C-a>
        execute "normal \<C-a>"
    endif
endfun
command! NewCA :call NewCA()
nnoremap <C-a> :NewCA<cr>

但事实上,nnoremap并没有检查函数内部。如果我的光标不在单词truefalse上,我会得到递归行为。

在这一点上,我发誓很多,为什么Bram没有从Emacs中挑选一个绝妙的想法,即一切都应该是函数和可自由设置的键绑定。然后,我只需要检查<C-a>函数并在该函数中调用它。但是没有,我找不到这样的函数,而execute "normal foo"短语似乎是Vim的习惯用法。

有什么建议可以使<C-a>按以下方式工作:

  • 当光标位于单词truefalse上时,切换布尔值
  • 否则回退到内置的<C-a>行为

感谢您的帮助!

2个回答

13

execute "normal \<C-a>"
更改为:

normal! ^A

您可以在正常模式下运行

<C-v><C-a>
来获取^A

末尾的"!"表示"使用默认映射"


1
两个答案都有相同的正确解决方案。我将此选为被接受的答案,只是为了欢迎您加入社区。 :) - mike3996

6

From :help :normal

:norm[al][!] {commands}     
...
If the [!] is given, mappings will not be used.
....

此处无需定义命令,您可以直接进行操作。
nnoremap <C-a> :call NewCA()

哦,我感觉自己太菜了!我应该更仔细地阅读文档。非常感谢你。事实上,我有一个多余的“command!”语句用于调试目的,你是对的。 :) - mike3996
请注意,映射需要像这样的最终 <cr>nnoremap <C-a> :call NewCA()<cr> - radke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接