如何从终端获取当前的gnome键盘布局?


15

为了在bash脚本中使用,我需要获取用户当前正在使用的gnome键盘布局。例如,如果用户将其键盘布局设置为en-us,那么我需要一个bash命令来向我打印此命令。

我如何获得该信息?

更新:

setxkbmap -query不幸地是无法正常工作。以下是激活了en(第一个命令)和de(第二个命令)布局的输出。切换键盘布局似乎与gnome会话配置有关

setxkbmap -query 
rules:      evdev
model:      pc105
layout:     us,de
variant:    ,
options:    terminate:ctrl_alt_bksp,lv3:ralt_switch,grp:alts_toggle

setxkbmap -query
rules:      evdev
model:      pc105
layout:     us,de
variant:    ,
options:    terminate:ctrl_alt_bksp,lv3:ralt_switch,grp:alts_toggle

更新2:

setxkbmap -print #with en-us layout
xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)" };
    xkb_types     { include "complete"  };
    xkb_compat    { include "complete"  };
    xkb_symbols   { include "pc+us+de:2+inet(evdev)+level3(ralt_switch_for_alts_toggle):1+level3(ralt_switch_for_alts_toggle):2+group(alts_toggle)+level3(ralt_switch)+terminate(ctrl_alt_bksp)"    };
    xkb_geometry  { include "pc(pc105)" };
};
setxkbmap -print #after switching to german layout
xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)" };
    xkb_types     { include "complete"  };
    xkb_compat    { include "complete"  };
    xkb_symbols   { include "pc+us+de:2+inet(evdev)+level3(ralt_switch_for_alts_toggle):1+level3(ralt_switch_for_alts_toggle):2+group(alts_toggle)+level3(ralt_switch)+terminate(ctrl_alt_bksp)"    };
    xkb_geometry  { include "pc(pc105)" };
};

遗憾的是,它不是bash,而是使用libxklavier,这是一个[python示例] [1]来执行您的要求:[1]:cgit.freedesktop.org/libxklavier/tree/tests/test_gi.py
气球

1
<rant> xkb是一个无证的地狱!这些多个布局定义无法可靠地工作;对我来说,它们突然在随机时间切换,并在暂停后随机确定哪个定义的布局有效,更糟糕的是,每个连接的键盘独立。是的,xkb实际上可以为不同的键盘使用不同的布局,但是据我所知,这在任何地方都没有记录,因此此功能唯一的作用是使我们烦恼,因为我们无法控制它。xkb,认真,别让我开始!</ rant>
克里斯蒂安

Answers:


9

根据关于Stackoverflow的类似问题,以下方法可以解决问题:

setxkbmap -print | grep xkb_symbols | awk '{print $4}' | awk -F"+" '{print $2}'

我无法验证它,因为我目前没有配备X的* nix机器(我不在家)...


1
运行setxkbmap -print返回以下内容。我认为这对OP没有帮助。xkb_keymap { xkb_keycodes { include "evdev+aliases(qwerty)" }; xkb_types { include "complete" }; xkb_compat { include "complete" }; xkb_symbols { include "pc+us+inet(evdev)" }; xkb_geometry { include "pc(pc105)" }; };
气球2012年

因此,您当前有“我们”的布局处于活动状态吗?在给定您的输入的情况下,这就是上面的语句将产生的结果(只有这两个字母:“ us”)。切换到其他布局时的外观如何?
Izzy 2012年

2
感谢您的回答。不幸的是,这并没有解决问题。两次我都得到我们。我已对问题进行了编辑,以向您显示输出。
ftiaronsem 2012年

值得一试。您可以尝试指定-v参数(多次),这会增加详细程度,从而提供更多信息。应该同时适用于-query-print。由于我没有多语言设置,因此我无法确定它是否提供所需的详细信息-但-v此处的输出是3倍,分为“应用规则”和“键映射”。后者似乎是完整的信息,因此第一部分可以包含“当前活动的部分”。
Izzy 2012年

