Vim:如何使用旧命令覆盖命令?

时间:2016-01-08 13:44:00

标签: vim

我的Ruby折叠表达式导致自动完成(<C-n> / <C-p>)显着减速,这是一个巨大的痛苦。当我切换到手动折叠时,自动完成变为即时。

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

  1. 将Ruby代码默认折叠方法设置为manual
  2. 打开Ruby文件时,本地映射zx以将折叠方法切换为expr并运行zx,然后将折叠方法切换回manual
  3. zX
  4. 重复#2

    问题是,当我覆盖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
    

2 个答案:

答案 0 :(得分:3)

使用:noremap系列命令而不是普通:map,可以防止任何映射以递归方式触发。因此,您可以直接使用zx安全地调用映射中的“旧”zx。案例:

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

答案 1 :(得分:2)

使用:normal命令,可以执行NORMAL模式命令。如果您添加了!,则会绕过映射。对于你的例子,

:norm! zx

可能会有所帮助。