Emacs中是否有“set paste”选项来从外部剪贴板粘贴内容?

5
我在一个没有X窗口的远程机器上通过putty使用Emacs。问题是外部剪贴板(Shift+Ins)的复制/粘贴非常慢。
在Vim中,当我需要粘贴时,有一个选项set paste,那么Emacs是否有类似的功能呢?
我目前正在尝试一些解决方法:在粘贴之前,将major-mode更改为fundamental-mode,然后禁用modeline中显示的minor modes,以使副作用尽可能小。但是它仍然比使用emacs -Q启动时要慢得多。 在显示区域(minibuffer)中,有一些以"matches ... "(括号等)开头的消息。
那么如何正确地解决这个问题呢?
2个回答

5
我不知道Emacs有类似于“粘贴模式”的功能。您可以从以下内容开始(使用单独的缓冲区,以便当前缓冲区的 *-change-functions 只在结束时被调用):
(defvar ttypaste-mode nil)
(add-to-list 'minor-mode-alist '(ttypaste-mode " Paste"))

(defun ttypaste-mode ()
  (interactive)
  (let ((buf (current-buffer))
        (ttypaste-mode t))
    (with-temp-buffer
      (let ((stay t)
            (text (current-buffer)))
        (redisplay)
        (while stay
          (let ((char (let ((inhibit-redisplay t)) (read-event nil t 0.1))))
            (unless char
              (with-current-buffer buf (insert-buffer-substring text))
              (erase-buffer)
              (redisplay)
              (setq char (read-event nil t)))
            (cond
             ((not (characterp char)) (setq stay nil))
             ((eq char ?\r) (insert ?\n))
             ((eq char ?\e)
              (if (sit-for 0.1 'nodisp) (setq stay nil) (insert ?\e)))
             (t (insert char)))))
        (insert-buffer-substring text)))))

这真的快多了!您能解释一下这段代码吗?似乎还有提升的空间 :-) - Hongxu Chen
1
我用稍微更快的版本更新了代码(在c-mode缓冲区中,差异非常显着)。虽然我无法进一步加速它(在AMD-E350上,900KB需要30秒),也许跳过(eq char ?\r)测试并在最后执行subst-char-in-region会有所帮助,但我怀疑差异不会很大。 - Stefan
非常感谢,运行正常;我会尝试理解这段代码。 - Hongxu Chen
顺便提一句,在最近的Emacsen中,类似的代码片段已经自动使用了(至少在支持“括号粘贴”功能的文本终端中),所以你不再需要进行任何繁琐的操作了。 - Stefan

1
如果你更喜欢一些经过测试和使用的东西:
;; enable clipboard interaction between emacs and system
(setq x-select-enable-clipboard t)

它对我有用。只需简单的C-y,您就可以开始使用!希望这有所帮助。


不,我没有。很抱歉我忽视了那个细节。你试过使用 C-S-v 来使用你的终端剪贴板吗?我在我的系统上尝试了一下,对于 emacsclient -t 是可行的。如果这还不满意,你可以尝试类似 xsel 这样的东西,用作终端使用的外部 X 剪贴板管理器。如果这仍然不满意,你可以尝试类似 这些方法。请告诉我这些是否适用于你。 - edt_devel
很抱歉,它无法工作,因为我正在使用__putty__连接到一个没有X窗口服务器的远程机器。此外,C-S-v没有响应(至少Shift被吃掉了)。 - Hongxu Chen

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