切换 setxkbmap 的脚本

切换 setxkbmap 的脚本

我想要一个在: setxkbmap se和之间切换的bash 脚本setxkbmap us

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

重点是我想用 切换键盘布局CtrlEscape。我怎样才能实现它?

答案1

我不知道您正在运行什么桌面环境,如何分配快捷键可能会有所不同,但此脚本在全球范围内有效,至少在我的Ubuntu 12.04 boxArch Linux

#!/bin/bash

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

答案2

最好的方法是不使用脚本,而是加载两层键盘(例如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 将在“us”和“se”布局之间切换。

但请注意,您需要在 Esc 之前按 Ctrl(并按住);另一种方式不起作用(它需要为 Escape 定义一个虚拟修饰符,我不知道该怎么做)

答案3

类似的问题有多种答案问题。然而,它们都不适合我。

以下脚本应该适用于所有情况。当使用以下命令切换布局时,它肯定适用于我的 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”。在“us”布局中,SHIFT+7映射到“&”。如果您仅在“us”和“se”布局之间切换,则打开“&”意味着7您正在使用“us”布局,并且脚本将更改为“se”。如果您没有打开“&” 7,脚本将切换为“us”。

答案4

如果您想在同一语言的变体之间切换,例如在 us lang 和带有变体 intl 的 us lang 之间切换:

#!/bin/bash

setxkbmap -query | grep -q 'variant:\s\+intl') && setxkbmap -layout us || setxkbmap -layout us -variant intl

相关内容