如何在Vim中为特定插件重新映射键。

3

是否有一种常见的方法来重新映射特定Vim插件中使用的键,例如NERDTree或TagList?我一直在尝试重新映射TagList插件的某些键,但一直无法做到。NERDTree的键更容易重新映射,但这是因为插件编写的方式吗?


1
是的,插件必须支持用户定义的映射,否则大多数通用方式都无法进行重新映射(虽然有一些解决方法)。与内置快捷键不同,您不能执行类似于 noremap : ; | noremap ; : 的操作,并期望它适用于插件快捷键,但是您可以使用类似于 这个(您需要查看代码直到标记为“Create a new mapping with unique lhs”的行)的东西。 - ZyX
你想要“释放”插件使用的键吗?如果不需要,简单的映射就可以解决问题。否则,你必须依赖于插件来给你这种映射自由。 - Maxim Sloyko
简单的方法是修改插件源代码。搜索“map”,并更改键绑定。问题是:如果您升级了插件,您需要再次进行修改。 - kev
2个回答

2
现代插件可以像内置的vim命令一样被重映射,如果它们使用<Plug>:help using-<Plug>)。插件可以检查用户是否将某些内容映射到了<Plug>命令(例如:<Plug>(textobj-indent-a)),如果没有,则使用自己的映射。这样,用户可以定义他们想要的映射,插件会填充其余部分。
在rkulla的答案中,他展示了NERD_tree的映射代码。他们提供变量供用户设置以更改他们的映射。
let g:NERDTreeMapDeleteBookmark = 'A'
let g:NERDTreeMapMenu = 'B'
let g:NERDTreeMapHelp = 'C'

以下语句可添加到您的vimrc文件中,以定义自己的映射(而非更改插件代码)。

其他插件将使用类似no_nerdtree_maps的变量(每个插件名称不同)。如果您在vimrc中设置了此变量,则可以为插件的函数/命令创建自己的映射。


0

只需在您的插件目录中打开NERD_tree.vim,您将看到一个名为“键映射的初始化变量调用”的部分,其中包含如下调用:

call s:initVariable("g:NERDTreeMapDeleteBookmark", "D")
call s:initVariable("g:NERDTreeMapMenu", "m")
call s:initVariable("g:NERDTreeMapHelp", "?")

...

s:initVariable() 的第二个参数是要使用的键盘快捷方式。只需将其更改为您想要的即可。


1
我强烈建议除非您是开发人员并且拥有受VCS控制的此插件的fork(因此您可以将更改放置在那里),否则不要更改插件的代码:当您更新修改后的插件时,所有操作都会被抹掉。在您的情况下,我认为s:initVariable函数将在尚未定义变量时初始化变量,因此您只需要在vimrc中定义此变量即可。 - ZyX
好的。我以为他是在暗示说,由于某些冲突或其他原因,这样的方法对他不起作用。 - rkulla
我已经成功地将NERDTree的按键重新映射到我自己喜欢的方式。但是正如我所说,我想知道是否有更通用的方法来做到这一点,因为我无法重新映射TagList的按键,因为它们不提供像NERDTree那样重新映射按键的方式。 - bow

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