5

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

Vimdoc 说:

<LocalLeader>就像<Leader>,只是它使用“maplocalleader”而不是“mapleader”。 <LocalLeader>将用于缓冲区本地的映射。

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

let maplocalleader = '\\'

而且我看不到我如何干净地取消设置该变量(设置插件后清除它的自动命令!?)

有没有办法做到这一点?还是 LocalLeader 只给出一个全局前缀和一个特定于文件类型的前缀?

4

2 回答 2

3

你最后的预感是正确的。如果插件使用<Leader>(除非它是文件类型插件,否则它应该使用),那么搞乱maplocalleader.

<Plug>重新映射是通过插件希望提供的映射规范地完成的。一些插件确实定义了很多类似的映射,其中一些定义了一个g:pluginname_mappingprefix(或左右)变量,以使您不必单独重新映射所有映射。如果你的插件没有,也许写一个建议/补丁给插件作者。

于 2012-08-22T15:35:26.237 回答
2

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

autocmd SourcePre *               :let maplocalleader='\\'
autocmd SourcePre plugin-name.vim :let maplocalleader='_'

. 这也适用<Leader>。但是,在很多情况下这不起作用。你也可以使用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('_')

in是我看到插件获取后SourceCmd恢复的唯一方法,但是这里的事件不会为任何来自内部的文件启动。对于一些写得不好的插件(我的意思是那些在源代码中发出错误的插件)放在一个块中会在错误发生的地方中断执行。不过大部分时间都不应该发生。您可能还想使用作为模式而不是.maplocalleaderSourceCmdplugin-name.vim:source:try*/ftplugin/plugin-name.vimplugin-name.vim

于 2012-08-22T16:37:51.497 回答