切换setxkbmap的脚本


8

我想要一个bash脚本,它可以在setxkbmap se和之间切换 setxkbmap us

然后,我的意图是CtrlEsc通过键盘>自定义快捷方式将该脚本映射到。

关键是我想用切换键盘布局CtrlEscape。我该如何实施?


1
您使用什么DE?
雏菊2012年

3
XKB可以设置一个在布局之间切换的键。这不是您想要编写的东西,但是可能需要预先配置好的配置,您只需要选择哪对布局和哪种键组合就可以了。
吉尔(Gilles)“所以,别再邪恶了”

Answers:


3

我不知道您正在运行什么桌面环境,如何分配快捷键可能会有所不同,但是该脚本至少在我Ubuntu 12.04 box和上可以全局运行Arch Linux

#!/bin/bash

(setxkbmap -query | grep -q "layout:\s\+us") && setxkbmap se || setxkbmap us

不幸的是,如果您使用gui方法更改布局,则此方法不起作用。至少,它不在我的xfce盒子上。仅当您使用setxkbmap切换布局时,它才有效。我发现始终如一地工作的唯一方法就是解析xmodmap,如下所示。
terdon

@terdon它至少在我的Ubuntu 12.04机器上有效,您在系统上尝试过吗?
雏菊2012年

是的,请相信我,我花了很长时间来处理此类问题。我经常在3种键盘布局(us,fr,es)之间切换,以及在两种物理键盘之间进行切换,一种为美式布局,另一种为西班牙语。如果我在tint2面板上使用applet来更改键盘布局,则输出完全没有区别setxkbmap。如果我使用通过keyboard shortcutsLMDE上的GUI 设置的快捷方式来切换布局,也是如此。setxkbmap仅当我切换使用它时才会更改。
terdon

一站式解决方案,真是太整齐了。谢谢。
弗雷德里克(Fredrik)2012年

我最终要做的是将行保存到主目录中的.sh文件中。然后将./toggleLayout.sh映射到ctrl-esc
Fredrik

4

对类似问题有各种答案。但是,它们都不对我有效。

以下脚本在所有情况下均适用。当使用以下命令切换布局时,它当然可以在我的debian系统上运行setxkbmap

#!/bin/bash
seven=`xmodmap -pke | grep "keycode  16" | awk '{print \$5}'` 
## If this is the "us" layout
if [ $seven == "ampersand" ]; then
    setxkbmap se
else
  setxkbmap us
fi

该脚本解析xmodmap的输出,以查看当前布局是“ us”还是“ se”。在“我们”布局中,SHIFT+ 7映射到“与”符号。如果仅在“ us”和“ se”布局之间切换,则启用“&” 7表示您正在使用“ us”布局,脚本将更改为“ se”。如果您未打开“与”号7,则脚本将切换为“我们”。


4

最好的方法是不使用脚本,而是加载两层键盘(例如:)setxmodmap "us,se"并重新定义Ctrl- Esc以发送ISO_Next_Group

在xkb上查看此答案,以了解如何在不编辑主要默认文件的情况下重新定义某些键(因此,无需是root)。在本地符号文件(例如:)中,~/.xkb/symbols/mysymbols将一小部分作为:

partial modifier_keys 
xkb_symbols "ctrl_esc_toggle" {
    key <ESC> {
        type[Group1]="PC_CONTROL_LEVEL2",
        symbols[Group1]= [ Escape,     ISO_Next_Group ]
    };
};

PC_CONTROL_LEVEL2告知该键的第二个符号是通过Control(而不是Shift)获得的。

并在本地键盘映射文件(例如:~/.xkb/keymap/mykbd;您可以使用创建setxkbmap "us,se" ; setxkbmap -print > ~/.xkb/keymap/mykbd)中,更改xkb_symbols行以添加“ mysymbols(ctr_esc_toggle)”,这样您将获得一些类似的东西:

xkb_symbols   { include "pc+us+se:2+inet(evdev)+terminate(ctrl_alt_bksp)+compose(rwin)+mysymbols(ctr_esc_toggle)"   };

(请注意“ se:2”,“:2”指示将“ se”符号定义作为Group2加载;您可以堆叠各种组)。

您现在可以使用以下命令加载它:xkbcomp -I$HOME/.xkb ~/.xkb/keymap/mykbd $DISPLAY 然后Ctrl-Esc将在“我们”和“ se”布局之间切换。

注意,但是您需要在Esc之前按Ctrl(并按住);另一种方法是行不通的(这需要为Escape定义一个虚拟修饰符,我不知道该怎么做)


1
leftwin+leftalt+space看起来如何?
Hotschke 2015年

@Hotschke,谢谢{ include "pc+us+ru:2+inet(evdev)+group(win_space_toggle)" };
contributorpw
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.