首页 > 解决方案 > 在 Debian 上按 Ctrl+Shift+[1,2,3,4] 切换到所需的键盘布局?

问题描述

简而言之。
我使用Debian、xfce4,我需要使用多个键盘布局(准确地说,我有 4 个)。我希望能够快速切换到我需要的那个,而无需多次按 Alt+Shift(或其他任何东西)。

我需要什么。
只需按 Ctrl+Shift+ [layout number]即可切换到所需的布局。所以,在我的情况下,它会是这样的:

Ctrl+Shift+1- 切换到俄语
Ctrl+Shift+2- 切换到英语
Ctrl+Shift+3- 切换到德语
Ctrl+Shift+4- 切换到法语

一点注意事项:我不想多次按下某些组合键来获得我需要的布局(有时这是一种麻烦,你知道),-所以问题不在于那个-我可以做这个设置我。关键是只需按一次其组合键即可获得所需的布局。

我已经尝试过了。
首先,我安装了xfce4-xkb-plugin,可以在面板上获得一个语言图标,但是它并没有让我为所有布局单独设置快捷方式。无论如何,如果重要的话,现在它的设置Manage layout设置为。 我尝试命令切换到俄语,但我得到的是一个完全损坏的布局切换器, - 我什至无法切换回英语。以前,我尝试过其他一些方法,几乎​​就像这个(不记得确切的命令), - 布局并没有完全破坏,只有系统快捷方式被破坏了。所以我正在寻找一种干净的方法来做到这一点,没有任何缺点。有没有?per application
setxkbmap ru

我将不胜感激。


UPD。

我试过以下。

 setxkbmap -rules evdev -model pc104 -layout ru,us,de,fr -variant ,,nodeadkeys,nodeadkeys -option grp:lalt_lshift_toggle -option grp_led:scroll

一般来说,它似乎工作正常,但一些键盘快捷键仍然会丢失(如上所述)。原因可能是相同的字符在不同的布局中绑定到不同的键,而对于俄语,它使用西里尔字母,所以我的自定义快捷键在俄语布局中根本不起作用。到目前为止找不到解决方法。

标签: linuxkeyboarddebianxfce

解决方案


以防万一将来有人遇到同样的问题,我正在回答我自己的问题。虽然它并不完美。我的解决方案是鸭带。好吧,至少它是一些东西。我最终得到了以下 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 repo 中(至少目前如此),而且我无法自己检查,我是否可以信任它。所以,我决定不冒险安装我既无法理解也无法验证的东西。


推荐阅读