如何禁用鼠标中键单击粘贴?

lev*_*que 179 xorg clipboard

有没有办法禁用 gnome 默认情况下的鼠标中键粘贴行为?

我有一个灵敏的鼠标滚轮,每当我滚动文本时,有时它会将内容随机粘贴到文本中。当我将文件发送给其他人时,我会失去很多可信度,而文件上到处都是随机的文本片段。

我见过一个解决方案,通过将鼠标的中键映射到一个不存在的鼠标按钮,但这意味着完全摆脱鼠标中键(即没有选项卡关闭,自动打开新选项卡的链接等) . 我想保持我的鼠标中键处于活动状态,只需禁用粘贴行为。

当我用触摸板滚动文本时也会发生这种情况(不小心碰到了两个手指而没有移动,砰。)

因此,仅通过更换新鼠标并不能解决问题(事实上,我相信我的触摸板比我的鼠标更常发生这种情况)。

小智 72

我使用 gnome-tweak-tool 在 Ubuntu 16.04 中禁用中间按钮粘贴。

  1. 安装它

    sudo apt install gnome-tweak-tool
    
    Run Code Online (Sandbox Code Playgroud)
  2. 通过在已安装的应用程序中搜索“tweak tool”或输入gnome-tweak-tool终端来运行它。

  3. 转到“键盘和鼠标”->“中键粘贴”
  4. 关掉。

    截屏

就是这样。

或者只使用 CLI

gsettings set org.gnome.desktop.interface gtk-enable-primary-paste false
Run Code Online (Sandbox Code Playgroud)

在 16.04 上测试。

  • 使用 Tweaks 工具将是迄今为止最好的方法,如果它有效的话。我关闭了中键粘贴,它仍然和以前一样中键粘贴。重启后一样。有人解决过类似的问题吗? (30认同)
  • @Kvothe:我刚刚注意到 Tweak 工具中的设置似乎只影响某些标准的 Gnome 程序,如 gedit、gnome-terminal、gnome-calculator 等。另见 https://tinyurl.com/y7qtak7g(其他问题在这里,与没有答案)。我还注意到中间按钮粘贴将复制上次标记的任何文本,甚至不仅仅是明确复制的文本。然后剪贴板将填充该文本。一个非常烦人的功能。(然而,当文本最后一次在标准 Gnome 程序(如 gedit 等)中标记时,剪贴板将在单击中键时变为空。) (8认同)
  • 重启后就不行了:'( (6认同)
  • 同样有趣的是,对用当前选择覆盖剪贴板缓冲区的奇怪的中键行为的解释:https://askubuntu.com/a/225879/653860(但遗憾的是,完全禁用鼠标中键,如建议的那样回答,也完全禁用了我的鼠标滚轮。似乎没有简单的方法可以在不破坏其他关键输入功能的情况下摆脱这种愚蠢的行为。非常糟糕的设计......:/) (4认同)
  • “然后剪贴板将填充该文本。一个非常烦人的功能。” 好吧,不,我必须纠正自己。这不是真的。似乎复制和粘贴剪贴板独立于奇怪的中键剪贴板。中键将始终粘贴当前选择的内容。剪贴板不受此影响。 (3认同)
  • 使用 Ubuntu 18.04,在调整工具中禁用此选项仍会导致中间单击充当粘贴... (2认同)
  • 不再适用于 20.04 (2认同)

小智 53

我意识到这不是您想要的答案,但是您可以在 Firefox 中关闭此功能(例如,如果您不介意其他地方的功能,但仍希望在 Firefox 中单击鼠标中键以在新选项卡中打开链接)

在 about:config 中,设置

middlemouse.contentLoadURL false
middlemouse.paste false
Run Code Online (Sandbox Code Playgroud)

不是你问的问题,但由于这个问题与几个地方有关,我希望有人觉得这个答案有用。

  • +1 这很有帮助。我还要补充一点,在 LibreOffice 中,您可以在“工具/选项/LibreOffice/View/Mouse”中将“鼠标中键”更改为您的首选设置。 (4认同)
  • 解决了我所有的问题。+1 (2认同)