再次感谢,但不幸的是,这也没有解决。布局更改前后的输出相同。与冗长无关。
ftiaronsem 2012年

4

对于Ubuntu 17.10或更高版本

在使用GNOME的Ubuntu 17.10中,切换输入源时不会更改当前的 gsettings值。取而代之的是一个MRU-源键,它列出了 OST ř ecently ù sed的输入源。

$ gsettings get org.gnome.desktop.input-sources mru-sources
[('xkb', 'se'), ('xkb', 'us')]

该列表中的第一个源是当前源,因此用于获取当前布局的oneliner可能如下所示:

gsettings get org.gnome.desktop.input-sources mru-sources | sed -r "s/\S*\s'([^']+).*/\1/"

请注意,如果您在Ubuntu 17.10系统上使用Unity,则此答案不适用。使用Unity可以像以前一样继续工作。


3

对于Ubuntu 13.04及更低版本

您可以使用xkblayout-state工具。有关说明,编译,安装和使用,请参见README.md文件。

以下命令将完全满足您的要求:

xkblayout-state print "%s"

对于Ubuntu 13.10及更高版本

从这个意义上讲,Ubuntu 13.10进行了一些改进,您可以使用以下简单的bash函数:

get_current_xkblayout () {
      current_input_nr=$(gsettings get org.gnome.desktop.input-sources current | \
          awk '{ print $NF }')
      shift=$(( 2 * ( $current_input_nr + 1 )))
      gsettings get org.gnome.desktop.input-sources sources | tr -d "\',[]()" | \
          awk -v cur="$shift" '{ print $cur }'
}

以下命令在13.10中也适用:

setxkbmap -query | awk -F"(,|[ ]+)" '/layout:/ { print $2 }'

要么:

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

2

只需按键盘上的Ctrl+ Alt+ T打开终端。打开时,运行以下命令。

setxkbmap -query

这是你应该看到的

在此处输入图片说明


感谢您的迅速答复,很遗憾,此方法无法正常工作。这是输出(第一次使用en布局,第二次使用de):
ftiaronsem 2012年

由于格式粘贴为问题编辑...
ftiaronsem 2012年

1
再次感谢您的及时答复。这是我所看到的,但这并没有告诉我是选择德国还是美国的布局。还是我错过了什么?
ftiaronsem 2012年

2

使用终端,我进行了一个在“ pt”和“ us”之间切换的测试,每次更改后,我都收集了成功使用的键盘布局:

获取活动的键盘布局

setxkbmap -print | grep xkb_symbols | awk -F"+" '{print $2}'
  • 打印配置: setxkbmap -print
  • 收集重要的行: grep xkb_symbols
  • 在第一个“ +”号之后获取字符串: awk -F"+" '{print $2}'

激活“我们”布局的输出为: us


布局之间切换

sudo setxkbmap -option grp:alt_shift_toggle pt

将其读为“ pt”,并将其切换为语言代码。

在此处输入图片说明

注意: 我在Ubuntu 12.04(精确的穿山甲)上使用Gnome


感谢您的回答。问题似乎是用户倾向于使用任务栏小程序在布局之间切换。如果从cmd切换布局,则可以使用,但如果用户使用任务栏小程序进行切换,则不起作用。
ftiaronsem 2012年

@ftiaronsem,您之前没有提到过这一部分:)我会仔细研究并尽可能更新我的答案!
Zuul 2012年

0

对于Ubuntu 13.10或更高版本

(不确定它是否在以前的版本中有效)

current_layout=gsettings get org.gnome.desktop.input-sources current | awk '{print $2}'
gsettings get org.gnome.desktop.input-sources sources | grep -Po "'[[:alpha:]]+'\)" | sed -ne "s/['|)]//g;$(($current_layout+1))p"

要查看更多选项:

gsettings list-recursively org.gnome.desktop.input-sources
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.