【问题标题】:Copy/Paste in emacs ansi-term shell在 emacs ansi-term shell 中复制/粘贴
【发布时间】:2011-02-22 14:12:26
【问题描述】:

我已将我的 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")))

【问题讨论】:

    标签: shell emacs


    【解决方案1】:

    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 将被拉出。但是,它只进行一次猛拉,并且您不能循环通过您的杀戮缓冲区。可以这样做,但我还没有实现。

    【讨论】:

    • 感谢您的回复。最后缺少一个“)”。不幸的是,这似乎对我不起作用。我收到错误 C-c C-y 未定义。
    • 嗯,我尝试使用 emacs 23.2 运行“emacs -q”,并且(在修复了您指出的缺失括号后),我评估,复制了一些随机文本,然后启动了 ansi-term。按 C-c C-y 实际上粘贴了它。由于这是使用钩子,因此请确保在评估后重新启动 ansi-term。如果这不起作用,请在以 -q 开头的 emacs 上尝试。您也可以尝试按 C-c C-h,它会列出以 C-c 开头的绑定。 C-c C-y 应该与 ?? (??因为我们使用的是未命名的 lambda)。
    • 你好。我尝试使用和不使用 -q 重新启动 emacs。但它仍然无法正常工作。我在 ubuntu 上使用 emacs 23.1。当我正常启动 emacs 时,R C-c C-h 没有显示任何绑定。使用 -q 我有几个绑定,但没有关于 C-c C-y。是否有我可以查看的日志或调试输出以查看缺少的内容。谢谢。 -桑迪普
    • 使用 emacs 24 代码可以工作,但您需要使用 C-x C-yC-x C-/
    • 有人知道如何在没有前缀的情况下使用它吗?我想重新绑定 s-v (super = mac command key)。
    【解决方案2】:

    您可能希望在使用终端时简单地在字符模式和行模式之间切换。 C-c C-j 将运行term-line-mode,它将终端缓冲区更像是一个普通的文本缓冲区,您可以在其中移动光标和拉动文本。您可以通过使用 C-c C-k 运行 term-char-mode 来切换回字符模式。

    【讨论】:

    • 这不适用于 zsh 等提供的右对齐提示。
    • 在 Emacs 24 中,似乎在终端中您需要按 'Cc Cj' 进入线路模式,然后返回,如上所示,它是 'Cc Ck'。跨度>
    【解决方案3】:

    this lovely blog snippet 中所述,term.el 中有一个函数term-paste,可以完全满足您的需求。默认情况下,它只绑定到S-insert,但博客推荐的C-c C-y 似乎是一个不错的建议。

    【讨论】:

      【解决方案4】:

      这些其他解决方案对我来说效果不佳,在字符模式和行模式之间切换会导致 ansi-term 随机停止正常工作,并将 ansi-term 的术语粘贴设置为 Cc Cy(基于 Glyph 的链接),没有' 代码 sn-p 用于术语,而不是 ansi-术语:

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

      【讨论】:

        【解决方案5】:

        上述解决方案适用于将文本从某个缓冲区复制到 ansi-term,但它们无法将文本从 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)
        

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

        【讨论】:

          【解决方案6】:

          我启用了xterm-mouse-mode,之后我可以在Mac OS X 的emacs GUI 中使用ansi-term 中的标准Mac 命令C 按钮选择文本并复制,

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-14
            • 2011-03-18
            • 1970-01-01
            • 2015-01-27
            • 2013-04-28
            相关资源
            最近更新 更多