以防万一以后有人遇到同样的问题,我正在回答我自己的问题。虽然它并不完美。我的解决方案是鸭带。好吧,至少它是一些东西。我最终得到了以下 bash 脚本。
#!/bin/bash
cur_layout=`cat /opt/scripts/layout_switcher/layout_value`;
target_layout=$1;
echo $cur_layout;
echo $target_layout;
if (( $cur_layout < $target_layout )); then
switch_count=$(($target_layout-$cur_layout));
elif (( $cur_layout > $target_layout )); then
switch_count=$((4-$cur_layout+$target_layout));
else
switch_count=0;
fi;
echo $switch_count;
echo "$target_layout" > /opt/scripts/layout_switcher/layout_value
for (( c=1; c<=$switch_count; c++ ))
do
xdotool key Mode_switch
done;
解释我想做什么。我创建了 2 个文件:一个是上面的脚本,另一个是 /opt/scripts/layout_switcher/layout_value,如该脚本中所述,后者存储当前布局值。是的,我决定将布局值存储在一个文件中,并在登录系统时将其全部重置。所以有第三个文件可以重置它,这里是:
#!/bin/bash
echo "2" > /opt/scripts/layout_switcher/layout_value
setxkbmap -rules evdev -model pc104 -layout ru -variant ,nodeadkeys,nodeadkeys, -option grp:lalt_lshift_toggle -option grp_led:scroll
sleep 1
setxkbmap -rules evdev -model pc104 -layout us,de,fr,ru -variant ,nodeadkeys,nodeadkeys, -option grp:lalt_lshift_toggle -option grp_led:scroll
详细解释
我给每种语言一个序列号,它被用作语言标识符。
所以对于俄语我有1,对于英语2,对于德语3,对于法语4。并且这个值保存在/opt/scripts/layout_switcher/layout_value中。
在启动或登录时,默认值 2(即英语)会保存到该文件中,setxkbmap 会设置一个新的键盘映射,其中英语优先。但是,如果没有sleep,我无法让它工作,所以它是非常胶带。 :) 但仅针对出现问题的情况。
于是系统启动了。现在我使用第一个脚本并在按下键盘快捷键时调用它。我都是在标准键盘设置中设置的,没什么特别的。
因此,正如我在问题中所述,我将 Ctrl+Shift+[1,2,3,4] 绑定到主 bash 脚本(第一个)。而且,我有以下方案:
-
Ctrl+Shift+1 -
/bin/bash /opt/scripts/layout_switcher/layout_switcher.sh 1
-
Ctrl+Shift+2 -
/bin/bash /opt/scripts/layout_switcher/layout_switcher.sh 2
-
Ctrl+Shift+3 -
/bin/bash /opt/scripts/layout_switcher/layout_switcher.sh 3
-
Ctrl+Shift+4 -
/bin/bash /opt/scripts/layout_switcher/layout_switcher.sh 4
所以,基本上,它所做的就是调用那个 bash 脚本并传递一个参数,这个参数是布局序列号。脚本接受它并根据当前和目标布局序列号计算偏移量,即必须模拟语言切换的次数。 :) 就如此容易。我没有想出更聪明的办法。因此,如果我使用德语 (3),并且我想要英语 (2),它会计算 4-3+2=3,因此必须模拟语言切换 3 次(如果我的布局优先级英语正好在德语之前)。目标布局编号保存在文件中。
一切都好,但这不适用于Alt+Shift 切换,当前值不会更新。但对我来说这是可以接受的,因为我根本不会使用Alt+Shift。为了防止出现任何问题并且我不小心按了Alt+Shift,我将另一个快捷方式绑定到重置脚本。
Ctrl+Shift+0 - /bin/bash /opt/startup_scripts/layout_reset.sh
如果我的语言与鸭子磁带不同步,它会强制重置为英语。
还有一件事我需要忍受:为了让这一切正常工作,我必须切换到全局语言模式(从应用程序模式)。因此,如果我在一个应用程序中使用英语,我将在其他任何地方使用它,直到我切换到其他应用程序。每个应用程序或窗口没有单独的语言。
而且,如您所见,我使用 xdotool 来模拟(即触发)布局切换。因此,如果您还没有安装它,还有一个要安装的软件包。
所以,这是一个鸭式磁带解决方案,但我又不是系统管理员,我只有基本的了解。也许你知道更好的方法,那么请告诉我。
PS: 是的,我也阅读了有关 xkb-switch 解决方案的信息,但它不在 Debian 存储库中(至少目前如此),我无法自己检查,无论我是否可以相信与否。所以,我决定不冒险安装我既无法理解也无法验证的东西。