5

我对 emacs 相当陌生,当我认为它不应该保持活动状态时,我遇到了 minibuffer 保持活动状态的问题。我对“其他窗口”有以下映射:

 (global-set-key (kbd "M-s M-s") 'other-window)

我知道如果它处于活动状态,这将在 minibuffer 中循环,我喜欢这种行为。问题是我的迷你缓冲区一直卡在以下状态:

Next element matching (regexp):

有时当我什至不尝试进行正则表达式搜索甚至根本不进行搜索时,它就会进入那里。当我C-g击杀它时,我收到了Quit消息,但 minibuffer 保持活动状态并立即返回

Next element matching (regexp): 

此外,当它处于这种状态时,我无法使用M-s M-s它进入框架中的下一个窗口。C-x o不过似乎仍然有效。

我似乎也能够很好地运行其他 minibuffer commnands(例如文件搜索),即使我被这样卡住了。

有没有办法可以执行以下操作之一:

  1. 在该模式下终止 minibuffer。
  2. 设置我的自定义“其他窗口M-s M-s功能”以退出迷你缓冲区并进入下一个窗口?

任何一种解决方案都可以,尽管第一个解决方案可能会更好,因为让 minibuffer 卡住可能会产生其他意想不到的后果。

4

3 回答 3

5

只需这样做:

(define-key minibuffer-local-map "\M-s" nil)

问题是它M-s在小缓冲区(在minibuffer-local-must-match-map和其他小缓冲区键映射中)本地绑定到next-matching-history-element,它为您提供提示并让您搜索历史记录。

您需要做的是M-s在每个 minibuffer 键映射中取消绑定:即将它绑定到nil. 其中一些地图继承自其他地图;minibuffer-local-map应该照顾它,但你可能想为minibuffer-local-ns-map. M-x apropos-variable minibuffer map告诉你所有的地图。

[您可以使用C-h M-k来查看任何键映射的绑定,例如minibuffer-local-must-match-map-- 它在 library 中可用help-fns+.el。]

于 2014-05-09T17:02:06.573 回答
1

您现在已经知道问题出在哪里了。至于如何摆脱它,请使用C-].

于 2014-05-09T18:06:14.233 回答
1

可能发生的事情是您正在进行搜索(因此是 prompt Next element matching (regexp):),并使用 yourM-s M-s来停止搜索。

这实际上只是切换到不同的缓冲区,但保持搜索处于活动状态。

您可以做的一项更改是更改您的行为,并使用C-g退出搜索,并将您返回到您正在搜索的缓冲区。如果您使用的 Emacs 没有您的自定义功能,那么了解这一点非常有用。您也可以使用M-s M-s切换回迷你缓冲区,然后使用 退出C-g

但是,我认为您的绑定可以通过以下方式更新:

(global-set-key (kbd "M-s M-s") 'my-other-window)

(defun my-other-window (count)
  (interactive "p")
  (if (and (>= (recursion-depth) 1) (active-minibuffer-window))
      (abort-recursive-edit)
    (other-window count)))

如果它处于活动状态,它将自动退出迷你缓冲区(并隐式切换回原始缓冲区),否则它只会根据要求切换窗口。

于 2014-05-09T16:34:59.577 回答