使终端在重新映射到不同的键时识别 PageUp 和 PageDown

使终端在重新映射到不同的键时识别 PageUp 和 PageDown

我知道 Terminal 默认不支持PgDnPgUp。我的键盘上没有PgDnPgUp,但目前已将它们重新映射到不同的键,因此Shift+PgDn不起作用。我也试过Fn+ Up。如何让 Terminal 识别我重新映射的分页键?

答案1

(评论:您找到了 XKB!恭喜,这是一个可怕的兔子洞。请注意,下次 ubuntu 的 xkb-data 包更新该文件时,您的解决方案将被吹走,并会影响您插入的任何其他使用相同配置的键盘。)

XKB 遵循一种称为 RMLVO 的模型——规则、模型、布局、变体、选项。您的解决方案会更改系统模型文件,但更好的解决方案是查找或创建一个选项来添加您的覆盖。(evdev是大多数发行版的默认规则,大多数外部键盘将使用模型pc,尽管笔记本电脑内部模型可能有已经接近您的用例的特定变体。标准美国 QWERTY 键盘将使用us没有变体的布局,但如果您使用其他语言,您可能会选择intlaltgr-intl变体。)

选项是基本功能的特定覆盖。如果您因为 CapsLock 键太差劲而想关闭它,那么已经有一个选项 ( caps:none),或者您可以将其设置为额外的 Esc 键 ( caps:escape)。您可以在 中看到特定的覆盖/usr/share/X11/xkb/symbols/caps;每个节都是您可以在运行时打开的不同选项。

如果你这样做了,setxkbmap -print你应该得到你当前的 XKB 设置列表:

$ setxkbmap -print
xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)" };
    xkb_types     { include "complete"  };
    xkb_compat    { include "complete"};
    xkb_symbols   { include "pc+us+inet(evdev)" };
    xkb_geometry  { include "pc(pc105)" };
};

创建覆盖文件:

$ mkdir -p .config/xkb/symbols
$ touch .config/xkb/symbols/pgupdown

现在用您最喜欢的编辑器编辑新文件并输入以下内容:

// mapping PgUp and PgDown to other keys
partial alphanumeric_keys
xkb_symbols "rwinmenu" {
    key <RWIN> { [ Prior     ]   };
    key <MENU> { [ Next      ]   };
};

// same but switched
partial alphanumeric_keys
xkb_symbols "menurwin" {
    key <MENU> { [ Prior     ]   };
    key <RWIN> { [ Next      ]   };
};

现在创建一个基本键盘映射:

$ setxkbmap -print > ~/.config/xkb/mymap

编辑该文件,并将新选项添加​​到符号列表中,格式如下+optionfile(function)

xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)" };
    xkb_types     { include "complete" };
    xkb_compat    { include "complete"};
    xkb_symbols   { include "pc+us+inet(evdev)+pgupdown(rwinmenu)" };
    xkb_geometry  { include "pc(pc105)" };
};

如果您稍后决定更喜欢使用菜单键上的 PgUp,只需将其替换rwinmenumenurwin那里就可以了。

现在你可以使用以下命令加载该文件xkbcomp

$ xkbcomp -I$HOME/.config/xkb $HOME/.config/xkb/mymap $DISPLAY

启动xev(从x11-utils包中)并按下按键以确保更改已加载:

# sed to scrape out non-kbd events; xev is pretty spammy
$ xev | sed -ne '/^KeyPress/,/^$/p'

如果您已将所有内容放在正确的位置,则菜单键应该会发送 Next 事件,而 Win_R 键会发送 Prior。如果可行,您可以将上述xkbcomp命令添加到您的.xinitrc.xprofile以便在您登录或启动 X 时运行。

...除非你运行的是 Gnome。(和/或可能是 KDE。)然后我们进一步深入研究,并找出如何将这个新选项合并到系统文件中,以便 DE 可以将其作为标准选项。本质上,这将涉及

  1. 将您的选项文件放入/usr/share/X11/xkb/symbols/(这就是为什么pgupdown是一个好的选择,因为没有预先存在的具有该名称的符号文件)
  2. 然后添加行/usr/share/X11/xkb/rules/evdev*(将optionsfile:function命令行的格式映射到所+optionsfile(function)使用的格式xkbcomp
  3. 最后设置 DE 以使用您喜欢的布局和选项。

第 2 步:如果您需要采用这条路线,则可能需要在任何与 xkb 相关的升级之后再次执行步骤 2。

# in /usr/share/X11/xkb/rules/evdev
# find the line that starts "! option = symbols" and add new lines:
  pgupdown:rwinmenu = +pgupdown(rwinmenu)
  pgupdown:menurwin = +pgupdown(menurwin)

# in /usr/share/X11/xkb/rules/evdev.lst
# find the line that starts "! option" and add a new line:
  pgupdown:rwinmenu          PgUp on RWin, PgDown on Menu
  pgupdown:menurwin          PgUp on Menu, PgDown on RWin

# in /usr/share/X11/xkb/rules/evdev.xml
# .... ummm .... ¯\_(ツ)_/¯  .... sorry! ....

步骤 3:检查localectl系统上是否可用。 localectl可以配置虚拟控制台键盘以及设置系统默认的 X11 键盘。由于这两个选项都是在规则文件中设置的,因此您可以在这些命令中使用rwinmenumenurwin

$ localectl set-x11-keymap us pc "" pgupdown:rwinmenu
#  format               [layout] [model] [variant] [option1,...,optionN]

对于 Gnome,您需要使用dconf-editorgsettings

# set layout/variant
$ gsettings set org.gnome.desktop.input-sources sources "[('xkb', 'us')]"

# set options
$ gsettings set org.gnome.desktop.input-sources xkb-options "['pgupdown:rwinmenu']"

Gnome 的另一个选项可能是禁用其键盘设置;这应该允许 localectl 选项或 user-config 选项保持有效:

$ gsettings set org.gnome.settings-daemon.plugins.keyboard active false

故障排除:如果您的更改似乎没有被采纳,并且您确定文件格式正确,请*.xkm从中删除所有文件/var/lib/xkb/。这些是缓存的预编译键盘映射,可能会妨碍您。

资源:

答案2

更改 /usr/share/X11/xkb/symbols/pc 上的键似乎有效,我无法使上面的其他答案起作用。然后,您将新键与 Shift 按钮一起使用。

key <RWIN> {    [ Prior     ]   };
key <MENU> {    [ Next          ]   };

答案3

默认的 Ubuntu 终端支持 pgup 和 pgdn,快捷键为 [shift]+pgup 和 [shift]+pgdn。您尝试的大多数其他终端都会有完全相同的快捷键,主要是因为 pgup 和 pgdn 已被 bash 用于某些用途,因此您无法真正使用它。

编辑:如果您需要重新映射 pgup 和 pgdn 键,您可以按照 askubuntu for linux 上的答案进行操作:

https://askubuntu.com/questions/24916/how-do-i-remap-certain-keys-or-devices/24930#24930

相关内容