解决 Linux、Electron 应用程序中使用 alt+shift 进行切换的问题

你好,同事们!

我想分享我对标题中指出的问题的解决方案。 写这篇文章的灵感来自于一位同事 布尔诺夫克,他并不懒惰,并为问题提供了部分(对我来说)解决方案。 我自己做了“拐杖”,这对我很有帮助。 我正在与你分享。

问题描述

我在工作中使用 Ubuntu 18.04,最近注意到,在 Visual Studio Code、Skype、Slack 等使用 Electron 创建的应用程序中使用 alt+shift 切换布局时,会出现以下问题:输入字段的焦点移至顶部窗口面板(菜单)。 由于其他原因,我转向了 Fedora + KDE,并意识到问题并没有消失。 在寻找解决方案时,我发现了一篇很棒的文章 如何自行修复 Skype。 非常感谢同志 布尔诺夫克,他详细讲述了这个问题并分享了他的解决方法。 但文章中提到的方法只用一个应用程序解决了这个问题,即Skype。 对我来说,了解 Visual Studio Code 也很重要,因为用跳转菜单编写消息虽然很烦人,但如果您参与开发,那就没什么大不了的了。 另外,一位同事提出了一个解决方案,其中应用程序菜单完全消失,我真的不想在 VS Code 中丢失菜单。

试图了解出了什么问题

因此,我决定花点时间弄清楚到底发生了什么事。 现在我简单描述一下我所走的路,也许这方面更了解的人可以帮助解释我遇到的困难。

我打开 Visual Studio Code 并开始按不同的 Alt+<%something%> 组合来查看应用程序的响应情况。 在几乎所有情况下,除 Alt+Shift 之外的所有组合都可以正常工作而不会失去焦点。 似乎有人正在吃按下的 Shift,然后按住 Alt,应用程序认为我按下了 Alt,然后没有按任何东西,释放了 Alt,它很高兴地将我的注意力转移到它的菜单中,这似乎很合乎逻辑它。

我打开了用于切换键盘布局的设置(您知道,这个长长的列表包含复选框和各种按键设置),并将其设置为使用 Alt 按钮切换布局,无需任何额外的单击。

解决 Linux、Electron 应用程序中使用 alt+shift 进行切换的问题

此后,切换窗口的 Alt+Tab 不再起作用。 只有Tab起作用了,就是有人又“吃了”我的Alt。 毫无疑问这个“某人”是谁,但我不知道可以对他做什么。

但既然问题必须以某种方式解决,那么我想到了一个解决方案:

  1. 在设置中,禁用切换键盘布局的热键(取消选中“切换到另一个布局”部分中的所有复选框);
  2. 创建您自己的热键来为我切换布局

解决方案描述

首先,让我们安装一个程序,允许您将命令分配给 Xbindkeys 键。 不幸的是,标准工具不允许我通过漂亮的界面创建像 Alt+Shift 这样的组合热键。 可以用于 Alt+S、Alt+1、Alt+shift+Y 等。 等等,但这不适合我们的任务。

sudo dnf install xbindkeysrc

有关它的更多详细信息,请访问 维基百科
接下来,我们将为该程序创建一个示例设置文件。 该示例非常短,只有几个命令,正是您了解如何使用它所需要的:

xbindkeys -d > ~/.xbindkeysrc

正如您从文件中的示例中看到的,我们需要指出要使用的热键和应执行的命令。 看起来很简单。


# Examples of commands:
"xbindkeys_show"
  control+shift + q
# set directly keycode (here control + f with my keyboard)
"xterm"
  c:41 + m:0x4

作为热键,您可以使用人类可读的文字或使用键代码。 它只对我有用,但没有人禁止你尝试一下。

要获取代码,您需要使用以下命令:

xbindkeys -k

将打开一个小“X”窗口。 当焦点位于该窗口时,您只需按键即可! 只有在这种情况下,您才会在终端中看到类似的内容:


[podkmax@localhost ~]$ xbindkeys -k
Press combination of keys or/and click under the window.
You can use one of the two lines after "NoCommand"
in $HOME/.xbindkeysrc to bind a key.
"(Scheme function)"
    m:0x4 + c:39
    Control + s

就我而言,Alt+Shift 组合键如下所示:

m:0x8 + c:50

现在我们需要确保当您单击此组合时,布局会切换。 我发现只有一个有效命令来指定布局:


setxkbmap ru
setxkbmap us

正如您从示例中看到的,它只能启用一种或另一种布局,因此除了编写脚本之外我没有想到任何事情。


vim ~/layout.sh
#!/bin/bash
LAYOUT=$(setxkbmap -print | awk -F + '/xkb_symbols/ {print $2}')
if [ "$LAYOUT" == "ru" ]
        then `/usr/bin/setxkbmap us`
        else `/usr/bin/setxkbmap ru`
fi

现在,如果 .xbindkeysrc 和 layout.sh 文件位于同一目录中,则 .xbindkeysrc 文件的最终视图如下所示:


# Examples of commands:

"xbindkeys_show"
  control+shift + q

# set directly keycode (here control + f with my keyboard)
"xterm"
  c:41 + m:0x4

# specify a mouse button
"xterm"
  control + b:2
#А вот то, что добавил я
"./layout.sh"
  m:0x8 + c:50

之后我们应用更改:


xbindkeys -p

你可以检查一下。 不要忘记在标准设置中禁用任何用于切换布局的选项。

同事们,我希望这篇文章可以帮助某人快速摆脱恼人的问题。 就我个人而言,我花了一整天的时间试图以某种方式找出并解决问题,这样我在工作时间就不会再被它分散注意力。 我写这篇文章是为了节省某人的时间和精力。 你们中的许多人使用另一种切换布局的方法,但不明白问题是什么。 我个人喜欢用Alt+Shift切换。 这就是我希望它发挥作用的方式。 如果您同意我的观点并面临这个问题,这篇文章应该对您有所帮助。

来源: habr.com

添加评论