【问题标题】:emacs: Can't Kill Minibufferemacs:无法杀死 Minibuffer
【发布时间】:2014-05-09 16:18:02
【问题描述】:

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

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

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

Next element matching (regexp):

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

Next element matching (regexp): 

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

我似乎也能够很好地运行其他迷你缓冲区命令(例如文件搜索),即使我被这样卡住了。

有没有一种方法可以让我执行以下操作之一:

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

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

【问题讨论】:

    标签: emacs elisp kill minibuffer


    【解决方案1】:

    这样做:

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

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

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

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

    【讨论】:

    • 这似乎是导致我的问题的原因。不过,您提供的那段代码不会删除 M-s 的本地地图。有什么建议或地方可以找到解决方法吗?
    • 我怀疑M-s 是否有本地地图。 Isearch 使用M-s 作为前缀,但这不应该干扰,您可能希望能够在 minibuffer 中使用 Isearch。你试过我的建议了吗?为我工作。如果它不适合您,请尝试使用 emacs -Q 启动 Emacs。如果它可以工作(没有你的 init 文件),找出你的 init 文件的哪一部分冲突。也许您加载的某些内容会再次使用M-s
    • 实际上,它确实有效。需要重新启动 emacs。仅仅运行M-x eval-buffer 是不够的。 help-fns+.el 库也很有帮助。谢谢!
    【解决方案2】:

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

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

    您可以做的一个改变是改变您的行为,并使用 C-g 退出搜索,并返回您正在搜索的缓冲区。如果您使用的 Emacs 没有您的自定义功能,那么了解这一点非常有用。您也可以使用 M-s M-s 切换回 into minibuffer,然后然后使用 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)))
    

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-25
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-24
        • 2013-12-25
        相关资源
        最近更新 更多