Linux上的替代窗口管理

我是采用Caps Lock切换布局的人之一,因为我懒于在可以按2个键时按2个键。 我什至想要2个不必要的键:我会用一个打开英语版式,第二个用俄语。 但是第二个不必要的键是调用上下文菜单,这是不必要的,以至于许多笔记本电脑制造商都将其删除。 因此,您必须对自己拥有的东西感到满意。


而且,当我切换窗口时,我不想在任务栏上查找它们的图标,也不需要在滚动Alt + Tab时浏览名称,在桌面中滚动等。我想按一个组合键(理想情况下,是一个,但是没有免费的不必要的键) ),然后立即进入我需要的窗口。 例如,像这样:


  • Alt + F:Firefox
  • Alt + D:Firefox(私人浏览)
  • Alt + T:终端
  • Alt + M:计算器
  • Alt + E:IntelliJ创意

此外,通过按例如Alt + M,无论该程序当前是否正在运行我都希望看到计算器。 如果正在运行,则需要为其窗口指定焦点,否则,请启动所需程序并在加载时转移焦点。


对于以前方案未涵盖的情况,我想拥有通用的键盘快捷键,您可以轻松地为它们分配任何打开的窗口。 例如,我有10个从Alt +1分配到Alt + 0的组合,这些组合没有与任何程序绑定。 我可以按Alt + 1,而当按下Alt + 1时 ,当前处于焦点的窗口将获得焦点。


在剪切下,描述了几个其他功能以及如何执行此操作的答案。 但是,我会立即警告您,“为您自己”进行这样的自定义设置可能会导致沉迷,甚至在必要时中断使用Windows,Mac OS或什至是其他人的Linux计算机。


实际上,如果您考虑一下,那么我们每天不会使用很多程序。 浏览器,终端,IDE,某种通讯工具,文件管理器,计算器,也许几乎就是这些。 不需要很多按键组合即可覆盖95%的日常任务。


对于具有多个打开的窗口的程序,可以将其中之一指定为主窗口。 例如,打开了几个IntelliJ Idea窗口,并将它们分配给Alt +E。 在正常情况下,按Alt + E将打开该程序的某些窗口,很可能是最先打开的窗口。 但是,如果在此程序的一个窗口已处于焦点状态时按Alt + E ,则此窗口将被指定为主窗口,并且在随后按下组合键时会将焦点转移到该窗口。


可以重新分配主窗口。 为此,您首先需要重置组合,然后为其分配另一个窗口作为主窗口。 要重置组合,您需要先按组合本身,然后按特殊的重置组合,我已将其分配给Alt + Backspace 。 这将调用一个脚本,该脚本将取消为先前的组合分配主窗口。 然后,您可以按照上一段所述分配一个新的主窗口。 将绑定的窗口重置为通用组合是相似的。


简介很长,但我想先说一下我们将要做什么,然后再解释如何做。


对于那些厌倦阅读的人


简而言之,本文结尾处的脚本链接。


但都是一样,它将无法正常工作并立即安装和使用。 首先,您必须弄清楚脚本如何找到正确的窗口。 没有这个,就无法告诉脚本确切的焦点。 而且,您需要了解如果突然找不到合适的窗口该怎么办。


而且,我不会重点介绍如何通过按组合键来配置脚本执行。 例如,在KDE中,它位于系统设置→快捷方式→自定义快捷方式中。 在其他窗口管理器中,也应该如此。


介绍wmctrl


Wmctrl是用于与X Window Manager进行交互的控制台实用程序。 这是一个关键脚本程序。 让我们快速看一下如何使用它。


首先,列出打开的窗口:


$ wmctrl -lx 0x01e0000e -1 plasmashell.plasmashell N/A Desktop — Plasma 0x01e0001e -1 plasmashell.plasmashell N/A Plasma 0x03a00001 0 skype.Skype N/A Skype 0x04400003 0 Navigator.Firefox N/A Google  - Mozilla Firefox 0x04400218 0 Navigator.Firefox N/A     /  - Mozilla Firefox (Private Browsing) ... 

-l选项显示所有打开的窗口的列表, -x将类名称( skype.SkypeNavigator.Firefox等)添加到输出中。 我们将需要窗口ID(第1列),类名(第3列)和窗口名(最后一列)。


您可以尝试使用-a选项激活某些窗口:


 $ wmctrl -a skype.Skype -x 

如果一切按计划进行,则Skype窗口应出现在屏幕上。 如果使用-i选项而不是-x选项,则可以指定窗口ID而不是类名。 使用id的问题是,每次应用程序启动时,窗口id都会更改,而我们无法提前知道它。 另一方面,此属性唯一地指示一个窗口,当应用程序打开多个窗口时,这可能很重要。 关于此进一步。