小智 36

Jared Robinson 给出了一个适用于我的机器的简单解决方案

运行以下命令:

xmodmap -e "pointer = 1 25 3 4 5 6 7 8 9"
Run Code Online (Sandbox Code Playgroud)

要保持此行为,请编辑 ~/.Xmodmap 并添加

pointer = 1 25 3 4 5 6 7 8 9
Run Code Online (Sandbox Code Playgroud)

  • 这不是完全禁用中间按钮吗?关闭标签、打开新标签的链接等怎么样? (37认同)
  • @HDave 这到底应该如何标记为一个问题的答案,该问题明确指出他已经看到将鼠标中键重新绑定到不同键的解决方案,但那些*不令人满意*?这正是这个答案的作用。 (26认同)
  • 谁能解释一下这一系列神奇数字的含义? (8认同)
  • 虽然这在理论上可以回答这个问题,但 [最好](​​http://meta.stackexchange.com/q/8259) 在此处包含答案的基本部分,并提供链接以供参考。 (3认同)
  • @Neil Traft我没有过多研究这个确切的配置,但是根据我对输入事件系统的理解,当你有一个像鼠标这样的输入设备时,当按下按钮时它会发回标准输入事件,这些事件告诉你“按钮改变了状态” ”、“该按钮有 id X”和“当前状态为按下/释放”通常 gtk 会修改它接收到的输入事件来映射按钮 id [0,1,2,3,4,5,6,7,8 ] 到 [1,2,3,4,5,6,7,8,9] 请记住,大多数鼠标仅使用前 3 个按钮 ID 来指示左、中、右按钮 ID。所以中间现在是 id 25 (3认同)

Mar*_*ppi 22

这目前是不可能的 - 但是,正如您所提到的,有一些方法可以禁用 MOUSE 3 按钮 - 或重新映射它 - 这些都没有找到问题的根源。X11 主要选择。

虽然这不是一个解决方案,但希望这个解释能清楚地说明原因。在 Ubuntu 中有两个剪贴板在工作。每个人都熟悉的 freedesktop.org 剪贴板(捕获Ctrl+C命令)第二个是剪贴板管理器,它在 Ubuntu 出现之前就一直在发挥作用 - X11。X Server (X11) 管理其他三个剪贴板:Primary SelectionSecondary SelectionClipboard. 当您用指针选择文本时,它会被复制到 XServer 中的缓冲区,即主要选择,并等待通过鼠标 3 按钮粘贴。另外两个被设计为由其他应用程序使用,以在应用程序之间共享公共剪贴板。在这种情况下,Ubuntu 中的 freedesktop.org 剪贴板管理器已经为我们完成了这项工作。

通过我的研究,我找不到禁用 X11 选择管理器的方法。没有可以禁用此功能的编译标志、应用程序或配置值。在每个应用程序的基础上有多种解决方法(这些应用程序中的大多数是命令行应用程序) - 但在全球范围内没有。

我意识到这不是一个理想的解决方案 - 但似乎是问题的真相。我能想到的唯一相关解决方案实际上是一个 hack,创建一个脚本来执行一个无限的 while 循环,该循环只是用空值替换主要选择。

首次安装xsel(用于操作 X 选择的工具)sudo apt-get install xsel

代码如下:

while(true)
do
    echo -n | xsel -n -i
    sleep 0.5
done
Run Code Online (Sandbox Code Playgroud)

如果你把它放在一个脚本中并将它添加到你的启动脚本中,这应该不是问题。

  • 有没有机会只清除缓冲区而不是取消所有选择的脚本? (4认同)
  • @umpirsky `while(true)` 不是问题,因为循环包含 `sleep 0.5`,它在每次循环迭代中放弃半秒的 CPU 时间。因此(以及构成循环另一部分的 `xsel` 命令调用的轻量级),即使在最慢的 Ubuntu 机器上,循环占用的 CPU 资源也将非常小。 (4认同)
  • 这在 Unity 上似乎效果不佳,因为脚本会清除终端中的任何现有选择,这意味着您无法通过任何方式从终端复制测试(当您尝试复制时,文本未选中)。 (4认同)
  • 而(真)?看起来它会杀死 CPU :) (2认同)
  • @CodeMouse92 不,X11 中没有无处不在的方式。Gnome 有它自己的设置,Firefox 有它自己的设置(即,当 Gnome 禁用它时,我的 Firefox *确实* 粘贴在中间按钮上),LibreOffice 有它自己的设置,等等。 (2认同)

