如何修改vim插件默认映射?
n <Space>x *@:ToggleCheckbox<CR>
我想取消这个bullets.vim插件的映射,用这个键来干别的事,请问要怎么做呢? 展开
一般情况下,你只要在 vimrc 里按你自己喜欢的方法定义 <space>x 这个映射就行了。因为 vimrc 最先加载,因此定义的映射也最早生效。其它插件在定义映射的时候,习惯上会用 :map <unique> 来避免覆盖已有映射,所以你不用担心自己定义的映射会被覆盖。
-----------------------------
正确编写的插件,上面的方法肯定奏效,一定要先试试看。
还有一些插件,提供了一些可以定义的选项来改变插件的行为,这就只能看插件的帮助文档(通常是英文的)来确定是不是有相关的选项了。但习惯上插件还是不能覆盖已有的映射。
再不行的话,最简单的建议就是不要用这个插件了。如果确实想用,可以看下面的做法,稍有些长。因为这一定程度上是在挽救别人插件的错误。
-----------------------------
你定义在 vimrc 里的映射如果被覆盖,说明插件没有遵循 vim 插件的一般原则。这时,除非你能比插件更晚定义映射,不然没有办法阻止插件覆盖你的定义。
分两种情况,如果这个有问题的插件是一般插件(即是定义在 plugin 下),那么你可以在 vimrc 里加一个自动命令:
au VimEnter * :map <space>x <something-you-want-to-do>
VimEnter 这个事件是在 vim 完成启动后触发的,这时所有插件已经加载完毕。因此这时定义的映射,可以覆盖已有的定义。当然上面代码里 <something-you-want-to-do> 的地方要换成实际的定义。
另一种插件是文件类型插件(定义在 ftplugin下),这些插件根据你编辑的文件按需加载,比如你编辑 file.c 时会加载对应 c 语言的插件,编辑 file.py 时会加载对应 python 的插件等等。这些插件在用的时候加载,因此加载的时机是不确定的。这时如果你想覆盖 c 语言插件定义的内容,需要在 after/c.vim 里加入你要定义的内容(如果没有这个文件你自己创建就好)。after 下的脚本会在其它相关的脚本加载之后再加载,所以可以覆盖已有的内容。c.vim 就用来覆盖 c 语言相关的内容。
但这也不保证成功,因为现在的插件一般可以用 autoload 的机制来延迟加载。这时你没有办法预知代码何时会运行。习惯上不能在 autoload 中定义映射就有这个考虑。
最后的办法,是找到定义映射的那个插件,然后手动改掉相关的定义。但这种做法有不确定性,比如乱改别人的代码可能会导致插件崩溃。像你这种只改个映射可能还好。最重要的是,作者可能不知道这个 bug,将来更新插件什么的,你改的东西又没了,还得再改一遍。因此改别人的代码是下策。
好在你知道这个映射是 bullets.vim 定义的,看名字可能是个普通插件,所以如果 vimrc 的方法不行,优先采用自动命令的方法试一试。
------------------------------------
顺带提一下,取消这个键映射后,你可以执行
:ToggleCheckbox
来完成这个映射本来的功能。
如果这个功能你觉得很常用,只是不习惯用默认的映射,可以在 vimrc 里加上:
nnoremap <key-sequence> :ToggleCheckbox<CR>
<key-sequence> 那里换成你自己希望的键序列。
如果还有其它疑惑欢迎追问。
说得很全面了,但是仍有点疑问,难道不是后加载的插件定义的映射会覆盖vimrc的映射吗?还是说vim识别到按键已被映射,所以插件映射配置不会生效?
编写插件通常遵循的约定是:如果默认使用的按键已被映射,就不应覆盖。所以正常情况,你只要保证自己能最早定义就行了(写在 vimrc 里就能保证)。这个约定不是强制的,所以如果插件有特殊目的,或者写插件的人不知道这个约定,那么的确是后定义的覆盖前面的。
先进入vim,然后输入:
:unmap <space>x
上面命令是解除"<space>x"映射
然后应该就可以重新使用map进行你自定义的映射了.
你先看一下行吗, 如果行的话,可以将上面解除绑定及自定义映射写入~/.vimrc文件,就不用每次打开vim都重新设置了.
希望对你有帮助,上面的描述我没有去试,你看看行吗?不行的话追问,咱一起研究研究