在这一阶段,我们需要记住,我们将根据wmctrl -lx的输出使用regex搜索所需的窗口。 但这并不意味着我们必须使用复杂的东西。 通常,一个类名或窗口名就足够了。


原则上,基本思想应该已经明确。 在窗口管理器的全局热键/快捷方式设置中,我们配置所需的组合以执行脚本。


如何使用脚本


首先,您需要安装控制台实用程序wmctrlxdotool


 $ sudo apt-get install wmctrl xdotool 

接下来,您需要下载脚本并将其添加到$ PATH中 。 我通常把它们放在〜/ bin中


 $ cd ~/bin $ git clone https://github.com/masyamandev/Showwin-script.git $ ln -s ./Showwin-script/showwin showwin $ ln -s ./Showwin-script/showwinDetach showwinDetach 

如果没有〜/ bin目录 ,则必须创建该目录并重新启动(或登录),否则〜/ bin将不会进入$ PATH 。 如果一切都正确完成,则应该可以从控制台访问脚本,并且Tab键完成应该可以工作。


主要的showwin脚本有2个参数:第一个是regex,通过它我们将搜索所需的窗口,第二个参数是如果找不到所需的窗口必须执行的命令。


您可以尝试执行脚本,例如:


 $ showwin "Mozilla Firefox$" firefox 

如果安装了Firefox,则应将焦点放在其窗口上。 即使Firefox没有运行,它也应该已经启动。


如果结果是这样,那么您可以尝试将命令的执行配置为组合。 在全局热键/快捷方式设置中,添加:


  • Alt + F:showwin“ Mozilla Firefox $” firefox
  • Alt + D:showwin“ Mozilla Firefox(私有浏览)$”“ firefox -private-window”
  • Alt + C:showwin“铬浏览器。铬浏览器N *”铬浏览器
  • Alt + X:showwin“铬浏览器。铬浏览器I *”“铬浏览器-隐身”
  • Alt + S:showwin“ skype.Skype” skypeforlinux
  • Alt + E:showwin“ jetbrains-idea” idea.sh

等等,每个人都可以根据自己的需要配置密钥和软件的组合。
如果一切正常,则根据上述组合,我们可以通过简单的按键在窗口之间切换。


我会让Chrome爱好者感到失望:将普通窗口与wmctrl输出区分开来是隐身的,它们具有相同的类名和窗口标题。 在建议的正则表达式中,仅需要字符N *和I *,以便这些正则彼此不同,并且可以为它们指定不同的窗口作为主要窗口。


要重置先前组合的主窗口(实际上是正则表达式,它是最后一次调用showwin的主窗口),您需要调用showwinDetach脚本。 我已将此脚本分配给Alt + Backspace组合键。


showwin脚本还有另一个功能。 当用一个参数调用它时(在这种情况下,该参数只是一个标识符),它根本不检查正则表达式,并认为所有窗口都适用。 就其本身而言,这似乎毫无用处,但是通过这种方式,我们可以将任何窗口指定为主窗口,然后快速切换到该特定窗口。


我已经配置了这样的组合:


  • Alt + 1:showwin“ CustomKey1”
  • Alt + 2:showwin“ CustomKey2”
  • ...
  • Alt + 0:showwin“ CustomKey0”
  • Alt +退格键:showwinDetach

这样,我可以将任何窗口绑定到Alt + 1 ... Alt + 0组合。 只需按Alt + 1 ,即可将当前窗口绑定到此组合。 我可以先按Alt + 1 ,再按Alt + Backspace解除绑定。 或关闭窗口,这也可以。


此外,我将讲一些技术细节。 您无法阅读它们,而只是尝试进行配置和查看。 但是我仍然建议您先了解其他人的脚本,然后再在您的计算机上运行它们:)。


如何区分一个应用程序的不同窗口


原则上,“ wmctrl -a skype.Skype -x”的第一个示例正在运行并且可以使用。 但是,让我们再次看一下Firefox的示例,其中打开了2个窗口:


 0x04400003 0 Navigator.Firefox N/A Google  - Mozilla Firefox 0x04400218 0 Navigator.Firefox N/A     /  - Mozilla Firefox (Private Browsing) 

第一个窗口是普通模式,第二个窗口是“私人浏览”。 我想将这些窗口视为不同的应用程序,并使用不同的组合键切换到它们。


您需要使切换窗口的脚本复杂化。 我使用了这个解决方案:显示所有窗口的列表,使用正则表达式制作grep ,使用head提取第一行,使用cut获取第一列(这将是窗口ID),然后通过ID切换到窗口。


关于正则表达式和两个问题应该开个玩笑,但实际上我不使用任何复杂的东西。 我需要常规字符,以便可以指示行尾(“ $”字符),并区分“ Mozilla Firefox $”和“ Mozilla Firefox(私人浏览)$”。


