从缓冲区外部修改缓冲区模式。伪装成另一个缓冲区。

3
如何在另一个缓冲区之外更改缓冲区的模式,可能需要使用eval。问题是当处于term-char-mode时,无法操作M-x。实际上,要从该缓冲区中退出并不容易。有效的方法是从modeline中将其更改为line mode,然后使用M-x,但这似乎相当笨拙和粗糙。还有其他方法吗?基本上是在外部执行操作或传递命令,例如X,但假装是X
3个回答

3

虽然这并不是直接回答你的问题,但请注意,在term-mode中在term-line-modeterm-char-mode之间切换非常容易:

默认情况下,您处于term-char-mode。要进入term-line-mode,请键入

C-c C-j

term-line-mode中,您可以使用您平常的按键绑定,包括M-x

要返回到term-char-mode,请键入

C-c C-k

还要注意,通常以C-x开头的键盘快捷键在term-char-mode中可用作为C-c,例如find-file变成了C-c C-f。但这对M-x没有帮助。


我非常确定它可以。请注意,您必须处于“term-line-mode”模式下 - 您是否在说“C-C C-j”有效,但无法返回到“term-char-mode”模式?或者您得到了什么效果? - Thomas
是的。我无法返回到“term-char-mode”,它显示组合键未定义。 - Bleeding Fingers
奇怪。你正在运行哪个版本的Emacs?我刚刚测试了24.3.1版本,使用emacs -Q命令调用,它按预期工作。 - Thomas
这是 GNU Emacs 24.3.1 (i386-mingw-nt6.1.7600) of 2013-03-18 on MARVIN。我在 eval (require 'term) 后尝试使用 emacs -q,但是 C-c C-k 是未定义的。 - Bleeding Fingers

2

您可以通过宏with-current-buffer轻松地“扮演另一个缓冲区”。来自帮助:

(with-current-buffer BUFFER-OR-NAME &rest BODY)

Execute the forms in BODY with BUFFER-OR-NAME temporarily current.
BUFFER-OR-NAME must be a buffer or the name of an existing buffer.

宏名称接受缓冲区名称或缓冲区引用是非常方便的。个人而言,我认为该宏名称中“current”这个部分有些反直觉,因为BODY将在另一个缓冲区中执行,就像它是当前缓冲区一样。


就我个人而言,我认为你最后的陈述有些令人困惑,如果不是错误的话。with-current-buffer实际上会通过set-buffer暂时更改缓冲区。它只是在之后恢复之前的当前缓冲区。它不会像“在另一个缓冲区中一样执行任何操作”(尽管不清楚最后那句话可能意味着什么)。 (不用说,你的答案在其他方面是正确的 - +1。) - Drew

1
你可以添加。
(define-key term-raw-map (kbd "M-x") 'execute-extended-command)

将以下内容添加到您的.emacs文件,以在字符模式下使M-x工作。对于C-x,请使用:

(add-hook 'term-mode-hook (lambda ()
                            (let (term-escape-char)
                              (term-set-escape-char ?\C-x)))

或者使用ansi-term代替term打开终端。这将允许您使用C-xb在字符模式下离开缓冲区。
如果您需要将C-xC-c发送到term内部的某个应用程序,则可以使用C-cC-xC-cC-c

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