切换 setxkbmap 的脚本

Fre*_*rik 11 x11 shell-script xkb keyboard-layout

我想要一个 bash 脚本,它可以在: setxkbmap sesetxkbmap us.

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

关键是我想用CtrlEscape. 我该如何实施?

dai*_*isy 6

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

#!/bin/bash

(setxkbmap -query | grep -q "layout:\s\+us") && setxkbmap se || setxkbmap us
Run Code Online (Sandbox Code Playgroud)


Pab*_*aga 5

最好的方法是不使用脚本,而是加载一个两层键盘(例如:)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 ]
    };
};
Run Code Online (Sandbox Code Playgroud)

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)"   };
Run Code Online (Sandbox Code Playgroud)

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

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

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