该命令如下所示:


 $ wmctrl -i -a `wmctrl -lx | grep -i "Mozilla Firefox$" | head -1 | cut -d" " -f1` 

在这里,您已经可以猜测脚本的第二个功能:如果grep没有返回任何内容,则所需的应用程序未打开,您需要通过从第二个参数执行命令来运行它。 然后定期检查右窗口是否已打开以使其聚焦。 我不会专注于此,需要它的人将查看源代码。


当无法区分应用程序窗口时


因此,我们已经学会了将焦点转移到所需应用程序的窗口。 但是,如果打开一个应用程序的多个窗口怎么办? 我应该关注哪一个? 上面的脚本很可能会传递到第一个打开的窗口。 但是,我们希望有更多的灵活性。 我希望能够记住我们需要哪个窗口并切换到该窗口。


想法是这样的:如果我们想记住某个按键组合的窗口,那么当所需的窗口聚焦时,我们需要按此组合。 随后,当按下此组合键时,将把焦点放在该特定窗口上。 直到窗口关闭或我们对此showwinDetach脚本组合进行重置。


showwin脚本算法如下所示:


  • 检查以查看我们之前是否记得焦点应该传递给的窗口的ID。
    如果您还记得这样的窗口仍然存在,那么我们将焦点转移到该窗口并退出。
  • 我们查看当前处于哪个窗口中,如果它适合我​​们的请求,那么我们将记住它的ID,以便日后转到该窗口并退出。
  • 如果存在的话,我们至少转到一些合适的窗口,或者打开所需的应用程序。

您可以使用控制台实用程序xdotool找出当前聚焦于哪个窗口,将其输出转换为十六进制格式:


 $ printf "0x%08x" `xdotool getwindowfocus` 

记住bash中的某些内容是在内存中的虚拟文件系统中创建文件的最简单方法。 在Ubuntu上,默认情况下在/ dev / shm /中将其连接。 关于其他发行版本,我无话可说,希望这一点也存在。 您可以看到以下命令:


 $ mount -l | grep tmpfs 

该脚本将在此文件夹中创建空目录,如下所示: / dev / shm / $ USER / showwin / $ SEARCH_REGEX / $ WINDOW_ID 。 此外,每次调用时,它将在/ dev / shm / $ USER / showwin / $ SEARCH_REGEX上创建符号链接/ dev / shm / $ USER / showwin / showwin_last 。 如果需要,可以使用showwinDetach脚本删除特定组合的窗口ID。


有什么可以改善的


首先,必须手动配置脚本。 当然,由于需要深入研究并进行大量操作,因此许多人甚至都不会尝试配置系统。 如果有可能只是简单地放置软件包和配置所有内容,那么也许它将获得一定的普及。 在那儿,看看标准分布,它们会使应用程序更加强大。


也许更容易做到。 如果窗口的ID允许您找到创建窗口的进程的ID,并找出哪个团队创建了该进程的ID,则可以使配置自动化。 实际上,我不明白我在本段中写的内容是否可行。 事实是,对我个人而言,它适合现在的工作方式。 但是,如果对于我以外的人来说,整个方法似乎很方便并且有人对其进行了改进,那么我将很乐意使用最佳解决方案。


正如我已经写过的,另一个问题是在某些情况下无法将窗口区分开。 到目前为止,我只在铬/铬隐身状态下看到过这种情况,但也许在其他地方也有类似情况。 在极端情况下,总会有通用组合Alt + 1 ... Alt + 0的变体。 同样,我使用Firefox,就我个人而言,此问题并不严重。


但是对我来说,一个重要的问题是我使用Mac OS进行工作,却无法在其中进行任何配置。 似乎能够提供wmctrl实用程序,但在Mac OS上却无法真正使用。 可以使用Automator应用程序完成某些操作,但是它太慢了,以至于即使工作正常也无法使用。 我也无法配置组合键,以便它们可以在所有程序中使用。 如果突然有人提出解决方案-我将很高兴使用它。


而不是结论


出乎意料的是,对于这种看似简单的功能而言,有很多单词。 我想传达这个想法,而不是使文字过多,但是我还没有弄清楚如何更容易地讲出来。 也许以视频格式会更好,但是他们不喜欢那样。


我谈到了脚本的底层内容以及如何对其进行配置。 我没有详细介绍脚本本身,但是只有50行,这并不难理解。


我希望其他人可以尝试这个想法,甚至可以欣赏它。 我可以为自己说脚本是大约3年前编写的,对我来说非常方便。 它非常方便,以致在与他人的计算机一起工作时会引起严重的不适。 并搭配可正常使用的Macbook。


脚本链接

Source: https://habr.com/ru/post/zh-CN483846/


All Articles