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

Emacs 从缓冲区外部更改缓冲区模式。伪装成另一个缓冲区,emacs,terminal,Emacs,Terminal,如何从缓冲区外部(即在另一个缓冲区中)更改缓冲区的模式,可能需要使用eval 问题是在术语字符模式下我无法操作M-x。事实上,走出缓冲区并不是一件容易的事情。工作的选项正在从modeline更改为行模式 到 然后使用M-x,但这看起来相当笨拙和粗糙。还有别的办法吗 基本上是从缓冲区外部执行操作或传递命令,比如说X,但假装是X。您可以使用宏和当前缓冲区轻松地“伪装成另一个缓冲区”。从帮助中: (with-current-buffer BUFFER-OR-NAME &rest BODY)

如何从缓冲区外部(即在另一个缓冲区中)更改缓冲区的模式,可能需要使用
eval

问题是在
术语字符模式下
我无法操作M-x。事实上,走出缓冲区并不是一件容易的事情。工作的选项正在从modeline更改为
行模式

然后使用M-x,但这看起来相当笨拙和粗糙。还有别的办法吗

基本上是从缓冲区外部执行操作或传递命令,比如说X,但假装是X。

您可以使用宏
和当前缓冲区轻松地“伪装成另一个缓冲区”。从帮助中:

(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.

它接受缓冲区名称或缓冲区引用这一事实非常方便。就我个人而言,我觉得宏名称中的“当前”部分有点违反直觉,因为主体将不在当前缓冲区中执行,而是在另一个缓冲区中执行,就好像它是当前的一样。

这并不能直接解决您的问题,但请注意,在
术语模式下,在
术语行模式
术语字符模式
之间切换非常容易:

默认情况下,您处于
术语字符模式
。要进入术语行模式,请键入

C-C-j

术语行模式下
可以使用常用的键绑定,包括M-x

要返回
术语字符模式
,请键入

C-C-k

还请注意,通常以C-x开头的键盘快捷键在
术语字符模式下可用作C-C,例如
查找文件
变成C-C-f。但这对M-x没有帮助。

您可以添加

(define-key term-raw-map (kbd "M-x") 'execute-extended-command)
到您的
.emacs
,使M-x在字符模式下工作。对于C-x,使用

或者使用
ansi term
而不是
term
打开终端。这将允许您使用C-xb将缓冲区保留为char模式


如果您需要将C-x或C-C发送到术语内的某个应用程序,您可以使用C-cC-x或C-cC-C来执行此操作。

非常确定。请注意,您必须处于
术语行模式
——您是说
C-C-j
可以工作,但不能返回到
术语字符模式
?或者你得到了什么效果?是的。我不能回到
术语字符模式
它说
未定义
组合。奇怪。您正在运行哪个版本的Emacs?我刚刚用24.3.1进行了测试,调用为
emacs-Q
,它的工作原理与预期一致。它是2013年3月18日在MARVIN上发布的GNU emacs 24.3.1(i386-mingw-nt6.1.7600)。在
eval
ing
(require'term)
之后,我用
emacs-q
尝试了它<代码>C-C-k是未定义的
。FWIW,我认为你的上一句话即使没有错误,也是令人困惑的<使用当前缓冲区的code>实际上会临时更改缓冲区(使用
设置缓冲区
)。它只是恢复之前、之后的当前缓冲区。它不会“在另一个缓冲区中”执行任何操作,就好像它是当前缓冲区一样(尽管不清楚最后一个短语的含义)。(不用说,你的回答在其他方面是正确的---+1。)
(add-hook 'term-mode-hook (lambda ()
                            (let (term-escape-char)
                              (term-set-escape-char ?\C-x)))