令人惊叹:alt+tab只能在两个应用程序之间切换。

17

我刚刚将awesome作为窗口管理器安装了。当我使用awesome进行alt+tab切换时,它只能切换两个应用程序,无法激活其他应用程序...有什么想法吗?


按住Alt键,多次按Tab键。 - Daniel
@Daniel 谢谢,但它只能在两个应用程序之间切换。 - tirenweb
7个回答

22

默认情况下,客户端将焦点设置为先前具有焦点的窗口。当您使用alt+tab切换窗口时,先前的窗口现在变成了原始窗口。因此,它在两个窗口之间循环。

要解决这个问题,您需要更改以下内容:

在默认的rc.lua文件中,控制窗口循环的部分如下所示:

    awful.key({ modkey,           }, "Tab",
        function ()
            awful.client.focus.history.previous()
            if client.focus then
                client.focus:raise()
            end
        end),

要循环遍历所有窗口,而不仅仅是前一个,请将上述代码更改为以下内容:

awful.key({ modkey,           }, "Tab",
    function ()
        -- awful.client.focus.history.previous()
        awful.client.focus.byidx(-1)
        if client.focus then
            client.focus:raise()
        end
    end),

awful.key({ modkey, "Shift"   }, "Tab",
    function ()
        -- awful.client.focus.history.previous()
        awful.client.focus.byidx(1)
        if client.focus then
            client.focus:raise()
        end
    end),

当你按下Alt+Tab时,它会循环浏览窗口,当你按下Alt+Shift+Tab时会反向循环浏览。(以--开头的两行是注释,所以不会影响结果。)

要循环浏览标签上的每个客户端,甚至是最小化的客户端,你可能会发现这个函数很有用:

awful.key({ modkey,           }, "Tab",
    function ()
        for c in awful.client.iterate(function (x) return true end) do
            client.focus = c
            client.focus:raise()
        end
    end),

注意,这些解决方案都不考虑历史记录,而是会切换到最近没有焦点的窗口(即不考虑窗口获取焦点的顺序)。


3
这绝对有效。您可能需要重新启动awesome或运行kill -s SIGHUP $(which awesome)使其生效。 - user67416
我刚开始使用awesome。非常感谢你的配置提示,非常有用! - Ciges
4
第一种解决方案与 modkey+jmodkey+k 的默认设置完全相同。 - blueyed

8
我已经为此创建了一个模块:https://github.com/blueyed/awesome-cyclefocus 它支持不同的Alt-Tab方法(请参见README),并可以通过过滤器轻松配置,这些过滤器在循环浏览窗口时会应用,例如仅筛选具有相同WM类别或在同一屏幕/标签中的窗口。

@ChristopherCorley 很好。我有很多本地未提交的修改,例如在骑行时使用on-top,并在非当前窗口上设置不透明度回调。如果您需要其他内容,请在Github问题中告诉我。 - blueyed
太棒了!在我看来,awesomewm中默认的Alt-Tab并不是很好,而这个模块解决了这个问题 :) - drgibbon

5

我已经使用Chris在解决方案中提供的设置做了类似的事情。然而,与其通过所有窗口转移焦点,它实际上是将它们在主从堆栈中循环。换句话说,它们都在屏幕上可见地旋转:

awful.key({ modkey, "Shift"   }, "Tab",
    function ()
        awful.client.cycle(false)
        awful.client.focus.byidx(0,awful.client.getmaster()) -- Added 2013-03-01
    end),

awful.key({ modkey,           }, "Tab",
    function ()
        awful.client.cycle(true)
        awful.client.focus.byidx(0,awful.client.getmaster()) -- Added 2013-03-01
    end),

我仍需要稍微调整一下,因为我想在整个循环操作过程中,焦点(至少看起来)保留在主窗口上。当我发现aweful.client.cycle时,我还在熟悉Awesome Lua API,它使这个过程变得非常容易。

我觉得我会介绍一下我的当前解决方案,因为这是我调查的第一个解决类似问题的资源之一。希望能有所帮助。


3

在默认绑定中,按下 Mod + Tab 键可在最近使用的两个应用程序之间循环切换。我希望能够使用 Mod + j 或 Mod + k(反向顺序)进行切换。


2
在大多数窗口管理器中,Alt + Tab 的好处在于它按照最近聚焦的顺序循环浏览窗口。另一方面,在 Awesome 中,Mod + j 按照预定顺序循环浏览窗口,对我来说不太实用。 - Jim Garrison
2
@JimGarrison 请看我的答案。我已经为此创建了一个模块:https://github.com/blueyed/awesome-cyclefocus - blueyed

1
有一个名为awesome-switcher-preview的库,它实现了类似于其他操作系统和窗口管理器上所期望的alt-tab行为。它按照最近聚焦的顺序循环窗口,并在屏幕上选择的标签集中循环所有客户端,包括最小化的客户端。它尝试不在做出选择之前更改历史记录。它不会大量改变堆栈。按住alt键可以保持预览/alt-tab切换器处于打开状态。
您可以在此处获取它: https://github.com/berlam/awesome-switcher-preview

0

我必须承认,我花了很长时间来设置正确的配置,以便获得我期望的行为:在所有标签上循环浏览所有窗口,包括(尤其是!)最小化的窗口,而不会使它们成为焦点并带有预览或通知。

  • 编辑 awesome 配置文件(如上所示):仅循环浏览未最小化的窗口。
  • awesome_alttab 已弃用
  • awesome-switcher 适用于 awesome 3.5
  • cycle-focus:终于!我只有在注释掉 第102行之后才使它正常工作,但不是通过在rc.lua中重写一个空的cycle_filters

awesome-cyclefocus/init.lua:

cycle_filters = {
  --function(c, source_c) return not c.minimized end,  --luacheck: no unused args
},

rc.lua

 cyclefocus.key({ "Mod1", }, "Tab", {
          show_clients = false,
          focus_clients = false,
 }),

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接