如何在Emacs中进入迷你缓冲区以进行编辑?

3
运行某些命令时,迷你缓冲区会要求输入字符串(例如C-M-s)。
有时我需要在迷你缓冲区中输入复杂的字符串。��此,我需要使用移动命令,如C-f、C-b、C-a等。但是,当我在命令C-M-s中输入字符串时,这些命令无法正常工作。
那么,有没有通用的命令/键绑定让我可以在迷你缓冲区中移动光标以获得更好的支持?
编辑:
我刚刚发现M-e可以用来搜索命令。但我不确定这个命令是否是“从缓冲区切换到迷你缓冲区进行专用编辑”的通用命令。

1
"isearch-edit-string" 是一个特殊的动物。在正常使用向前或向后的isearch时,用户并不真正处于mini-buffer内部——它只是看起来像这样。"isearch-edit-string"则将焦点放在迷你缓冲区内进行编辑。你可能想到的是类似于“read-tring”等东西。 - lawlist
@lawlist,感谢你的建议。让我再玩一会儿代码。 - modeller
Isearch基本上是唯一的“有点在minibuffer中但又不完全在其中”的东西。可能还有其他的,但这并没有标准化,所以没有通用的“真正进入minibuffer”的方法。每种情况都应该提供与Isearch的M-e相当的等效物。 - Stefan
2个回答

3
  1. 如果你想编辑搜索字符串,那么M-e正是你需要的。它可以让你对其进行一般性编辑。当你准备好搜索编辑后的字符串时,只需再次按下C-sC-M-s即可。

  2. 然而,M-e仅适用于编辑搜索字符串。如果你想在isearch中断以进行某些编辑操作,则只需结束isearch进行编辑,然后再次使用C-sC-M-s恢复isearch即可。


1

我一直很喜欢使用这些快捷键,将它们绑定到我的Mac键盘上的功能按钮和箭头键上。我经常阻止并复制文本,并在小缓冲区内移动。以下示例释放了minibuffer-local-mapminibuffer-local-completion-map中一些键映射分配(即通过将它们设置为nil),以便我可以使用自己的自定义键盘快捷键进入和退出小缓冲区。

从小缓冲区内部,您可以使用C-h k,然后输入键盘快捷键查看绑定的函数。

当我在小缓冲区窗口内外切换时,我使用自定义函数来更改模式行颜色、小缓冲区提示颜色和小缓冲区内的默认颜色,但这超出了您的问题范围。[我只是在以下四个函数的末尾添加了我的小缓冲区颜色更改函数的名称 - 即在if / then语句之后。]

(defun lawlist-windmove-right ()
(interactive)
  (if (window-in-direction 'right)
    (select-window (window-in-direction 'right))
    (other-window 1)))

(defun lawlist-windmove-left ()
(interactive)
  (if (window-in-direction 'left)
    (select-window (window-in-direction 'left))
    (other-window -1)))

(defun lawlist-windmove-up ()
(interactive)
  (if (window-in-direction 'above)
    (select-window (window-in-direction 'above))
    (other-window 1)))

(defun lawlist-windmove-down ()
(interactive)
  (if (window-in-direction 'below)
    (select-window (window-in-direction 'below))
    (other-window -1)))

(define-key minibuffer-local-map [prior] nil)
(define-key minibuffer-local-map [next] nil)
(define-key minibuffer-local-map [home] nil)
(define-key minibuffer-local-map [end] nil)
(define-key minibuffer-local-completion-map [prior] nil)
(define-key minibuffer-local-completion-map [next] nil)
(define-key minibuffer-local-completion-map [home] nil)
(define-key minibuffer-local-completion-map [end] nil) 

(global-set-key (kbd "<end>") 'lawlist-windmove-right)

(global-set-key (kbd "<home>") 'lawlist-windmove-left)

(global-set-key (kbd "<prior>") 'lawlist-windmove-up)

(global-set-key (kbd "<next>") 'lawlist-windmove-down)

感谢分享代码。学习一种更快地在窗口之间切换的方法很不错,包括但不限于迷你缓冲区。 - modeller

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