在退出minibuffer时,防止Emacs Evil自动切换到正常模式

3
我是一个使用Emacs的恶魔用户。然而,我仅在发现它们比普通的Emacs命令更方便时才使用正常模式进行花式Vim样式编辑(主要是花式批量编辑/复制/删除)。但是,我也是minibuffer的重度用户(我经常使用ido和flx进行M-x,这样我就可以避免记住更深奥的命令)。当我这样做时,退出后evil会自动切换到正常模式。我发现这非常烦人/令人困惑。我该如何停止它?(最好以一种优雅、非hackish的方式)。
谢谢, PythonNut
编辑: 看起来在所有窗口和所有框架中都会自动切换到正常模式。

实际上,在检查时,似乎正常模式的切换发生在我进入迷你缓冲区时,而不是退出它时。有趣的是,minibuffer-setup-hook 的内容不包括任何恶意钩子。它的内容为(minibuffer-depth-setup icicle-minibuffer-setup ido-minibuffer-setup auto-indent-minibuffer-hook rfn-eshadow-setup-minibuffer minibuffer-history-isearch-setup minibuffer-history-initialize) - PythonNut
2个回答

1
我无法重现你的问题;也许了解你的版本信息可以帮助任何人识别你的问题。你能用 "emacs -q" 重现你的问题吗?以下是一种方法,可以识别是否有任何调用到 evil-normal-state 的恶意(传统英语含义)代码片段:
(defadvice evil-normal-state (before debug-issue activate)
  (setq debug-on-error t)
  (inexisting-function-will-fail))

在设置所需的evil状态后,请立即对其进行评估,然后使用M-x进入minibuffer。是否有堆栈跟踪?


它在emacs -Q中不会发生。我确实收到一个错误:Error in post-command-hook (evil-mode-check-buffers): (void-function ...) - PythonNut
好的,我通过二分查找找到了问题所在。我将邪恶包装在自己的全局模式中,这样我就可以在任何地方使用邪恶了。但是如果没有它,我怎么才能获得全局模式的行为呢? - PythonNut
我自己解决了 :). 你赢得了悬赏。 - PythonNut

1

您可以通过将激活 evil-mode 的函数添加到 minibuffer-exit-hook 中来重新激活它。


无论发生什么,都会在调用minibuffer-exit-hook之后发生。(add-hook 'minibuffer-exit-hook 'evil-emacs-state)不会阻止切换到正常模式的更改。 - PythonNut
我对 evil-emacs-state 不太熟悉,所以无法发表评论,但使用这个钩子 (run-with-timer 0.2 nil 'evil-emacs-state)(配合一个lambda)怎么样?这有点像黑客技巧:代码将在退出 minibuffer 后延迟0.2秒运行。 - juanleon
可以工作,但是evil似乎仍然对状态感到困惑。我的modeline由evil状态着色,尽管evil实际上处于插入模式,但它仍然处于正常模式。 - PythonNut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接