从Emacs的剪贴板中抽出来

时间:2013-12-28 07:35:12

标签: emacs elisp

我在Ubuntu 12.04上使用Gnu Emacs 24.3。 我想直接在先前通过鼠标选择的文本上使用(yank),而无需先调用(kill-ring-save)。假设我在当前的Emacs缓冲区中标记了文本"test"。然后突出显示该区域(根据transient-mark-mode)。然后我将鼠标移动到缓冲区中的另一个位置。我现在可以按下中间按钮插入所选文本。但这不是我想要实现的目标。相反,我想调用一个插入使用选择的文本的函数。假设此函数绑定到 F1 。所以我改为按下鼠标左键,但现在取消选择并丢失活动区域(选定文本)。所以,当我按 F1 时,如何访问所选文本?

我尝试在~/.emacs中插入此内容:

(setq x-select-enable-primary t)
(setq interprogram-paste-function 'x-cut-buffer-or-selection-value)

它似乎工作得差不多了。它不能立即工作,但是在调用一个在kill环中插入一些东西的函数后,例如(kill-line),它似乎有效..

2 个答案:

答案 0 :(得分:4)

您已将x-select-enable-clipboard默认设置为tx-select-enable-primary,并将其设置为t。因此,剪贴板的值和主要选择中的一个将两者都按顺序放入杀戮环中,这两个都是从函数x-selection-value中的X11请求的。

剪贴板获胜,因为x-selection-value的返回值为

(or clip-text primary-text)

具有变量的明显含义。但是,如果剪贴板的文本在x-selection-value的两个连续调用中保持不变,则clip-text设置为nil。 clip-text的最后一个值存储在x-last-selected-text-clipboard中。 x-last-selected-text-clipboard的起始值为零。

因此,即使您已在emacs中使用鼠标设置主要选择,第一次调用x-selection-value(间接通过yank)也会获得剪贴板的值。

如果你之后继续使用emacs,那么使用什么也无关紧要 - 剪贴板或主要选择。你得到复制的文字。但是,如果您将一些文本复制到外部应用程序中的剪贴板,那么即使您在emacs中鼠标选择其他内容,您在emacs中的下一个yank也是此文本。同样,剪贴板胜过主要选择。

设置

(setq x-select-enable-clipboard nil)

可以解决您的问题。


如果您想从仅设置剪贴板的某个应用程序中获取复制文本,则上述方法不合适。 也许,在这种情况下,更好的选择是在使用鼠标选择文本时使剪贴板老化:

(defadvice mouse-set-region (before age-x-clipboard activate)
  (when (and x-select-enable-clipboard x-select-enable-primary)
    (let (x-select-enable-primary) ;; Do not touch primary selection.
      (x-selection-value))))

我认为你的实际问题是两种不同的复制粘贴方法的混合。您希望按主要选择进行复制(纯鼠标选择方法),并且您希望通过剪贴板进行粘贴(通过键盘复制 - 粘贴)。 但是,同时我注意到firefox也将所有内容都放在主要选择上。 只要您使用的所有程序都将使用 C-c 复制的内容放在主数据库上,上述解决方法就可以正常工作。

答案 1 :(得分:1)

如果您安装了xsel:

M-! xsel -o