현재 키보드 레이아웃을 반환할 수 있는 명령줄 도구가 있는지 궁금합니다.
XkbLayout
으로 설정 했습니다 us, ru
.
고쳐 쓰다: setxkbmap
선택한 레이아웃 대신 레이아웃 설정을 반환합니다. 예를 들어:
$ setxkbmap -print | grep xkb_symbols
xkb_symbols { include "pc+us+ru:2+inet(evdev)+capslock(grouplock)+terminate(ctrl_alt_bksp)" };
현재 레이아웃이 무엇이든 동일한 결과를 반환합니다.
답변1
버전과 관련이 있을 수도 있지만 setxkbmap
1.3.0을 사용하는 내 컴퓨터에서는 다음 명령이 작동합니다.
setxkbmap -query | grep layout
필요에 따라 레이아웃을 아는 것만으로는 유용하지 않을 수 있습니다. 예를 들어 미국 레이아웃의 Dvorak 변형은 기본 QWERTY와 상당히 다릅니다. -query
옵션은 setxkbmap
레이아웃과 변형을 다양한 필드로 제공합니다.
$ setxkbmap -query
rules: evdev
model: default
layout: fr
variant: bepo
options: grp:alt_shift_toggle
답변2
예, 귀하의 요구 사항에 맞는 명령줄 도구가 있습니다! 10분전에 발견했어요 :)
이봐:https://github.com/nonpop/xklayout-state
xkblayout-state print "%s"
원하는 것을 정확하게 수행합니다(줄 끝을 출력하지 않으므로 ; echo
필요한 경우 추가하십시오). 도움말을 보려면 인수 없이 도구를 실행하세요.
답변3
다음과 같이 설명되는 xkb-switch가 있습니다.
xkb-switch는 XKB 레이아웃 상태를 쿼리하고 변경할 수 있는 C++ 프로그램입니다.
https://github.com/ierton/xkb-switch
또는 nozimica가 제안한 대로 다음을 사용할 수 있습니다.
setxkbmap -print | awk -F"+" '/xkb_symbols/ {print $2}'
Arch Linux 보드의 이 스레드에서:https://bbs.archlinux.org/viewtopic.php?pid=539406
답변4
지금까지의 답변은 나에게 적합하지 않습니다. 저는 setkbmap
영어와 체코어 레이아웃을 모두 사용하고 있으므로 any -print
또는 -query
는 항상 두 레이아웃을 모두 반환합니다. 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;
}
다음을 사용하여 컴파일
gcc -I/usr/include getxkblayout.c -lX11 -lxkbfile