对于不同的Vim插件,您可以有不同的localleader吗?

对于不同的Vim插件,您可以有不同的localleader吗?,vim,plugins,vim-plugin,Vim,Plugins,Vim Plugin,我开始使用一个与我现有地图冲突的插件,但我不想重新映射它的所有地图,我只想添加一个前缀。我想我可以和LocalLeader一起做这件事 维姆多克说: 与类似,只是它使用 “maplocalleader”而不是“mapleader”将被使用 对于缓冲区的本地映射 似乎设置localleader的唯一方法是设置一个全局变量(文档中没有提到这一点,但是b:maplocalleader不起作用): 我看不出我该如何彻底地取消设置该变量(一个在安装插件后清除它的autocmd!) 有办法做到这一点吗?或者

我开始使用一个与我现有地图冲突的插件,但我不想重新映射它的所有地图,我只想添加一个前缀。我想我可以和LocalLeader一起做这件事

维姆多克说:

类似,只是它使用 “maplocalleader”而不是“mapleader”<代码>将被使用 对于缓冲区的本地映射

似乎设置localleader的唯一方法是设置一个全局变量(文档中没有提到这一点,但是
b:maplocalleader
不起作用):

我看不出我该如何彻底地取消设置该变量(一个在安装插件后清除它的autocmd!)


有办法做到这一点吗?或者LocalLeader只提供一个全局前缀和一个特定于文件类型的前缀?

您最后的直觉是正确的。如果插件使用
(除非它是文件类型插件,否则应该使用),那么使用
maplocalleader
是没有用的


重新映射通常是通过
映射来完成的,插件希望提供这种映射。一些插件确实定义了许多类似的映射,其中一些插件定义了一个
g:pluginname\u mappingprefix
(大约)变量,以避免您需要单独重新映射所有映射。如果你的插件没有,可能会给插件作者写一个建议/补丁。

虽然@IngoKarkat解决方案是首选方案,但有一个黑客可以让你做你想做的事情:
SourcePre
事件:

autocmd SourcePre *               :let maplocalleader='\\'
autocmd SourcePre plugin-name.vim :let maplocalleader='_'
。这也适用于
。但是,在很多情况下,这是行不通的。对于此作业,您也可以使用
SourceCmd
,例如

function s:Source(newmll)
    try
        let oldmll=g:maplocalleader
        let g:maplocalleader=a:newmll
        source <amatch>
    finally
        let g:maplocalleader=oldmll
    endtry
endfunction
let maplocalleader='\\'
autocmd SourceCmd plugin-name.vim :call s:Source('_')
函数s:源(newmll)
尝试
设oldmll=g:maplocalleader
设g:mapplocalleader=a:newmll
来源
最后
设g:maplocalleader=oldmll
末日
端功能
让maplocalleader='\\'
autocmd SourceCmd plugin-name.vim:调用s:Source(“”)

SourceCmd
中,是我看到的在插件来源之后恢复
maplocalleader
的唯一方法,但是
SourceCmd
事件不会针对
plugin name.vim
中来源的任何文件启动。对于一些写得不好的插件(我的意思是,那些在源代码时发出错误的插件),将
:source
放在
:try
块中会在错误发生时中断执行。但大多数情况下都不应该发生。您可能还希望使用
*/ftplugin/plugin name.vim
作为模式,而不是
plugin name.vim

,因此在我的例子中,我必须要求插件作者添加指定自定义前缀的功能?(我想如果他们保存当前值,设置配置值,并在完成后恢复保存的值,他们可以使用LocalLeader来完成这项工作。)如果存在
映射,插件(您没有告诉我们其名称)就不需要更改,对于许多映射来说这只是一个乏味的过程。自定义前缀更像是
c
,c
;正如我所说,LocalLeader用于缓冲区本地映射。
function s:Source(newmll)
    try
        let oldmll=g:maplocalleader
        let g:maplocalleader=a:newmll
        source <amatch>
    finally
        let g:maplocalleader=oldmll
    endtry
endfunction
let maplocalleader='\\'
autocmd SourceCmd plugin-name.vim :call s:Source('_')