2016-01-08 74 views
0

我的Ruby折叠表达式导致自动完成(<C-n>/<C-p>)显着减慢,这是一个巨大的痛苦。当我切换到手动折叠时,自动完成变为即时。Vim:如何用一个使用旧命令的新命令覆盖命令?

要解决这个问题,我希望折叠是“按需”,即它只在我做zxzX时计算折叠。该计划:

  1. 集Ruby代码默认折叠方法manual
  2. 当打开一个Ruby文件,本地地图zx切换折叠方法expr和运行zx,然后切换折叠方法回到manual
  3. 重复#2 zX

的问题是,当我重写zx,我怎么叫“老” zx


完美的答案肯特,这是我最后的工作液(ftplugin/ruby.vim):

if &filetype == 'ruby' 
    setlocal foldmethod=manual 
    nn <buffer> <silent> zx :set foldmethod=expr<CR>:norm! zx<CR>:set foldmethod=manual<CR> 
    nn <buffer> <silent> zX :set foldmethod=expr<CR>:norm! zX<CR>:set foldmethod=manual<CR> 
end 
+0

我不知道我理解你的权利......但你可以调用':norm! zx'来绕过你的映射。 – Kent

+0

我想到的一个方法是使用':norm! zx'。但我会等待,因为别人可能会有更有趣的解决方案。无论如何,考虑到如果你走这条路线,当你输入你的ruby缓冲区时,你可以使用自动命令来创建地图,所以其他人将使用“原始”的“zx”。另外,您是否正在扫描包含的文件?这通常会导致一些缓慢 – sidyll

+0

对不起@Kent我想我写在同一时间 – sidyll

回答

2

:normal命令,就可以执行普通模式的命令。如果你添加了!,你将绕过映射。以你为例,

:norm! zx 

可能有帮助。

3

使用:noremap系列命令而不是简单的:map,可防止任何映射以递归方式触发。因此,只需直接使用zx,就可以在映射内部安全地调用“旧”zx。示例为您的情况:

nnoremap <buffer> <silent> zx :set foldmethod=expr<CR>zx:set foldmethod=manual<CR> 
+0

所以这就是映射的“nore”部分的意思,很好 – Hubro