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


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,但我认为使用它应该很容易跟踪当前的键盘布局。如果没有活动的开关,则可能无法执行此操作。
本杰明

Answers:


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

3
-query在溶液中加入setxkbmap 1.2.0
alanc

您可以使用setxkbmap -print -verbose 10
erik

要进行设置,例如cz和us布局,后者具有dvorak变体(用于104键键盘),请使用setxkbmap -model pc104 -layout cz,us -variant ,dvorak
erik

谢谢,工作
IndacocheaWachín

19

有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


1
谢谢,xkb-switch工作正常,但我希望有更多可移植的解决方案
安德鲁

1
@Andrew:是的,这很奇怪,没有简单的方法来获取当前布局。
本杰明

7
setxkbmap当定义多个布局时,您的不会显示当前活动的布局。
terdon


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即使我的布局是“美国Dvorak国际”,我也能得到。语言还不够...
l0b0 2012年

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 2014年

8

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

localectl status

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

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

3

您可以xkbprint用来打印当前布局。

例如将当前布局打印为PDF,请使用

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

产生:

xkbprint结果


2

Goosfrabaa在Arch Linux的论坛

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

这在这里可以正常工作并进行打印us(dvorak-intl)(在GNOME键盘选择菜单中显示为“ 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)在这种情况下,我每次都会得到“我们”
andras.tim

2

到目前为止的答案对我没有用。我使用setkbmap两种布局english和czech,所以any -print-query总是返回两者。抓住LED的状态xset -q也不起作用,因为该状态会显示所有键盘指示灯的状态。

迄今为止最好的方法是快速编写此小实用程序: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


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
它会返回总体键盘设置,而不是当前布局(美国俄罗斯)
Andrew

如@jasonwryan指出的,如果您仔细分析该行,请执行得很好,并将其放置在布局中。就我而言latam
nozimica 2011年

5
jasonwryan版本仅在'+'之后输出字符串的一部分,xkb_symbols值不取决于所选的布局,我总是得到' us'–
Andrew
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.