現在のキーボードレイアウトを返すコマンドラインツールはあるのでしょうか。
XkbLayout
をus, ru
に設定しています。
pdate:setxkbmap
は、選択されたレイアウトではなく、レイアウト設定を返します。例えば。:
$ setxkbmap -print | grep xkb_symbols
xkb_symbols { include "pc+us+ru:2+inet(evdev)+capslock(grouplock)+terminate(ctrl_alt_bksp)" };
現在のレイアウトが何であっても同じ結果を返します。
多分これはバージョンに依存しますが、setxkbmap
1.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
このように記述されている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
はいTHERE IS必要なことを実行するコマンドラインツールです。10分前に発見しました:)
ここを見てください: https://github.com/nonpop/xkblayout-state
xkblayout-state print "%s"
必要なことを正確に実行します(行末を出力しないため、必要に応じて; echo
を追加します)。ヘルプのパラメーターなしでツールを実行します。
これを使用して、現在のレイアウトのコードを取得します。
$(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
xset -q
コマンドの出力の位置が固定されているため、より簡単な別のアプローチは次のとおりです。
xset -q | grep -A 0 'LED' | cut -c59-67
現在のキーボードレイアウトに応じて、00000002
または00001002
を出力します。
新しいシステムでは、
localectl status
たとえば、次のように表示されます。
System Locale: LANG=en_US.UTF-8
VC Keymap: us
X11 Layout: us
これまでの答えは私にとってうまくいきませんでした。私は、英語とチェコ語の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
Arch LinuxフォーラムのGoosfrabaa から:
_setxkbmap -v | awk -F "+" '/symbols/ {print $2}'
_
これはここで正しく動作し、us(dvorak-intl)
を出力します(GNOMEキーボード選択メニューで「USA Dvorak international」と表示されます)。
部分的な回答:KDEの場合、qdbus
コマンドを使用して現在のキーボードレイアウトを取得できます。
$ qdbus org.kde.keyboard /Layouts getCurrentLayout
gb(intl)
いくつかのレイアウトを設定していますが、現在使用中のレイアウトのみが表示されています。
Kubuntu 18.04(qdbusバージョン4.8.7)でテスト済み。 Qt以外の環境用の他のd-busベースのソリューションがあるかもしれませんが、私はそれらについて知りません。
#! /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