"yank"在通过SSH使用Emacs时无法粘贴文本

10

当我尝试通过ssh在远程服务器上运行Emacs时,C-y(甚至M-x yank)无法工作。 每次我按下C-y,它都会显示“Mark set”,但什么也不发生。我在Linux下工作,远程服务器是Mac Pro。

现在我只能将文件下载到我的个人电脑。有什么更好的解决办法吗?


1
并不是解决您问题的方法,但是您可以使用 Tramp 远程编辑文件。 - Magnar
3
Emacs是一个开发工具,这是一个实际问题,并且有一个客观答案;因此,即使它可能在其他论坛上也是适当的话题,但它在这里仍然是适当的话题。 - user166390
2个回答

6
我猜测你的问题并不是由于Emacs远程运行,而是由于Emacs在“文本模式”下运行(即在终端仿真器内运行)。 在这种模式下运行时,Emacs不知道可能正在运行的任何周围GUI,因此C-y仅会粘贴你之前通过C-wM-w等方式在同一Emacs会话中删除的文本。
你可以尝试在终端仿真器中执行“粘贴”操作(可能是Cmd-v),这将把所选文本作为已键入的内容发送到底层应用程序(在本例中是Emacs)。 只要你想粘贴的文本是"足够简单"的字符,它就可能正常工作。 如果它包含任何有趣的控制字符,则情况未知(如果它包含非ASCII字符,则根据是否正确配置整个 "终端仿真器+ssh+Emacs" 系统,它也可能表现出奇怪的行为)。

4

文本模式并不是我的问题。

我有一台MacBook,在上面运行Emacs。我使用tramp-mode来编辑(远程)Linux系统上的文件。没有远程的Emacs,一切都是本地的。

我在Mac上设置了这样的复制/粘贴方式,以便在Emacs之外从系统剪贴板中“粘贴”内容:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; handle copy/paste intelligently
(defun copy-from-osx ()
  "Handle copy/paste intelligently on osx."
  (let ((pbpaste (purecopy "/usr/bin/pbpaste")))
    (if (and (eq system-type 'darwin)
             (file-exists-p pbpaste))
          (shell-command-to-string pbpaste))))

(defun paste-to-osx (text &optional push)
  "Handle copy/paste intelligently on osx.
TEXT gets put into the Macosx clipboard.

The PUSH argument is ignored."
  (let* ((process-connection-type nil)
         (proc (start-process "pbcopy" "*Messages*" "pbcopy")))
    (process-send-string proc text)
    (process-send-eof proc)))

(setq interprogram-cut-function 'paste-to-osx
      interprogram-paste-function 'copy-from-osx)

显然,tramp模式尝试变得聪明,并在粘贴文本时运行我设置的pbpaste命令远程。 或者试图这样做。但我不想要这个。所以我修改了copy-from-osx,像这样:

(defun copy-from-osx ()
  "Handle copy/paste intelligently on osx."
  (let ((pbpaste (purecopy "/usr/bin/pbpaste")))
    (if (and (eq system-type 'darwin)
             (file-exists-p pbpaste))
        (let ((tramp-mode nil)
              (default-directory "~"))
          (shell-command-to-string pbpaste)))))

注意在运行pbpaste之前,它会暂时将tramp-mode设置为nil。

对我而言有效。


非常感谢。我的配置与您的非常相似,您的解决方案就像魔法一样有效。由于我使用 (when (eq system-type 'darwin) 来定义 copy-from-osx 函数,我已经删除了 "if" 部分: (defun copy-from-osx () (let ((tramp-mode nil) (default-directory "~")) (shell-command-to-string "pbpaste"))) - Lungang Fang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接