2016-01-08 73 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