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


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があまり得意ではありませんが、それを使用して現在のキーボードレイアウトを簡単に追跡できるはずです。ただし、アクティブなスイッチがない場合はそうできない場合があります。
ベンジャミン

回答:


31

これはバージョンに依存しているのかもしれませんが、setxkbmap1.3.0 を使用する私のマシンでは次のコマンドが機能します。

setxkbmap -query | grep layout

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

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

3
-queryで追加されましたsetxkbmap 1.2.0
alanc

現在のレイアウトとバリアント、および多くの追加情報を取得しますsetxkbmap -print -verbose 10
erik

それを設定するには、たとえばレイアウトczと私たち、後者はバリアントdvorak(104キーキーボード用)を使用しますsetxkbmap -model pc104 -layout cz,us -variant ,dvorak
erik

ありがとう、働く
IndacocheaWachínSep

19

このように説明されている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


1
ありがとう、xkb-switchうまくいきますが、よりポータブルなソリューションがあることを願っています
アンドリュー

1
@Andrew:はい、それはちょっと奇妙です。現在のレイアウトを取得する簡単な方法はありません。
ベンジャミン

7
あなたはsetxkbmap、複数のレイアウトが定義されている場合、現在アクティブなレイアウトが表示されません。
テルドン

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私のレイアウトは「USA Dvorak international」ですが、取得できます。言語が十分ではありません
...-l0b0

4
3つ以上のレイアウトがある場合は役に立ちません。2番目と3番目のレイアウト00001004は、マシン上で同じ値を提供します。
サスタニン

問題:numlockを切り替えて、このコマンドを再度開始してください;)
andras.tim

これは確実に機能しません。LEDはキーボードのLEDボタンの状態も示すため、マスクを使用する必要があります。
fikovnik

9

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

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

印刷する0000000200001002、現在のキーボードレイアウトによって異なります。


私はこれが好きです、8文字に絞り込むことができると思います。c59-66
xlembouras 14

8

新しいシステムでは、次を使用できます

localectl status

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

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

3

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


3

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

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

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

生成するもの:

xkbprintの結果


2

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

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

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


7
リストの最初のレイアウトのみを印刷し、現在のレイアウトは印刷しません。
サスタニン

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)このケースでは、私は毎回、「私たち」を得た
andras.tim

0

部分的な回答:KDEでは、次のqdbusコマンドで明らかに現在のキーボードレイアウトを取得できます。

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

複数のレイアウトを構成していますが、現在使用中のレイアウトのみが表示されます。

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


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)ではなく、全体的なキーボード設定を返します
アンドリュー

@jasonwryanがその行を慎重に分析すると、その行がレイアウトにあると述べているように、それを適切に実行します。私の場合、そうですlatam
-nozimica

5
「+」の後jasonwryanバージョンだけ出力文字列の一部、xkb_symbols値が選択したレイアウトに依存しない、私はいつも「私たち」を取得
アンドリュー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.