Wes*_*ler 21

不知何故,我的 Ubuntu 安装中没有任何 xmodmap 文件,所以我不得不找到一种不同的方法来解决这个问题。

看看xinput命令。

xinput list | grep -i mouse
Run Code Online (Sandbox Code Playgroud)

其中列出了有关您的鼠标的信息。它显示我的鼠标是“Dell Premium USB Optical Mouse”,而且我还有“Macintosh mouse button emulation”。有了这些信息,我可以

xinput get-button-map "Dell Premium USB Optical Mouse"
Run Code Online (Sandbox Code Playgroud)

这给了我一个看起来像的清单

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
Run Code Online (Sandbox Code Playgroud)

这是有用的、必需的知识。我的鼠标理论上有 18 个按钮。每个按钮的默认操作与其按钮编号具有相同的名称。换句话说,按钮 1 执行动作 1,按钮 4 执行动作 4,等等。动作 0 表示“关闭”。

位置在清单显示分配给该按钮的功能。所以如果我的按钮映射读取

1 3 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
Run Code Online (Sandbox Code Playgroud)

这意味着按钮 1(位置 1)执行动作 1(正常左按钮),按钮 2(位置 2)执行动作 3(中间按钮),按钮 3(位置 3)执行动作 2(右按钮)。

要制作左手鼠标,您只需要一个开始的按钮图

3 2 1 4 5 .....
Run Code Online (Sandbox Code Playgroud)

或者,在您的情况下,您似乎希望中间按钮与按钮 1(左按钮)执行相同的操作,因此您的地图需要启动

1 1 3 ....
Run Code Online (Sandbox Code Playgroud)

我会因此重置我的鼠标按钮映射:

xinput set-button-map "Dell Premium USB Optical Mouse" 1 1 3 5 6 6 7 8 9 10 11 12 13 14 15 16 17 18
Run Code Online (Sandbox Code Playgroud)

在您的情况下,您可能有不同数量的映射按钮,并且已经定义了一些特殊的按钮映射。同样,您的鼠标也有不同的名称。首先,获取鼠标的“名称”。然后,使用get-button-map操作来查找您的基本按钮映射。最后,使用set-button-map选项,修改按钮 2 以执行操作 1。

这不是永久性的变化。我将必要的代码添加到我的.bashrc 中,以便在我每次登录或打开终端时执行。

希望这可以帮助。

  • OP不想将鼠标中键设置为与button1相同,因为这将禁用预期的中键单击功能(用他的话说:“_选项卡关闭,自动打开链接到新选项卡等_”)。 (4认同)
  • 如果您重新映射为两键鼠标,则不应更改滚轮功能,因为滚轮按下按钮 5 和 6(或 7 和 8 或类似的按钮)。 (2认同)
  • 我可以确认这适用于内置的 ThinkPad 小指点和具有相同布局的联想键盘。联想键盘上的“get-button-map”为我提供了 22 个按钮,但相同的“set-button-map <<name-or-id>> 1 0 3”方法也适用于我 (2认同)

Jel*_*rts 16

有关问题的解决方案,请查看我写的本指南

不久前,我写了一个补丁来禁用 GTK 中的“鼠标中键粘贴”功能。我以为会有其他人也想禁用它,因此我想我应该写一个小指南来解释如何实现这一壮举。

