And*_*rew 83 xorg keyboard xkb
我想知道是否有任何命令行工具可以返回当前的键盘布局。
我已经XkbLayout设置为us, ru.
更新: setxkbmap返回布局设置,而不是选定的布局。例如:
$ setxkbmap -print | grep xkb_symbols
xkb_symbols { include "pc+us+ru:2+inet(evdev)+capslock(grouplock)+terminate(ctrl_alt_bksp)" };
Run Code Online (Sandbox Code Playgroud)
无论当前布局是什么,它都会返回相同的结果。
小智 37
也许这取决于版本,但在我使用setxkbmap1.3.0 的机器上,以下命令有效:
setxkbmap -query | grep layout
Run Code Online (Sandbox Code Playgroud)
请注意,根据您的需要,仅知道布局可能没有用:例如,美国布局的 Dvorak 变体与默认 QWERTY 完全不同。的-query的选项setxkbmap都给出了布局和变种,因为不同的领域:
$ setxkbmap -query
rules: evdev
model: default
layout: fr
variant: bepo
options: grp:alt_shift_toggle
Run Code Online (Sandbox Code Playgroud)
jas*_*yan 22
有 xkb-switch 描述如下:
xkb-switch 是一个 C++ 程序,允许查询和更改 XKB 布局状态。
https://github.com/ierton/xkb-switch
或者,按照 nozimica 的建议,您可以使用:
setxkbmap -print | awk -F"+" '/xkb_symbols/ {print $2}'Run Code Online (Sandbox Code Playgroud)
来自 Arch Linux 板上的这个线程:https : //bbs.archlinux.org/viewtopic.php?pid=539406
Pab*_*aga 22
是的,有一个命令行工具可以做你想做的事!我 10 分钟前才发现它:)
看这里:https : //github.com/nonpop/xkblayout-state
xkblayout-state print "%s"
Run Code Online (Sandbox Code Playgroud)
完全符合您的要求(它不输出行尾,因此请; echo根据需要添加)。运行不带参数的工具以获得帮助。
小智 15
使用它来获取当前布局的代码:
$(xset -q|grep LED| awk '{ print $10 }')
Run Code Online (Sandbox Code Playgroud)
这可能需要转换为您想要的形式,例如:
case "$(xset -q|grep LED| awk '{ print $10 }')" in
"00000002") KBD="English" ;;
"00001002") KBD="Thai" ;;
*) KBD="unknown" ;;
esac
Run Code Online (Sandbox Code Playgroud)
fik*_*nik 11
到目前为止的答案对我不起作用。我使用setkbmap英语和捷克语两种布局,因此任何-print或-query将始终返回这两种布局。Grepping LED 状态xset -q也不起作用,因为它显示了所有键盘 LED 的状态。
迄今为止最好的是快速编写这个小实用程序:https : //gist.github.com/fikovnik/ef428e82a26774280c4fdf8f96ce8eeb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <X11/XKBlib.h>
#include <X11/extensions/XKBrules.h>
int main(int argc, char **argv) {
Display *dpy = XOpenDisplay(NULL);
if (dpy == NULL) {
fprintf(stderr, "Cannot open display\n");
exit(1);
}
XkbStateRec state;
XkbGetState(dpy, XkbUseCoreKbd, &state);
XkbDescPtr desc = XkbGetKeyboard(dpy, XkbAllComponentsMask, XkbUseCoreKbd);
char *group = XGetAtomName(dpy, desc->names->groups[state.group]);
printf("Full name: %s\n", group);
XkbRF_VarDefsRec vd;
XkbRF_GetNamesProp(dpy, NULL, &vd);
char *tok = strtok(vd.layout, ",");
for (int i = 0; i < state.group; i++) {
tok = strtok(NULL, ",");
if (tok == NULL) {
return 1;
}
}
printf("Layout name: %s\n", tok);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并使用编译
gcc -I/usr/include getxkblayout.c -lX11 -lxkbfile
小智 9
由于xset -q命令输出的固定位置,另一种更简单的方法是:
xset -q | grep -A 0 'LED' | cut -c59-67
Run Code Online (Sandbox Code Playgroud)
它打印00000002或00001002取决于您当前的键盘布局。
小智 8
在较新的系统上,您可以使用
localectl status
例如,它将向您显示以下内容:
System Locale: LANG=en_US.UTF-8
VC Keymap: us
X11 Layout: us
Run Code Online (Sandbox Code Playgroud)
您可以使用xkbprint打印当前布局。
例如将当前布局打印为 PDF 使用
xkbprint -color "${DISPLAY}" - |\
ps2pdf - > current_keyboard_layout.pdf
Run Code Online (Sandbox Code Playgroud)
它产生: