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

Wil*_*iam 4 linux linux-terminal

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

qui*_*tic 10

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

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

选项是对基本功能的特定覆盖。如果您想关闭 CapsLock 因为该键很糟糕,那么已经有一个选项 ( caps:none),或者您可以将其设置为额外的 Escape 键 ( 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)" };
};
Run Code Online (Sandbox Code Playgroud)

创建您的覆盖文件:

$ mkdir -p .config/xkb/symbols
$ touch .config/xkb/symbols/pgupdown
Run Code Online (Sandbox Code Playgroud)

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

// 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      ]   };
};
Run Code Online (Sandbox Code Playgroud)

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

$ setxkbmap -print > ~/.config/xkb/mymap
Run Code Online (Sandbox Code Playgroud)

编辑该文件,并将您的新选项添加​​到以下格式的符号列表中+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)" };
};
Run Code Online (Sandbox Code Playgroud)

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

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

$ xkbcomp -I$HOME/.config/xkb $HOME/.config/xkb/mymap $DISPLAY
Run Code Online (Sandbox Code Playgroud)

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

# sed to scrape out non-kbd events; xev is pretty spammy
$ xev | sed -ne '/^KeyPress/,/^$/p'
Run Code Online (Sandbox Code Playgroud)

如果你把所有东西都放在正确的地方,你的菜单键应该发送 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! ....
Run Code Online (Sandbox Code Playgroud)

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

$ localectl set-x11-keymap us pc "" pgupdown:rwinmenu
#  format               [layout] [model] [variant] [option1,...,optionN]
Run Code Online (Sandbox Code Playgroud)

对于 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']"
Run Code Online (Sandbox Code Playgroud)

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

$ gsettings set org.gnome.settings-daemon.plugins.keyboard active false
Run Code Online (Sandbox Code Playgroud)

疑难解答:如果您的更改似乎没有被接受,并且您确定文件格式正确,请*.xkm/var/lib/xkb/. 这些是缓存的预编译键映射,可能会妨碍您。

资源:

  • 我注意到您的帐户未注册。你的答案*好*所以去注册一个帐户。如果出现任何异常,请联系我们要求合并。 (2认同)