현재 키보드 레이아웃은 어떻게 얻습니까?


61

현재 키보드 레이아웃을 반환하는 명령 줄 도구가 있는지 궁금합니다.

XkbLayout설정했습니다 us, ru.

업데이트 : setxkbmap 선택한 레이아웃이 아닌 레이아웃 설정을 반환합니다. 예 :

$ setxkbmap -print | grep xkb_symbols
xkb_symbols   { include "pc+us+ru:2+inet(evdev)+capslock(grouplock)+terminate(ctrl_alt_bksp)"   };

현재 레이아웃이 무엇이든 관계없이 동일한 결과를 반환합니다.


나는 D-Bus에 능숙하지 않지만 그것을 사용하여 현재 키보드 레이아웃을 쉽게 추적 할 수 있어야합니다. 활성 스위치가 없으면 그렇게하지 못할 수도 있습니다.
Benjamin

답변:


31

버전에 따라 다르지만 setxkbmap1.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


setxkbmap -print -verbose 10
erik

예를 들어, 레이아웃 cz와 us, 변형 dvorak이있는 후자 (104 키 키보드)를 설정하려면setxkbmap -model pc104 -layout cz,us -variant ,dvorak
erik

감사합니다, 일
Indacochea Wachín

19

다음과 같이 설명되는 xkb-switch가 있습니다.

xkb-switch는 XKB 레이아웃 상태를 쿼리하고 변경할 수있는 C ++ 프로그램입니다.

https://github.com/ierton/xkb-switch

또는 nozimica의 제안에 따라 다음을 사용할 수 있습니다.

setxkbmap -print | awk -F"+" '/xkb_symbols/ {print $2}'

아치 리눅스 보드 의이 스레드에서 : https://bbs.archlinux.org/viewtopic.php?pid=539406


1
감사합니다, xkb-switch잘 작동하지만 더 휴대용 솔루션이 있기를 바랍니다
Andrew

1
@Andrew : 그렇습니다. 현재 레이아웃을 얻는 간단한 방법이 없다는 것이 이상합니다.
Benjamin

7
당신은 setxkbmap하나 이상의 레이아웃을 정의 할 때 현재 활성화 된 레이아웃을 표시하지 않습니다.
terdon

13

예, 원하는 것을 수행하는 명령 줄 도구가 있습니다! 방금 10 분 전에 발견했습니다. :)

여기를보십시오 : https://github.com/nonpop/xkblayout-state

xkblayout-state print "%s"

원하는 것을 정확하게 수행합니다 (줄 끝을 출력하지 않으므로 ; echo필요한 경우 추가 하십시오). 도움말 매개 변수없이 도구를 실행하십시오.


11

현재 레이아웃의 코드를 얻으려면 이것을 사용하십시오.

$(xset -q|grep LED| awk '{ print $10 }')

다음과 같이 원하는 형식으로 변환해야 할 수도 있습니다.

case "$(xset -q|grep LED| awk '{ print $10 }')" in
  "00000002") KBD="English" ;;
  "00001002") KBD="Thai" ;;
  *) KBD="unknown" ;;
esac

3
내가 얻을 00000002내 레이아웃은 "미국 드보르작 국제"임에도 불구하고. 언어는 충분하지 않습니다 ...
l0b0

4
세 개 이상의 레이아웃이 있으면 도움이되지 않습니다. 두 번째와 세 번째 레이아웃은 00001004내 컴퓨터 에서 동일한 값 을 제공합니다 .
sastanin

문제 : numlock을 토글하고이 명령을 다시 시작하십시오;)
andras.tim

LED가 키보드 LED 버튼의 상태를 나타 내기 때문에 마스크를 사용해야합니다.
fikovnik

9

xset -q명령 출력의 고정 위치로 인한 또 다른 간단한 접근 방식 은 다음과 같습니다.

xset -q | grep -A 0 'LED' | cut -c59-67

인쇄 00000002하거나 00001002현재 키보드 레이아웃에 따라 다릅니다.


나는 이것을 좋아합니다 .8 자로 좁힐 수 있다고 생각합니다. c59-66.
xlembouras

8

최신 시스템에서는 다음을 사용할 수 있습니다

localectl status

예를 들어 다음과 같이 표시됩니다.

System Locale: LANG=en_US.UTF-8
       VC Keymap: us
      X11 Layout: us

3

지금까지 답변이 효과가 없었습니다. 내가 사용하는 setkbmap두 개의 레이아웃 영어 체코 그래서 어떤으로 -print또는 -query항상 두 가지를 반환합니다. xset -q모든 키보드 LED의 상태를 표시하기 때문에 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


3

xkbprint현재 레이아웃을 인쇄하는 데 사용할 수 있습니다 .

예를 들어 현재 레이아웃을 PDF로 인쇄하려면

xkbprint -color "${DISPLAY}" - |\
    ps2pdf - > current_keyboard_layout.pdf

어떤 생산 :

xkbprint 결과


2

에서 아치 리눅스 포럼 Goosfrabaa :

setxkbmap -v | awk -F "+" '/symbols/ {print $2}'

여기서 올바르게 작동하고 인쇄합니다 us(dvorak-intl)(그놈 키보드 선택 메뉴에서 "USA Dvorak international"으로 표시됨).


7
현재 레이아웃이 아닌 목록의 첫 번째 레이아웃 만 인쇄합니다.
sastanin

setxkbmap으로 언어 토글을 사용할 때 키맵을 어떻게 감지합니까? $ setxkbmap -v>> Trying to build keymap using the following components: | keycodes: evdev+aliases(qwerty) | types: complete | compat: complete+ledscroll(group_lock) | symbols: pc+us+hu:2+inet(evdev)+group(alt_shift_toggle)+compose(rwin)+terminate(ctrl_alt_bksp) | geometry: pc(pc105)이 경우 매번 "us"를 얻었습니다
andras.tim

0

부분 답변 : KDE 에서는 다음 qdbus명령을 통해 현재 키보드 레이아웃을 얻을 수 있습니다 .

$ qdbus org.kde.keyboard /Layouts getCurrentLayout
gb(intl)

여러 레이아웃이 구성되어 있지만 현재 사용중인 레이아웃 만 표시합니다.

Kubuntu 18.04 (qdbus 버전 4.8.7)에서 테스트되었습니다. 비 -Qt 환경을위한 다른 d- 버스 기반 솔루션이있을 수 있지만 그에 대해서는 모르겠습니다.


0
#! /bin/bash
#  (GPL3+) Alberto Salvia Novella (es20490446e)


keyboardLayout () {
    layout=$(variableInFile "KEYMAP" "/etc/vconsole.conf")
    echo ${layout}
}


variableInFile () {
    variable=${1}
    file=${2}

    source ${file}
    eval value=\$\{${variable}\}
    echo ${value}
}


keyboardLayout

-1

당신이 사용할 수있는:

setxkbmap -print | grep xkb_symbols

5
현재 레이아웃 (us 또는 ru)이 아닌 전체 키보드 설정을 반환합니다.
Andrew

@jasonwryan이 그 라인을주의 깊게 분석하면 레이아웃에 상주하므로 잘 실행하십시오. 제 경우에는입니다 latam.
nozimica

5
jasonwryan 버전은 '+'다음에 문자열의 일부를 출력합니다. xkb_symbols값은 선택한 레이아웃에 의존하지 않습니다. 항상 'us'를 얻습니다.
Andrew
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.