现在,有些人可能会问,为什么有人要禁用它?有几个原因:

  • 鼠标中键实际上并没有粘贴所谓的 XA_CLIPBOARD 剪贴板,而是 XA_PRIMARY 剪贴板。这对许多人来说可能是违反直觉的(也许来自 Windows 的用户),因此有些人可能认为禁用“不一致”或意外行为对用户更友好。
  • 有些人可能会不小心使用鼠标中键粘贴文本,并希望避免这种情况。

关于 XA_CLIPBOARD 和 XA_PRIMARY 剪贴板的一些背景知识: XA_PRIMARY 剪贴板主要用于存储选择。每当您在例如 GNOME 文本编辑器 (gedit) 中选择某些文本时,该文本就会被复制到 XA_PRIMARY 剪贴板。当您使用“编辑 -> 粘贴”菜单项时,不会粘贴此文本,仅当您单击鼠标中键时。XA_CLIPBOARD 剪贴板主要用于使用一般的“复制/粘贴”功能(通过键盘快捷键,例如 CTRL+C 和 CTRL+V,或通过菜单项“编辑 -> 复制”和“编辑 -> 粘贴”) )。

也许这种补丁(或对 X 剪贴板和/或库/应用程序如何使用它的更剧烈的变化)有一天会成为 Linux 的标准。我意识到对此的看法大相径庭。然而,对于那些试图尽量减少意外粘贴一些随机文本的机会的人来说,补丁可能非常有用。例如,使用补丁,您不会意外地将文本粘贴(至少使用鼠标中键)到您正在编辑的文档、网页或即时消息等中。

该指南适用于 Debian 或基于 Debian 的 Linux 发行版,例如 Ubuntu 和 Mint。

