it-swarm.cn

如何获得当前的键盘布局?

我想知道是否有任何命令行工具可以返回当前的键盘布局。

我将XkbLayout设置为us, ru

更新: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

请注意,根据您的需要,仅了解布局可能没用:例如,美国布局的Dvorak变体与默认QWERTY完全不同。 setxkbmap-query选项提供布局和变体形式,作为不同的字段:

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

有xkb开关,其描述如下:

xkb-switch是一个C++程序,它允许查询和更改XKB布局状态。

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

是的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

根据您当前的键盘布局,它会打印0000000200001002

9
nikospag

在较新的系统上,您可以使用

localectl status

例如,它将向您显示以下内容:

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

到目前为止的答案对我没有用。我将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

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总线的解决方案,但我不知道这些解决方案。

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
0
Alberto Salvia Novella