在字符模式下从ansi-term中运行Emacs命令

4
我希望在Emacs中,在ansi-term缓冲区的字符模式下,能够触发与 "M-x command RET" 相关的标准行为。我曾经有这个功能,但由于一些原因,在过去几天里,它不再存在,尽管我没有升级Emacs(尽管可能无意中修改了我的init文件)。此外,我的以下 hook 曾经有效(用于在窗口之间切换),但现在不起作用了。
(global-set-key (kbd "M-J") 'windmove-left)          ; move to left window
(global-set-key (kbd "M-L") 'windmove-right)         ; move " " 
(global-set-key (kbd "M-I") 'windmove-up)            ; move " "
(global-set-key (kbd "M-K") 'windmove-down)          ; move " " 

(add-hook 'term-mode-hook
  (lambda()
    (define-key term-raw-map (kbd "M-J") 'windmove-left)  
    (define-key term-raw-map (kbd "M-L") 'windmove-right) 
    (define-key term-raw-map (kbd "M-I") 'windmove-up)    
    (define-key term-raw-map (kbd "M-K") 'windmove-down)  
    (define-key term-raw-map (kbd "M-F") 'toggle-maximize-buffer) 
    ))

更新:

如果在打开任何ansi-term之前评估(lookup-key term-raw-map (read-kbd-macro "\C-x")),我会得到term-send-raw,但如果在打开ansi-term后评估它,则会得到不同的结果。

(keymap #^[nil nil keymap 
#^^[3 0 pop-global-mark nil list-buffers term-send-raw list-directory eval-last-sexp find-file nil nil indent-rigidly ...] #^^[1 0 #^^[2 0 
#^^[3 0 pop-global-mark nil list-buffers term-send-raw list-directory eval-last-sexp find-file nil nil indent-rigidly ...] nil nil nil nil nil nil nil nil nil ...] nil nil nil nil nil nil nil nil nil ...] nil nil nil nil nil nil nil ...] (67108912 . text-scale-adjust) (67108925 . text-scale-adjust) (67108909 . text-scale-adjust) (67108907 . text-scale-adjust) (67108896 . pop-global-mark) (C-left . previous-buffer) (left . previous-buffer) (C-right . next-buffer) (right . next-buffer))

这是预期的行为吗?

是的,我有相同的行为。也许你根本不应该重新定义 C-x C-b 以进行 term-send-raw。对我来说,默认情况下它可以工作:所有我的键绑定,如 C-x C-d,都可以在 term-char-mode 下工作,无需任何其他设置。我只重新定义像 M-sC-p 这样的键绑定。 - artscan
1个回答

6
我使用如下设置:

我使用以下设置:

(define-key term-raw-map (kbd "M-x") 'nil)

然后,在term-char-mode中,M-x像往常一样工作。如果您使用全局快捷键来执行某些功能,请在term-raw-map中为相同的快捷键设置'nil


谢谢artscan。这个很好用!我印象深刻。你介意详细解释一下为什么在 term-raw-map 键映射中将 M-x 设置为 nil 可以启用全局键绑定吗?我在文档中找不到太多关于此的信息。在此上下文中,“nil”的含义是什么? - Amelio Vazquez-Reina
由于某种奇怪的原因,对于 C-x C-b,这对我来说不起作用。 我在我的 .emacs 文件中有 (global-set-key (kbd "C-x C-b") 'helm-buffers-list),我想从字符模式下的 ansi-term 中调用 helm-buffers-list。 如果我添加 (define-key term-raw-map (kbd "C-x C-b") 'nil),我会得到:“Key sequence C-x C-b starts with non-prefix key C-x” - Amelio Vazquez-Reina
在我的设置中(参见 (lookup-key term-raw-map (read-kbd-macro "\C-x"))),C-x 绑定到 keymap,而 (define-key term-raw-map (kbd "C-x C-b") 'nil) 正常工作。也许在你的设置中,C-x 绑定到其他东西了? - artscan
这真的很奇怪。一旦我打开了一个ansi-term,我就可以调用C-x C-e(eval-last-sexp) 来执行 (define-key term-raw-map (kbd "C-x C-b") 'nil), 这样可以解决问题... 但是它不会在hook内起作用...(或者我将其放在init文件中的任何其他位置也不行) - Amelio Vazquez-Reina
我已经在我的原帖中添加了更新,更多关于与 C-x 相关的键位映射的信息。 - Amelio Vazquez-Reina

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