2010-06-23 27 views
1

EmacsWiki says使蝰蛇狀態的全球

有一種方法,使蝰蛇狀態和蝰蛇插入狀態全局的,就像在Vim的(也可能是六)。在Vim中(也許是vi),你在Normal模式下啓動。你可以切換緩衝區,Vim保持正常模式。按「i」將Vim置於插入模式。然後,如果通過單擊另一個窗口切換緩衝區,Vim將保持插入模式。您不必記住哪個緩衝區處於什麼模式,您只需要記住Vim處於哪種模式。

但不幸的是,他們沒有說這個方法是什麼,我也找不到它。有人知道嗎?

+1

看着毒蛇代碼,我看不到它是如何完成的 - 有大量的毒蛇狀態變量被定義爲緩衝區本地。不幸的是,沒有一個'set-buffer-hook'可以用來在切換緩衝區時觸發你想要的行爲。 – 2010-06-23 20:36:41

+0

謝謝!是的,那很不幸。 – 2010-06-23 20:42:43

回答

3

我不知道一個設置或包要做你想做的。它不是由毒蛇本身提供的。

這就是說,你可以寫一些advice這個工作。關鍵是你需要建議你切換緩衝區/窗口的所有方式。例如,如果通過other-window命令(CXØ)切換窗口,你會想這樣的:

(defadvice other-window (around other-window-maintain-viper-state activate 
         activate) 
    "when switching windows, pull the viper-current-state along" 
    (let ((old-window-state viper-current-state)) 
    ad-do-it 
    (viper-change-state old-window-state))) 

但是,使用鼠標通過該功能不走,並獲得該切換窗口工作,你需要以完全相同的方式來提醒select-window

(defadvice select-window (around select-window-maintain-viper-state activate 
          activate) 
    "when switching windows, pull the viper-current-state along" 
    (let ((old-window-state viper-current-state)) 
    ad-do-it 
    (viper-change-state old-window-state))) 

如果你發現你使用另一種機制來切換窗口/不使用上述緩衝區,它只是需要挖一點點(Mx describe-key)找出答案你應該建議什麼新的東西。