我已将emacs配置为在ansi-term中运行zsh shell。但是,复制/粘贴不再有效,即没有任何东西从kill-ring粘贴到终端。 将TERM更改为vt100或eterm并不能解决问题。
会感激任何想法或解决方案。
要提供上下文,我已将ansi-term配置如下:
(global-set-key "\C-x\C-a" '(lambda ()(interactive)(ansi-term "/bin/zsh")))
(global-set-key "\C-x\ a" '(lambda ()(interactive)(ansi-term "/bin/zsh")))
答案 0 :(得分:77)
您可能只想在使用终端时在字符模式和线路模式之间切换。 C-x C-j将激活term-line-mode,它将终端缓冲区视为普通文本缓冲区,您可以在其中移动光标和移动文本。您可以使用C-c C-k切换回字符模式。
答案 1 :(得分:8)
正如this lovely blog snippet中所述,term-paste
中的函数term.el
完全符合您的要求。默认情况下,它仅限于S-insert
,但博客推荐的C-c C-y
似乎是一个很好的建议。
答案 2 :(得分:5)
ansi-term
中的 char-mode
采用终端仿真的普通绑定。您需要一个新的绑定,以及一种正确输出到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 C-c C-y)
(define-key term-raw-escape-map "\C-y"
(lambda ()
(interactive)
(term-send-raw-string (current-kill 0)))))
(add-hook 'term-mode-hook 'ash-term-hooks)
当你这样做时,C-c C-y会猛拉。但是,只有一个猛拉,你不能循环通过你的杀戮缓冲区。可以这样做,但我还没有实现它。
答案 3 :(得分:1)
上述解决方案适用于将文本从某个缓冲区复制到ansi-term,但是它们无法将文本从ansi-term复制到另一个缓冲区(例如,复制您刚刚运行到shell脚本的命令&& #39;重新编辑)。将此添加到我的.emacs文件为我解决了这个问题(在Emacs 24.4中):
(defun my-term-mode-hook ()
(define-key term-raw-map (kbd "C-y") 'term-paste)
(define-key term-raw-map (kbd "C-k")
(lambda ()
(interactive)
(term-send-raw-string "\C-k")
(kill-line))))
(add-hook 'term-mode-hook 'my-term-mode-hook)
注意,如果你想将kill / yank绑定到以ansi-term转义字符开头的键击(默认为Cc和Cx),并希望这在不太可能发生的事件中发生变化,你可以改为定义你的击键(没有前导逃脱)到term-raw-escape-map
,就像在用户347585的答案中所做的那样。
答案 4 :(得分:0)
这些其他解决方案对我来说效果不佳,在字符模式和行模式之间切换会导致ansi-term随机停止正常工作,并将ansi-term的term-paste设置为Cc Cy(基于Glyph的链接),没有工作的代码片段是用于术语,而不是ansi-term:
(eval-after-load "ansi-term"
'(define-key ansi-term-raw-map (kbd "C-c C-y") 'term-paste))
答案 5 :(得分:0)
我启用了xterm-mouse-mode
,此后,我能够使用鼠标选择文本并使用Mac OS X的emacs GUI中ansi-term
中的标准Mac命令C按钮进行复制,