如何在Windows系统上将Emacs的主要/剪贴板复制和粘贴行为结合起来?

14

Emacs 24改变了复制/粘贴行为的方式,以符合现代X应用程序的要求(请参见“选择更改”下的此文章)。他们明确地将主选区和中键粘贴与剪贴板复制/粘贴分开。

不幸的是,对于我来说,在MS Windows下使用本机(而非cygwin!)Emacs 24.2.1会破坏我想要工作的方式。

这是我想要的:

  1. 在Emacs中突出显示(选择)文本会自动将其复制到Windows剪贴板中。如果我在另一个Windows应用程序中粘贴(Ctrl-V),则会粘贴。如果我在Emacs中键入C-y(yank),它会粘贴。如果我在Emacs中单击中键,则会粘贴。
  2. 在Emacs中删除(C-w)会将数据复制到剪贴板中。如果我在另一个Windows应用程序中粘贴(Ctrl-V),则会粘贴。如果我在Emacs中键入C-y(yank),它会粘贴。如果我在Emacs中单击中键,则会粘贴剪贴板内容,而不是上次选择的文本
  3. 我从另一个Windows应用程序(例如通过Ctrl-C)复制到剪贴板的任何内容都可以通过键入C-y(yank)或单击中键在Emacs中粘贴(现在,单击中键会粘贴上次选择的文本,而不是剪贴板内容)。

总之,我认为这意味着删除Emacs中主要选区和剪贴板之间的区别。我希望所有操作都作用于剪贴板!


就我所知,我在cygwin上使用24.2.1版本时也遇到了完全相同的问题,至少是#1。 - Miserable Variable
我正在使用本地的 Emacs 24.2.1(不是 cygwin!)描述在 http://www.gnu.org/software/emacs/windows/faq.html,并且可在此处获得:http://ftp.gnu.org/gnu/emacs/windows。我猜测 cygwin 层会处理主要选择(在 MS Windows 上不存在)和剪贴板之间的转换。 - jfritz42
3个回答

20
以下是 NEWS 中相关的条目:
- `mouse-drag-copy-region` 现在默认为 nil。 - `mouse-2` 现在绑定到 `mouse-yank-primary`。
这将从主选择中粘贴,忽略 kill-ring。以前,`mouse-2` 绑定到 `mouse-yank-at-click`。
要返回到以前的行为,请执行以下操作:
- 将 `select-active-regions` 更改为 nil。 - 将 `mouse-drag-copy-region` 更改为 t。 - 将 `x-select-enable-primary` 更改为 t(仅限于 X)。 - 将 `x-select-enable-clipboard` 更改为 nil。 - 将 `mouse-yank-at-click` 绑定到 `mouse-2`。
我认为要在 Windows 上获得以前的行为,您需要保留 `x-select-enable-primary` 和 `x-select-enable-clipboard` 的当前值,也许 `select-active-regions` 与您在此处抱怨的行为变化无关。
以下是您应该放入 .emacs 文件中的确切行:
(setq select-active-regions nil)
(setq mouse-drag-copy-region t)
(global-set-key [mouse-2] 'mouse-yank-at-click)

根据您的建议,我已经在我的.emacs文件中添加了以下行: (setq select-active-regions nil) (setq mouse-drag-copy-region t) (global-set-key [S-mouse-2] 'mouse-yank-at-click)这部分有效。如果我在Emacs中选择文本,它会将其复制到剪贴板中,然后我可以在另一个Windows应用程序中粘贴(耶!)。但是中间鼠标按钮不起作用——即使选择了某些内容或复制了某些内容,中间鼠标单击也会在屏幕底部显示错误:“没有可用的选择”。 - jfritz42
你绑定了 Shift + 中键,这是有意为之还是误解了?(global-set-key [mouse-2] 'mouse-yank-at-click) 对我来说似乎可以工作。 - JSON
太棒了,[mouse-2]问题解决了!我不是Emacs lisp程序员,所以我不得不在Google上搜索如何将mouse-2绑定到一个操作上。我猜我得到了错误的信息。现在一切都按照我想要的方式正常工作。 - jfritz42

1

看起来拖动鼠标对剪贴板没有任何作用。以下内容可以添加,但我不知道它对点和标记有什么影响:

(defadvice mouse-drag-region (after copy-to-clipboard activate)
  (clipboard-kill-ring-save (region-beginning) (region-end))
  (goto-char st) (push-mark nd nil t)
  )

0
  • 据我所知,第2点和第3点已经可以直接使用了?
  • 另外,我猜你不想要一个可用的历史记录(比如 kill-ring)吧?
  • 你所说的高亮是指“选择它”(在 Emacs 中称为 region),还是实际上给它加上颜色,比如黄色?

如果你是指选择它,我认为问题在于 Emacs 不知道你选择结束的时间,因此必须将其复制到剪贴板中?这就是为什么你会使用 Meta-W(Alt-Shift-w),它会将其复制到 kill-ring 中,在 Emacs 之外也可以访问。

(我在这里发布这篇文章,因为我认为评论很混乱,但我以后会删除或更改这个答案)

我认为你可以在 mouse.el 中找到所有需要的信息:

要进入该文件,请尝试:按下 C-hk任意鼠标按钮,然后单击 mouse.el 查找其定义位置。如果你在文件中寻找更多的 "global-set-key",你可能会找到你正在寻找的东西(我仍然不确定)


关于你提到的“Emacs不知道你选择结束的时间点”的观点,我应该指出在Emacs 23中一切都很好。它按照我的期望做了一切。只有在Emacs 24中,“选择复制”等方面才让我失望了。 - jfritz42
还有,中间鼠标按钮是复制还是粘贴的想法? - PascalVKooten
哦,我认为它可能绑定在右鼠标按钮上? - PascalVKooten
也许尝试双击鼠标中键或右键,看看它们是否具有您想要的功能? - PascalVKooten
中间按钮可以粘贴-如果-我已经在Emacs中选择了某些内容。然而,如果我在另一个Windows应用程序中复制了一些内容到剪贴板,然后在Emacs中单击中间按钮,则会粘贴我上次在Emacs中选择的内容(这不是我想要的!)。我希望它可以粘贴剪贴板上的内容。 - jfritz42
显示剩余2条评论

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