在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-mode
, ansi-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的回答中所做的那样。