让 emacs 明确地复制到/从 X11 选择和剪贴板缓冲区?

让 emacs 明确地复制到/从 X11 选择和剪贴板缓冲区?

vim"*y您可以分别使用和明确地从 X11 选择缓冲区和剪贴板缓冲区复制/粘贴"+y

我的 emacs(显然 -- 这不是我故意的)设置为使用C-wC-y和朋友的选择缓冲区。

是否有我可以调用的函数,类似于kill-regionyank使用剪贴板缓冲区?

明确地说,我希望同时选择性地访问两个缓冲区。根据一些快速的 Web 搜索,似乎我可以设置一些配置变量,这些变量将全局更改yank为使用一个缓冲区或另一个缓冲区。我希望能够进行选择,就像 vim*+寄存器允许的那样。

(希望我理解的术语正确:当我说“选择缓冲区”时,我指的是可以用鼠标突出显示文本并单击鼠标中键进行粘贴的缓冲区。当我说“剪贴板缓冲区”时,我指的是在非 emacs 应用程序中复制文本时所在的位置。ctrlc

编辑:bzg的答案非常接近。

在 gnome-terminal 中,我用鼠标选择 ~/projects,然后右键 -> 复制。然后选择 /home。仍然在 gnome-terminal 中,当我执行以下操作时:

  • 鼠标中键:/home
  • 鼠标右键 -> 粘贴:~/projects

当我进入 emacs 并执行以下时:

  • 鼠标中键:/home
  • 我的(yank):/home
  • CSy (my-yank): ~/projects

太棒了!yank使用选择缓冲区并my-yank使用剪贴板。

现在,仍然在 emacs 中,我执行以下操作:

  • C-SPC Mf Mf Cw(使区域“常规终止”,并将其终止)

然后进入 gnome-terminal 并执行:

  • 鼠标中键:“常规杀戮”
  • 鼠标右键 -> 粘贴:~/projects

太棒了!只有选择缓冲区发生了变化,而剪贴板没有变化。

然后,回到 emacs,我执行以下操作:

  • C-SPC Mf Mf CSw(将区域设为“我的杀戮”,并将其杀死)

然后进入 gnome-terminal 并执行:

  • 鼠标中键:常规终止
  • 鼠标右键 -> 粘贴:~/projects

这是错误的,剪贴板缓冲区应该包含“my kill”。

interprogram-cut-function的是x-select-text。我x-select-enable-clipboard的是nil

答案1

此代码将映射C-S-yC-S-w到和的定制版本yankkill-region并将暂时切换剪贴板的使用:

(defun my-yank (&optional arg)
  (interactive "*P")
  (let ((x-select-enable-clipboard (not x-select-enable-clipboard)))
    (yank arg)))

(defun my-kill-region (beg end)
  (interactive "r")
  (let ((interprogram-cut-function
     (when (not (eq interprogram-cut-function 'x-select-text))
       'x-select-text)))
    (kill-region beg end)))

(define-key global-map (kbd "C-S-w") 'my-kill-region)
(define-key global-map (kbd "C-S-y") 'my-yank)

因此,如果您在 X 中复制了某些内容,但在 Emacs 中复制时不想使用它,请使用C-S-y。如果您在 Emacs 中终止某些内容,但在 X 剪贴板中不想使用它,请使用C-S-w

x-select-enable-clipboard' and当然,所有这些都假设您使用 interprogram-cut-function 的默认值。

答案2

bzg 的答案非常接近,但切换interprogram-cut-function并没有完全解决问题——我相信它最终会解决问题,nil因为该变量在函数启动时具有值。

这组修订后的函数完全符合我的要求,通过在每个函数中明确设置剪贴板/主要启用。非常感谢 bzg 让我走上了正确的道路!

(defun my-yank (&optional arg)
  "Yank from the clipboard, not the primary selection."
  (interactive "*P")
  (let ((x-select-enable-clipboard t)
        (x-select-enable-primary nil))
    (yank arg)))

(defun my-kill-region (beg end)
  "Kill to the clipboard, not the primary selection."
  (interactive "r")
  (let ((x-select-enable-clipboard t)
        (x-select-enable-primary nil))
    (kill-region beg end)))

(defun my-kill-ring-save (beg end)
  "Save to the clipboard, not the primary selection."
  (interactive "r")
  (let ((x-select-enable-clipboard t)
        (x-select-enable-primary nil))
    (kill-ring-save beg end)))

(define-key global-map (kbd "C-S-w") 'my-kill-region)
(define-key global-map (kbd "C-M-S-w") 'my-kill-ring-save)
(define-key global-map (kbd "C-S-y") 'my-yank)

答案3

Emacs 在 中提供了一些有用的功能menu-bar.el。所以我有:

 (global-set-key [(control shift ?w)] 'clipboard-kill-ring-save)
 (global-set-key [(control shift ?y)] 'clipboard-yank)

相关内容