下面是终端命令及其功能的简要说明(以 # 开头的行是注释,其中包含这些说明)。仔细阅读说明后,您应该启动终端并一一输入命令。

# This is a small guide that explains how to patch GTK so that the middle mouse
# button doesn't paste text anymore.

# NOTE:
# The below instructions are for GTK2. However, they should be easy to adapt
# for GTK3 (at the time of writing, the patch works fine for GTK3 too).

# First, update the system by first synchronizing the package index files, and
# then upgrading the packages.
sudo apt-get update
sudo apt-get upgrade

# Get the build dependencies and essential packages needed in order to compile
# code and create packages.
sudo apt-get build-dep libgtk2.0-0
sudo apt-get install build-essential

# Create a temporary directory, in which we will store the GTK sources and
# later on the packages.
mkdir /tmp/gtk
cd /tmp/gtk

# Download the actual patch that will disable the 'middle mouse button paste'
# functionality (it should be stored in the directory '/tmp/gtk', and will be,
# if you indeed executed the command 'cd /tmp/gtk').
wget http://subversion.assembla.com/svn/slipstream/patches/gtk_disable_middle_mouse_button_paste.patch

# Retrieve the GTK sources.
apt-get source libgtk2.0-0

# You should adapt this line so that it changes to the correct directory (the
# name of the directory that I used here will probably not match the name of
# the directory that was created during 'apt-get source libgtk2.0-0', as it
# contains a version number that often changes). You can find out what the
# correct directory is by entering 'ls -d */' (without the quotes) and looking
# at the names of the directories that it shows.
cd gtk+2.0-2.20.1

# Apply the patch that we downloaded earlier.
patch -p1 < /tmp/gtk/gtk_disable_middle_mouse_button_paste.patch

# The output of the previous command should be:
#     patching file gtk/gtkselection.c
# If it wasn't, then something went wrong. Maybe you mistyped something, maybe
# the current directory isn't the correct directory, maybe the GTK sources
# were changed and the patch doesn't work anymore, etc.

# Build the package (you may have to be patient, this may or may not take a
# while).
dpkg-buildpackage -uc -us --source-option=--auto-commit

# You should adapt this line so that it installs the correct package. The
# package that we want to install is the package containing the GTK library,
# thus _not_ the 'bin', 'udeb', 'common', 'dev', or 'doc' package. To find out
# what the exact package is that you should install, try to find the package (a
# file with a name ending in '.deb') which is closest to the example filename I
# used here (the packages are stored in '/tmp/gtk', and you can list the
# packages using the command 'ls /tmp/gtk/*.deb' (without the quotes)).
sudo dpkg -i ../libgtk2.0-0_2.20.1-2_i386.deb

# And lastly, to make sure that only the patched library is in use, you should
# either log out and back in, or restart your computer.
# And then, the 'middle mouse button paste' functionality should be disabled.
# To test whether it is, try selecting some text in the GNOME Text Editor, or
# in a GNOME Terminal, and then press the middle mouse button while the cursor
# hovers over some place where you can normally type text. If indeed no text
# appears, then it appears that the patch worked.
# If however, the patch did not work, try to re-read this document, to see if
# you made any mistake. And if you did, you may want to either start all over
# again (should be fail-safe), or continue with the guide from the point where
# you made a mistake.
Run Code Online (Sandbox Code Playgroud)

或者,更直接地,这是在 GTK 中禁用“鼠标中键粘贴”功能的补丁

diff -ur gtk+2.0-2.20.1/gtk/gtkselection.c gtk+2.0-2.20.1-patched/gtk/gtkselection.c
--- gtk+2.0-2.20.1/gtk/gtkselection.c   2010-05-01 22:14:29.000000000 -0500
+++ gtk+2.0-2.20.1-patched/gtk/gtkselection.c   2011-09-17 10:45:37.000000000 -0500
@@ -1065,6 +1065,24 @@
   display = gtk_widget_get_display (widget);
   owner_window = gdk_selection_owner_get_for_display (display, selection);

+  if (selection == gdk_atom_intern("PRIMARY", TRUE)) {
+      GtkSelectionData selection_data;
+
+      selection_data.selection = selection;
+      selection_data.target = target;
+      selection_data.type = gdk_atom_intern("STRING", TRUE);
+      selection_data.format = 8;
+      selection_data.data = (unsigned char *)"";
+      selection_data.length = 0;
+      selection_data.display = display;
+
+      gtk_selection_retrieval_report(info, selection_data.type,
+              selection_data.format, selection_data.data,
+              selection_data.length, time_);
+
+      return TRUE;
+  }
+ 
   if (owner_window != NULL)
     {
       GtkWidget *owner_widget;
Run Code Online (Sandbox Code Playgroud)

  • 我使用 Ubuntu 12.04 64 位和 gtk 2.0-0_2.24.10,它在 dpkg-buildpackage 行上失败。它不会使用未提交的本地更改进行构建,因此我必须运行 dpkg-source --commit。 (2认同)
  • @Sam:谢谢您的提醒。显然,“--source-option=--auto-commit”选项可以传递给“dpkg-buildpackage”(这更方便,因为不必编辑更改日志)。我更新了指南以反映这一点。 (2认同)
  • 我尝试了这个解决方案,但每次进入“sudo apt-get build-dep libgtk2.0-0”部分时,都会出现“选择“gtk+2.0”作为源包而不是“libgtk2.0-0”的错误' E: 找不到 gtk+2.0 的源码包` 求助? (2认同)
  • @FCTW:我怀疑问题的原因是 GTK3 在现代发行版中取代了 GTK2。因此,您必须通过运行“dpkg -l |”之类的命令来找到已安装 GTK3 库的包名称。grep libgtk`。它可能类似于 libgtk-3-0。我已经验证我的补丁可以在 GTK3 的早期版本上运行;希望它仍然有效。 (2认同)
  • 这似乎是实际回答问题的唯一答案。不幸的是,它似乎已经过时了。任何目前有效的修复?(一般来说,我的意思是。调整工具可以在一些程序中关闭它,比如 Gedit,但不是在大多数程序中。) (2认同)

Ces*_*ian 7

适用于 Wayland 和 X11 用户的解决方案

该脚本将禁用鼠标中键粘贴,它支持 Wayland 和 X11,您仍然可以正常使用鼠标中键:

#!/bin/sh
#Script to disable middle mouse paste; Dependencies: xsel, wl-clipboard

if [ "$XDG_SESSION_TYPE" == "wayland" ]; then
    wl-paste -p --watch wl-copy -p '' # Usually works.
    #wl-paste -p --watch wl-copy -cp  # 100% Effective, may cause issues selecting text in GTK applications.
fi

while [ "$XDG_SESSION_TYPE" == "x11" ]; do
    xsel -fin </dev/null    # 100% Effective, May cause issues selecting text in GTK applications.
done
Run Code Online (Sandbox Code Playgroud)

旧答案(X11 的一种方法,不会导致 GTK 中的文本选择问题):https ://askubuntu.com/revisions/1079832/4


Kvo*_*the 7

唯一对我有用的答案是在https://unix.stackexchange.com/a/277488/288916 Radivarig上给出的(所有功劳归他所有)。请注意,我必须进行一项更改才能使其正常工作:

安装 xbindkeys:

sudo apt-get install xbindkeys xsel xdotool
Run Code Online (Sandbox Code Playgroud)

~/.xbindkeysrc使用文本为 xbindkeys 创建配置文件 :

"echo -n | xsel -n -i; pkill xbindkeys; xdotool click 2; xbindkeys"
b:2
Run Code Online (Sandbox Code Playgroud)

使用加载配置文件

xbindkeys -p
Run Code Online (Sandbox Code Playgroud)

将此行添加到,~./bashrc以便xbindkeys始终在启动时加载。

这对我有用,但 Radivarig 建议改用这条线

"echo -n | xsel -n -i; pkill xbindkeys; xdotool click 2; xbindkeys"
    b:2 + Release
Run Code Online (Sandbox Code Playgroud)

最后一个对我不起作用,但如果其中一个版本不起作用,我建议尝试另一个。

看了很长时间后,这是我发现的唯一解决方案,它可以普遍关闭鼠标中键粘贴按钮,而不必完全禁用鼠标中键。


请注意,对于现有的投票答案,要么他们不回答问题,而是告诉您如何完全禁用鼠标中键,要么他们提供仅适用于少数程序的解决方案(仅在 gedit 和gnome 终端和其他几个)或者他们只是说这是不可能的。


spawn 的回答具有类似的精神,也可能有效,但在找到此解决方案之前我没有看到它。

  • 这完全禁用了我的鼠标中键单击。 (2认同)

spa*_*awn 5

我建议使用其中一种,这对我来说最有效:

使用 xbindkeys:每当按下中间按钮时,清除主剪贴板。至少在我的系统上,在粘贴发生之前它已被清除。详细信息:创建 xbindkeys-config:

xbindkeys --defaults > $HOME/.xbindkeysrc
Run Code Online (Sandbox Code Playgroud)

粘贴以下新热键:

"xclip -i /dev/null"    
    b:2``
Run Code Online (Sandbox Code Playgroud)

重新加载 xbindkeys(例如 killall xbindkeys;xbindkeys)。完毕。

使用 xdotool:清除窗口焦点更改时的剪贴板(应该适用于大多数窗口管理器)。详细信息:执行以下命令:

xdotool search --onlyvisible . behave %@ focus exec xclip -i /dev/null
Run Code Online (Sandbox Code Playgroud)

请注意,使用此命令,您仍然可以在同一窗口中使用主剪贴板,或者在聚焦之前将鼠标中键按到另一个窗口上(如果您没有“焦点跟随鼠标”或其他东西被激活)。


小智 5

对于 Gnome 应用程序,您可以在“键盘和鼠标”选项卡下使用gnome-tweaks(程序包的新名称gnome-tweak-tool),其中有“中键单击粘贴”选项,或者直接编辑 org.gnome.desktop.interface/gtk-enable-primary-paste Gnome 选项。

对于 KDE 应用程序似乎有一个等效的解决方案

对于整个 X(包括非 Gnome 应用程序),您可以安装XMousePasteBlock,然后它必须运行(由用户运行就足够了,不需要 root)才能工作。这将完全禁用中键单击粘贴,而不会禁用其他中键单击功能。

  • XMousePasteBlock 最终对我有用。还有一个 AUR 包 xmousepasteblock-git。 (2认同)