Ubuntu 26.04 无法通过鼠标中键粘贴

在 Linux 中,有两个剪切板:

  1. Primary Selection:鼠标选中后可用鼠标中键直接粘贴
  2. Clipboard:需要明确的复制/粘贴命令,与 Windows 类似

Primary Selection 模式下,数据并不会在被选择时被复制到系统内存里。实际上,是源应用程序声称"我拥有这块数据",直到执行粘贴操作时,目标应用程序才会向源程序请求数据。这意味着,如果你选中文本后关闭了源程序,那么该数据就无法粘贴了,因为源程序已经不存在了。

Primary Selection

Primary Selection 在 GNOME 中,是受到一个开关控制的,通过 gsettings 查询 gtk-enable-primary-paste 的值,发现为 false:

shell 复制代码
$ gsettings get org.gnome.desktop.interface gtk-enable-primary-paste
false

通过 dconf 读取为空,在 system 和 user 中均没有配置过该 Key:

shell 复制代码
$ dconf read /org/gnome/desktop/interface/gtk-enable-primary-paste

说明 gtk-enable-primary-paste 使用的是 schema 层面的默认值:

shell 复制代码
$ cat /usr/share/glib-2.0/schemas/org.gnome.desktop.interface.gschema.xml
......
    <key name="gtk-enable-primary-paste" type="b">
      <default>false</default>
      <summary>Enable the primary paste selection</summary>
      <description>
        If true, gtk+ uses the primary paste selection, usually triggered by a middle mouse button click.
      </description>
    </key>
......

Ubuntu 26.04 相较于 24.04,修改了 schema 层面的默认值:true ---> false,可以通过 user 层面修改默认值:

shell 复制代码
$ gsettings set org.gnome.desktop.interface gtk-enable-primary-paste true

dconf

dconf 是 Gnome3 的默认的数据库后端。

  • 每个应用有自己的路径,来隔离访问权限
  • 图形化配置程序:dconf-editor
  • 命令行配置程序:gsettings, dconf

可以通过 DCONF_PROFILE 环境变量来影响 dconf 读取的数据库与顺序,默认配置是 /etc/dconf/profile/ibus

shell 复制代码
$ cat /etc/dconf/profile/ibus
user-db:user
system-db:ibus
  1. 寻找 ~/.config/dconf/ 下的 user 文件
  2. 寻找 /etc/dconf/db/ 下的 ibus 文件

可以通过 dconf 来直接读写一个 Key:

shell 复制代码
### 读
$ dconf read /org/gnome/desktop/interface/gtk-enable-primary-paste
### 写
$ dconf write /org/gnome/desktop/interface/gtk-enable-primary-paste true
### dump 所有
$ dconf dump /

GTK 应用是通过 gsettings 接口来获取配置的,因为还有一些 schema 层面的默认值,而 dconf 对于不存在的 Key 只会返回空:

shell 复制代码
### 读
$ gsettings get org.gnome.desktop.interface gtk-enable-primary-paste
### 写
$ gsettings set org.gnome.desktop.interface gtk-enable-primary-paste true

schema 架层面的源文件位于 /usr/share/glib-2.0/schemas/ 目录下,所以 gsettings 有三层数据来源:

  1. user:~/.config/dconf/
  2. system:/etc/dconf/db/
  3. schema:/usr/share/glib-2.0/schemas/