【问题标题】:Making Viper state global使 Viper 状态全球化
【发布时间】:2010-06-23 19:59:16
【问题描述】:

EmacsWiki says:

有一种方法可以使 Viper 状态和 Viper 插入状态全局化,就像在 Vim(可能还​​有 vi)中一样。在 Vim(可能还​​有 vi)中,您从普通模式开始。你可以切换缓冲区,Vim 保持在正常模式。按“i”将 Vim 置于插入模式。然后,如果您通过单击另一个窗口来切换缓冲区,Vim 将停留在插入模式。你不必记住哪个缓冲区处于什么模式,你只需要记住 Vim 是什么模式。

但是很遗憾,他们没有说这个方法是什么,我也没有很快找到。有人知道吗?

【问题讨论】:

  • 查看 viper 代码,我不明白它是如何完成的 - 有大量 viper 状态变量被定义为缓冲区本地。而且,不幸的是,没有一个“set-buffer-hook”可以用来触发你在切换缓冲区时想要的行为。
  • 谢谢!是的,这很不幸。

标签: vim emacs viper-mode


【解决方案1】:

我不知道一个单一的设置或包来做你想做的事。它不是 viper 本身提供的。

也就是说,你可以写一些 advice 来完成这项工作。关键是您需要建议您切换缓冲区/窗口的所有方式。例如,如果您通过 other-window 命令 (C-x o) 切换窗口,您会想要这样:

(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)))

如果你发现你使用了另一种机制来切换不使用上述方法的窗口/缓冲区,只需一点点挖掘 (M-x describe-key ) 就可以找出什么新东西你应该提供建议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-08
    • 2010-11-18
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    相关资源
    最近更新 更多