在emacs ansi-term shell中复制/粘贴

我已经configuration了我的emacs在ansi-term中运行zsh shell。 但是,复制/粘贴不再起作用,即没有任何东西被从杀戒环粘贴到terminal。 将TERM更改为vt100或eterm不能解决问题。

希望有任何想法或解决scheme。

为了提供上下文,我已经configuration了ansi-term,如下所示:

(global-set-key "\Cx\Ca" '(lambda ()(interactive)(ansi-term "/bin/zsh"))) (global-set-key "\Cx\ a" '(lambda ()(interactive)(ansi-term "/bin/zsh"))) 

您可能只想在使用terminal时在字符模式和线路模式之间切换。 Cx Cj将激活term-line-mode,它将terminal缓冲区视为一个普通的文本缓冲区,在这个缓冲区中可以移动光标和文本。 您可以用Cc Ck切换回字符模式。

char-modeansi-term是terminal仿真的普通绑定。 你需要一个新的绑定,加上一个正确的输出到ansi-term 。 我使用这个:

 (defun ash-term-hooks () ;; dabbrev-expand in term (define-key term-raw-escape-map "/" (lambda () (interactive) (let ((beg (point))) (dabbrev-expand nil) (kill-region beg (point))) (term-send-raw-string (substring-no-properties (current-kill 0))))) ;; yank in term (bound to Cc Cy) (define-key term-raw-escape-map "\Cy" (lambda () (interactive) (term-send-raw-string (current-kill 0))))) (add-hook 'term-mode-hook 'ash-term-hooks) 

当你这样做时,Cc Cy会被抽出。 但是只有一个被抽出,你不能在你的kill-buffer中循环。 这是可能的,但我还没有实现它。

正如在这个可爱的博客片段中所描述的那样, term.el有一个函数term-paste ,它完全符合你的要求。 默认情况下,它只能绑定到S-insert但是博客推荐的Cc Cy似乎是一个很好的build议。

这些其他解决scheme对我来说效果不好,在字符模式和行模式之间切换导致ansi-term随机地停止正常工作,并且设置ansi-term的术语粘贴到Cc Cy(基于Glyph的链接)不起作用代码片段是用于术语,而不是ansi-term:

  (eval-after-load "ansi-term" '(define-key ansi-term-raw-map (kbd "Cc Cy") 'term-paste)) 

上述解决scheme适用于将文本从某个缓冲区复制到ansi-term,但是他们无法将文本从ansi-term复制到另一个缓冲区(例如,将刚刚运行的命令复制到正在编辑的shell脚本中)。 添加到我的.emacs文件解决了这个问题(在Emacs 24.4):

 (defun my-term-mode-hook () (define-key term-raw-map (kbd "Cy") 'term-paste) (define-key term-raw-map (kbd "Ck") (lambda () (interactive) (term-send-raw-string "\Ck") (kill-line)))) (add-hook 'term-mode-hook 'my-term-mode-hook) 

请注意,如果要将kill / yank绑定到以ansi-term转义字符(默认为Cc和Cx)开头的击键,并且希望在不太可能发生这些更改的情况下工作,则可以定义键击没有领先的转义)到term-raw-escape-map ,就像在user347585的回答中所做的那样。