web-dev-qa-db-ja.com

現在のキーボードレイアウトを取得するにはどうすればよいですか?

現在のキーボードレイアウトを返すコマンドラインツールはあるのでしょうか。

XkbLayoutus, ruに設定しています。

pdate:setxkbmapは、選択されたレイアウトではなく、レイアウト設定を返します。例えば。:

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

現在のレイアウトが何であっても同じ結果を返します。

61
Andrew

多分これはバージョンに依存しますが、setxkbmap 1.3.0を使用する私のマシンでは、次のコマンドが機能します。

setxkbmap -query | grep layout

必要に応じて、レイアウトだけを知っていても役に立たない場合があります。たとえば、USレイアウトのDvorakバリアントは、デフォルトのQWERTYとはかなり異なります。 -querysetxkbmapのオプションは、レイアウトとバリアントの両方を異なるフィールドとして提供します。

$ setxkbmap -query
rules:      evdev
model:      default
layout:     fr
variant:    bepo
options:    grp:alt_shift_toggle
33
mars

このように記述されているxkbスイッチがあります。

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

21
jasonwryan

はいTHERE IS必要なことを実行するコマンドラインツールです。10分前に発見しました:)

ここを見てください: https://github.com/nonpop/xkblayout-state

xkblayout-state print "%s"

必要なことを正確に実行します(行末を出力しないため、必要に応じて; echoを追加します)。ヘルプのパラメーターなしでツールを実行します。

14
Pablo Saratxaga

これを使用して、現在のレイアウトのコードを取得します。

$(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
11
Pepa

xset -qコマンドの出力の位置が固定されているため、より簡単な別のアプローチは次のとおりです。

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

現在のキーボードレイアウトに応じて、00000002または00001002を出力します。

9
nikospag

新しいシステムでは、

localectl status

たとえば、次のように表示されます。

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

これまでの答えは私にとってうまくいきませんでした。私は、英語とチェコ語の2つのレイアウトでsetkbmapを使用しているため、-printまたは-queryは常に2つを返します。 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

5
fikovnik

xkbprintを使用して、現在のレイアウトを印刷できます。

たとえば、現在のレイアウトをPDFとして印刷するには

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

生成されるもの:

xkbprint result

3
Flow

Arch LinuxフォーラムのGoosfrabaa から:

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

これはここで正しく動作し、us(dvorak-intl)を出力します(GNOMEキーボード選択メニューで「USA Dvorak international」と表示されます)。

2
l0b0

部分的な回答:KDEの場合qdbusコマンドを使用して現在のキーボードレイアウトを取得できます。

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

いくつかのレイアウトを設定していますが、現在使用中のレイアウトのみが表示されています。

Kubuntu 18.04(qdbusバージョン4.8.7)でテスト済み。 Qt以外の環境用の他のd-busベースのソリューションがあるかもしれませんが、私はそれらについて知りません。

1
Qeole
#! /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