2010-05-21 122 views
37

我已经配置了我的emacs以在ansi-term中运行zsh shell。但是,复制/粘贴不再起作用,即从杀戒到终端的任何内容都不会被粘贴。 将TERM更改为vt100或eterm不能解决问题。在emacs ansi-term shell中复制/粘贴

希望任何想法或解决方案。

为了提供上下文我已经如下被配置ANSI-术语:

(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"))) 

回答

60

您可能希望在使用终端时简单地在字符模式和线模式之间切换。 C-x C-j将激活term-line-mode,它将终端缓冲区更像一个正常的文本缓冲区,您可以在其中移动光标并放大文本。您可以使用C-c C-k切换回字符模式。

+0

伟大的提示,谢谢! +1 – danlei 2010-07-19 19:54:56

+0

对于像zsh这样的提供的右对齐提示,这不起作用。 – l0st3d 2013-12-06 15:34:30

+14

在Emacs 24中,似乎在终端中需要按'C-c C-j'才能进入线路模式,然后返回,如上所述,它是'C-c C-k'。 – djhaskin987 2014-02-27 01:16:30

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将被抽出。但它只是一个抽屉,而且你无法循环你的kill-buffer。这是可能的,但我还没有实现它。

+0

感谢您的回复。一个“)”最后失踪了。不幸的是,这似乎不适用于我。我得到错误C-C C-Y未定义。 – Sandeep 2010-05-22 04:15:47

+0

嗯,我试着用emacs 23.2运行“emacs -q”,并且(在修复了你指出的缺失paren之后),我评估了一些随机文本,然后开始了ansi-term。按C-C C-y确实粘贴了它。 由于这是使用挂钩,请确保在评估后重新启动了ansi-term。如果这不起作用,请尝试使用-q开头的emacs。 您也可以尝试按C-c C-h,它列出以C-c开始的绑定。 C-C C-y应该与? (??因为我们使用的是未命名的lambda)。 – user347585 2010-05-23 02:39:35

+0

你好。我试着用-q和不用-q重新启动emacs。但它仍然不起作用。我在ubuntu上使用emacs 23.1。 R C-C C-h在我正常启动emacs时不显示任何绑定。使用-q我有几个绑定,但没有关于C-c C-y。是否有日志或调试输出,我可以看看什么缺少。 谢谢。 -Sandeep – Sandeep 2010-05-25 04:45:56

5

this lovely blog snippet中所述,term.el中有一个函数term-paste,它正好符合您的要求。默认情况下,它仅限于S-insert,但博客的推荐C-c C-y似乎是一个很好的建议。

0

这些其他解决方案对我来说效果不好,在字符模式和行模式之间切换会导致ansi-term停止正确随机工作,并将CsiCy(基于Glyph的链接)设置为ansi-term的术语粘贴,没有工作的代码片段是为长期,不是ANSI-项:

(eval-after-load "ansi-term" 
    '(define-key ansi-term-raw-map (kbd "C-c C-y") 'term-paste)) 
0

上述解决方案的工作以及从一些缓冲复制文本到ANSI-期限,但他们无法从ANSI复制文本-term到另一个缓冲区(例如,将刚才运行的命令复制到正在编辑的shell脚本中)。添加此我.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) 

请注意,如果你想杀死/抽出绑定到与ANSI长期转义字符开始(默认击键Cc和Cx),并且希望在不太可能发生这些变化的情况下工作,您可以按照用户347585的答案中所做的那样,将键盘输入(不带前导转义)定义为term-raw-escape-map