V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fanhed
V2EX  ›  macOS

macOS 的窗口管理逻辑能不能修改? 例如关闭当前 app 的窗口后, 我要切换到另一个 app

  •  
  •   fanhed · 321 天前 · 1757 次点击
    这是一个创建于 321 天前的主题,其中的信息可能已经有所发展或是发生改变。

    macOS 傻逼的窗口管理就不细说了. 单独说一个 case 吧, 我经常遇到, 真的很恼火

    1. 在 Finder 中, 在当前目录临时打开一个 iTerm, 用命令行处理完一些业务
    2. 关闭这个 iterm 窗口
    3. 期望切换到我正在用的 Finder 窗口, 但是并没有, macOS 会切换到我其他正在开启的 iterm 窗口

    第 3 点请问有没有办法实现我期望的逻辑? 这个问题真的很恼火, 我经常浪费大量时间处理这种 case

    第 1 条附言  ·  319 天前

    我用hammerspoon实现了一个替代方案, 用cmd-w关闭窗口的时候, 可以切换到前一个窗口

    hs.hotkey.bind({"cmd"}, "w", function()
      local win = hs.window.focusedWindow()
      local prevWin = hs.window.orderedWindows()[2]
      --win:close() -- NOTE: another window of this app will popup
    
      if prevWin ~= nil then
        prevWin:focus()
      end
      win:close()
    end)
    

    流程是先切换到上一个窗口, 然后关闭需要关闭的那个窗口, UI表现上有差距, 但是最终目的是一样的了. 主要是如果先关闭当前窗口的话, 就会弹出当前窗口的app的其他窗口, 所以只能先切换再关闭. 暂时只能做到这样.

    第 2 条附言  ·  319 天前

    上一个实现的 hs.window.orderedWindows()[2] 经常会卡, 问题很大, 这里的实现解决这个问题

    local wf = hs.window.filter.new()
    local previousWindow = nil
    local focusedWindow = nil
    wf:subscribe(hs.window.filter.windowFocused, function(win)
      -- 将当前窗口保存为上一个窗口
      previousWindow = focusedWindow
      focusedWindow = win
    end)
    
    -- 初步实现关闭窗口的时候, 切换到上一个窗口
    hs.hotkey.bind({"cmd"}, "w", function()
      local win = hs.window.focusedWindow()
      local prevWin = previousWindow
      --local prevWin = hs.window.orderedWindows()[2]
      --win:close() -- NOTE: another window of this app will popup
    
      if prevWin ~= nil and win:application() ~= prevWin:application() then
        prevWin:focus()
      end
      win:close()
    end)
    

    这个实现在cmd-w的时候, 几乎无缝地切换app并关闭窗口了, 只是这个前一个窗口可能会不可用. 更完善的实现就是用一个列表保存前一个窗口, 要用的时候遍历寻找第一个有效的前一个窗口

    28 条回复    2023-11-16 14:47:03 +08:00
    GuryYu
        1
    GuryYu  
       321 天前
    可以使用 AltTab 替换掉系统默认的切换
    wsjjacky
        2
    wsjjacky  
       321 天前
    如果你愿意尝试 bettertouchtool 的话,这个问题很好解决。将 Command+W 定义为「关闭窗口」+「打开 Finder 」即可。BTT 可以讲任意一个快捷键组合定义为几乎任意动作,只要系统支持就可以。
    Koma
        3
    Koma  
       321 天前   ❤️ 2
    如果关闭当前窗口就切到其他应用,经常做 CMD+W 然后 CMD+N 操作的会疯掉
    Goalonez
        4
    Goalonez  
       321 天前
    我现在一般把常用的软件都用 raycast 设置一个快捷键,可以实现类似 cmd+H 的效果,直接唤起或者隐藏对应窗口.
    FozillaMox
        5
    FozillaMox  
       321 天前 via iPhone
    不能。

    macOS 的窗口管理确实拉胯。
    minami
        6
    minami  
       321 天前   ❤️ 1
    之前用过一年多时间的 macOS ,总体感觉是它就没有窗口管理,它实际上就是应用管理,切到哪个应用就把哪个应用的窗口都拉出来,设计如此,要么忍要么滚了。也许可以试试 ubar ,把 dock 整体换了可以破。有些果粉就别来强调有多么好用了,真的是问就是好用,再问就是推荐一堆效率工具,太真实了
    fanhed
        7
    fanhed  
    OP
       321 天前
    看来这个窗口管理还是一如既往地傻逼
    fanhed
        8
    fanhed  
    OP
       321 天前
    @Koma 其实逻辑应该是, 关掉当前窗口就回到之前的窗口, 我例子只是为了简单描述 case. 反正 Windows 的窗口管理更符合直觉, macOS 的窗口管理就是答辩.
    fanhed
        9
    fanhed  
    OP
       321 天前
    @wsjjacky 这个思路看起来可以, 我不用 bettertouchtool, 但是我用 hammerspoon, 看起来可以把 cmd+w 定义为关闭当前窗口并切换到之前的一个窗口, 我看下能否实现
    wsjjacky
        10
    wsjjacky  
       321 天前
    @fanhed BTT 我可以吹一辈子哈哈哈!感觉苹果应该把 BTT 收编作为系统自带软件之一,真的太好用了。
    wsjjacky
        11
    wsjjacky  
       321 天前
    @fanhed BTT 可以设置某个快捷键仅对某个特定 APP 生效,因此当你设置完之后,在别的 app 中 command+w 就仅仅是关闭当前窗口,不会自动切换到 Finder 窗口(当然如果你愿意的话也可以设置为 universal 快捷键,对所有 app 都适用)。
    FozillaMox
        12
    FozillaMox  
       321 天前
    @fanhed 「其实逻辑应该是……」这就是你的不对了。用苹果产品就要做好改变使用习惯的觉悟。😁
    justaname
        13
    justaname  
       320 天前
    @Koma 符合直觉的方式应该是关闭当前窗口就退回上一个激活的窗口,而不是打开几百年前用过的上一个同应用窗口
    seanzxx
        14
    seanzxx  
       320 天前
    @fanhed 你是在用 Windows 的操作逻辑来操作 macOS ,但其实背后的原理并不一样。
    Windows 切换的是窗口,macOS 切换的是应用。
    Windows 很多时候关掉窗口,应用就关闭了,但 macOS 关掉窗口,应用依然在运行,哪怕一个窗口都没有,这个应用依旧处于前台活跃状态,顶部的菜单栏依旧是属于当前活跃的应用,所以你关掉了一个应用的窗口,这个应用前一个活跃的窗口就跳出来了,因为你一直都在这个应用中。

    你想当前窗口消失回到之前的应用窗口,要么可以 Cmd + Q 退出当前应用,要么可以 Cmd + H 隐藏当前应用,上一个应用的窗口就变活跃了。
    eggsblue
        15
    eggsblue  
       320 天前
    看起来 Wins 可以增加这个功能,提供两个选项:
    1. 关闭窗口时,聚焦到上一个窗口中
    2. 关闭窗口时,如果应用没有可用其他窗口,是否关闭程序
    GabrielleBellamy
        16
    GabrielleBellamy  
       320 天前
    四指下滑可以看到正在打开的窗口,进行同一软件内的窗口管理。这个需要在设置里打开。macOS 不是没有窗口管理,只是做得确实不够好。另外我觉得它做得不好的地方在于它不够开放,使第三方也很难弥补这些缺陷,只能勉强凑合。
    Koma
        17
    Koma  
       320 天前
    @justaname 这又涉及到 mac 下大多 app 关闭窗口不是关闭程序的逻辑了,在这个环境下,我不认为“回到上一个同应用窗口”就是符合直觉的。
    DylanMorane
        18
    DylanMorane  
       320 天前
    win 大多时候关闭窗口就是退出程序,mac 必须按 CMD+Q 才算彻底退出程序 关闭窗口并不等于退出程序,下面这两个快捷键可以帮助你解决这个问题:
    1 、Command-H:隐藏最前面的 App 的窗口。要查看最前面的 App 但隐藏所有其他 App ,请按 Option-Command-H 。
    2 、Command-M:将最前面的窗口最小化至“程序坞”。要最小化最前面的 App 的所有窗口,请按 Option-Command-M 。
    DylanMorane
        19
    DylanMorane  
       320 天前
    @DylanMorane 补充一点 如果你开启了台前调度 CMD+Q 关闭掉程序后之前应用的窗口就会自动出现
    fanhed
        20
    fanhed  
    OP
       319 天前
    @Koma 关闭窗口不关闭 app 不就是 Windows 的自带托盘标记的应用而已, 这种在 Windows 下面也是关闭窗口后就切换到之前的窗口了
    fanhed
        21
    fanhed  
    OP
       319 天前
    @DylanMorane 这个逻辑的答辩之处是, 一般多任务场景下, 人直觉上的管理单元是窗口(不关心这个 app 开了多少个窗口), 而 macOS 的窗口管理单元在窗口之上还强加一个 app
    Koma
        22
    Koma  
       319 天前
    @fanhed 并不一样,类似 mac 上也有驻留菜单栏的 App ,这种关闭窗口就是退回前一个应用。这一类几乎全都是这样,Surge 、BTT 、istat menu 都是。
    tbv
        23
    tbv  
       316 天前
    典型的个人需求 > 通用需求,我不满意就否定一切…
    fanhed
        24
    fanhed  
    OP
       314 天前
    @tokeytush 你是真的搞笑, 是否否定一切懒得讨论, 个人需求本身就是 > 通用需求的, 不然各种配置软件是用来干什么的?! karabiner-elements, hanmmerspoon, betertouchtool, moom, 诸如此类
    tbv
        25
    tbv  
       314 天前
    @fanhed 通用需求是基础,你的个人需求不代表全部好吧,希望苹果能为你修改,这样你就不会骂他 sha bi 了
    ambition117
        26
    ambition117  
       241 天前
    笑死,搜了一圈,果粉自适应不是说说而已
    fanhed
        27
    fanhed  
    OP
       216 天前
    @ambition117 搞 jb 笑, 换不换只是权衡利弊而已, 换 windows 一样会遇到各种问题
    ambition117
        28
    ambition117  
       216 天前 via iPhone
    @fanhed 不是说你。这下边不少人回复都很典。

    最后我装了 alt tab 解决这傻逼窗口管理
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1009 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 21:32 · PVG 05:32 · LAX 14:32 · JFK 17:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.