添加操作系统剪贴板杀死戒指


25

我经常发现自己将代码段从Internet复制到操作系统的剪贴板中。然后,我采取以下简单步骤:

  1. 切换到我的Emacs窗口
  2. 找到我要粘贴代码的地方
  3. 使用C-yyank)插入复制的文本。

但是,有时我(令我非常失望)发现我在执行步骤2时无意中使用了某种形式的kill命令(例如kill-wordkill-line)。在这种情况下,从“剪贴板”复制的文本永远不会使它成为kill。环。

有没有办法确保从其他应用程序复制的文本始终将其放入我的杀戮圈?

我最常在Linux上工作,但我也经常在Windows和Mac OS X上使用Emacs,因此首选与操作系统无关的答案。


我可以建议这个链接吗?浏览整个页面,您会看到很多不同的从剪贴板复制/粘贴的方式
Nsukami _ 2014年

@Nsukami_谢谢。我将尝试进行消化,但是链接页面是为什么我厌倦了在EmacsWiki上寻找答案的一个典型示例。那里的许多elisp黑客似乎都认为elisp代码是自记录的,不需要注释,也不需要解释功能或用法。我通常没有时间对代码进行反向工程,而只是确定代码是否满足我的要求。
nispio 2014年

哈哈,我明白了;)
Nsukami _ 2014年

Answers:


31

您需要自定义save-interprogram-paste-before-killt。如果您在粘贴剪贴板之前杀死了emacs中的某些内容,这会将您的剪贴板推向杀戮区域。相关的自定义是yank-pop-change-selection将您当前在emacs中的猛拉推到剪贴板上。为了使这两种方法都能正常工作,您需要将其设置为默认值x-select-enable-clipboardgui-select-enable-clipboard在emacs 25.1中由替换)t

默认情况下将其关闭的原因是为了防止无意中将大量数据推到杀死对象上,而该杀死对象在整个会话过程中仍然存在,这与剪贴板很容易更换不同。


1
比我预期的更干净,更容易。 save-interprogram-paste-before-kill似乎正是我想要的!
nispio 2014年

我在emacs 26上,gui-select-enable-clipboard被称为just select-enable-clipboard
符文卡加德

3

另一个解决方案是,如果可能的话,只需使用cli工具,

  • 在Mac上为pbcopy / pbpaste

  • Cygwin上的getclip / putclip

  • Linux上的xsel
  • GUI Emacs中的x-clipboard(如其他提到的那样,您需要打开x-select-enable-clipboard标志)。

此解决方案的优点是剪贴板始终可用(例如,在远程ssh时)。

我的回答分为两个部分。第一部分介绍了一些方便的工具来操作剪贴板。第二部分将回答您的原始问题(将剪贴板存储到kill ring中)。

第一部分

将以下代码插入您的〜/ .emacs中:

(setq *is-a-mac* (eq system-type 'darwin))
(setq *cygwin* (eq system-type 'cygwin) )
(setq *linux* (or (eq system-type 'gnu/linux) (eq system-type 'linux)) )
(defun copy-to-x-clipboard ()
  (interactive)
  (if (region-active-p)
      (progn
        (cond
         ((and (display-graphic-p) x-select-enable-clipboard)
          (x-set-selection 'CLIPBOARD (buffer-substring (region-beginning) (region-end))))
         (t (shell-command-on-region (region-beginning) (region-end)
                                     (cond
                                      (*cygwin* "putclip")
                                      (*is-a-mac* "pbcopy")
                                      (*linux* "xsel -ib")))
            ))
        (message "Yanked region to clipboard!")
        (deactivate-mark))
        (message "No region active; can't yank to clipboard!")))

(defun paste-from-x-clipboard()
  (interactive)
  (cond
   ((and (display-graphic-p) x-select-enable-clipboard)
    (insert (x-selection 'CLIPBOARD)))
   (t (shell-command
       (cond
        (*cygwin* "getclip")
        (*is-a-mac* "pbpaste")
        (t "xsel -ob"))
       1))
   ))

(defun my/paste-in-minibuffer ()
  (local-set-key (kbd "M-y") 'paste-from-x-clipboard)
  )

(add-hook 'minibuffer-setup-hook 'my/paste-in-minibuffer)

第二部分

在您的〜/ .emacs中插入以下代码,然后从现在开始,使用“ Mx从剪贴板粘贴到CC-kill-ring”粘贴:

(defun paste-from-clipboard-and-cc-kill-ring ()
  "paste from clipboard and cc the content into kill ring"
  (interactive)
  (let (str)
    (with-temp-buffer
      (paste-from-x-clipboard)
      (setq str (buffer-string)))
    ;; finish the paste
    (insert str)
    ;; cc the content into kill ring at the same time
    (kill-new str)
    ))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.