在Mac OS X上的焦点跟随鼠标(加自动提升)

235

(我不想听到关于我想要这个太疯狂的说法!:)

焦点跟随鼠标也被称为指向焦点、指针焦点,以及(在某些实现中)松散焦点。[添加其他术语以使其更易搜索!] X-mouse。


42
我希望我能对此设定一个有条件的悬赏。我愿意支付很多钱来获得一个真正的解决方案。 - dreeves
19
我肯定会为此付钱。如果它基本上像Unix中的鼠标焦点(没有自动提升)一样工作,我会非常高兴。也许我们可以在某个地方发布赏金。 - Nathan Binkert
1
我喜欢去点赞一条评论,结果发现是Nathan Binkert。我们很快就要一起喝啤酒了。想知道你最近在忙什么! - Wedge Martin
2
当然你很疯狂。但显然我也是。我也在寻找一种解决方案,可以在没有自动提升的情况下工作,因为我经常需要在窗口中快速完成某些操作,但在那个特定的时刻不需要看到整个窗口。 - cjs
1
这并不是什么疯狂的想法。我一直在所有的Unix/Solaris/Linux/Windows桌面上使用和依赖这个设置。不得不点击窗口标题栏才能将其置于顶部是一种可憎的行为。为什么MacOS要与众不同呢? - Mike
显示剩余5条评论
24个回答

91

您可以通过在命令行中输入以下命令来为Terminal.app完成此操作:

defaults write com.apple.Terminal FocusFollowsMouse -bool true

对于 X11 应用程序,您可以执行以下操作:

defaults write com.apple.x11 wm_ffm -bool true

在雪豹系统中,请使用以下方法:
defaults write org.x.X11 wm_ffm -bool true

显然有一个叫做CodeTek Virtual Desktop的程序可以在整个系统中模拟桌面,但是它需要花费$$(而且他们从未为OSX Leopard发布过版本)。


1
太棒了,正是我在寻找的。 - JLZenor
1
这绝对只是一个部分解决方案--但它是一个简单而有用的部分解决方案!谢谢! - lindes
3
附注:将其设置为终端,即使在另一个应用程序中悬停在终端窗口上也可以使用!对我来说,这是我可能真正想要使用它的主要原因,这使得它成为了一个99%的答案!非常赞同!(好吧,我已经这样做了,但如果我能的话,我会再次这样做。) - lindes
7
iTerm2 已经内置了这个功能...在偏好设置中,选择指针选项卡,在底部有一个“鼠标跟随焦点”的选项。它甚至可以从当前活动的应用程序(例如,假设您的浏览器是活动的应用程序,而您正在浏览器字段中输入...将鼠标移动到 iTerm2 窗口中,您的键入内容将出现在那里,把鼠标移开,就会回到您的浏览器或其他活动的应用程序)。 - jlp
1
“kwm” 代码库的链接已失效(以不同名称存档)。另一个答案 指出它已被“yabai”取代,截至本评论,后者可以正常使用。 - OJ7
显示剩余6条评论

62

虽然这远非完整的解决方案,但内置于OSX(10.11)中的两个便利操作是:

⌃⌥-单击(control-option-click)- 在不提升窗口的情况下切换焦点

⌘-单击(command-click)- 在不切换焦点的情况下在窗口中点击

我不确定这些快捷键是何时引入的,因为我找不到任何关于它们的书面说明。


2
从技术上讲,这在10.12“macOS Sierra”上可以工作,但是应用程序和wm之间缺乏修改键标准会导致另一种Yegge式的悲剧。在浏览器中,⌘-单击链接也会打开一个新选项卡。在Chrome中,⌘-单击选项卡还可以进行多选。至少在编辑器和终端上,⌃⌥-单击足够好用,而在标题栏上⌘-单击拖动窗口时不会使其提高。 - Metaxis
1
只是想确认这在Mojave中仍然有效。然而,上面提到的它在不同应用程序之间不一致是正确的。Chrome和FF都未能遵循标准。@Sébastien...您正在单击最前面的窗口。click是针对没有焦点的窗口的。 - undefined
1
关于来源,这是在WWDC 2018视频中提到的,涉及Xcode和LLDB高级调试 - Graystripe
命令点击似乎可以使用,但实用性有限。控制选项点击(COC)严重依赖于所使用的应用程序。例如,在Chrome和Firefox(FF)中打开多个窗口;将焦点放在Chrome上,然后在FF窗口上进行COC,您会得到一个右键单击选项菜单(但不会升起),但将焦点放在FF窗口上并在Chrome窗口上进行COC,则可以按照广告中的方式工作。但是,将焦点放在Chrome的一个窗口上,尝试COC另一个Chrome窗口,它只会升起。将焦点放在一个FF窗口上,并在另一个FF窗口上进行COC,则会显示右键单击选项菜单(并升起!)。 - michael
1
顺便提一下,终端修复确实可以在其他应用程序中使用(例如我之前评论中提到的 Chrome 和 Firefox),但只有在将鼠标移动到终端时才能使用,而不是反过来(即,终端保持在后台但确实获得了焦点)。https://dev59.com/EnVD5IYBdhLWcg3wE3Xz#98331 看起来解决“松散焦点”的“修复”需要在各个应用程序中实现,而不是在操作系统(桌面)级别上实现。 - michael
显示剩余3条评论

60

Steve Yegge曾经写过一篇关于这个问题的文章,他试图编写一个合适的扩展程序但失败了。我后来也试图在OS X上寻找鼠标跟随焦点的应用程序,但同样失败了。


4
他似乎也没有上传他编写的代码 :( - Stuart Axon
8
非常有道理。让我感到困惑/烦恼的一件事是,滚动行为似乎有些懒散。因此,当我将鼠标移动到另一个窗口,滚动文本,然后开始输入时,输出会去往另一个应用程序。 - Ocie Mitchell

58

我已经不断地回到这个问题大约10年了,最终我找到了一个简单的解决方案:AutoRaise https://github.com/sbmpost/AutoRaise

默认情况下它启用了焦点跟随鼠标和自动提升窗口。你可以通过配置选项延迟自动提升。

它还有一个被称为“warp”的功能,当你使用 Command-Tab 切换到一个窗口时,它会将鼠标指针居中于该窗口。我之前从未知道我需要这个功能,但一旦尝试过后,就再也离不开它了!


5
天啊,_终于_!简直完美无缺。我真的无法想象为什么不是每个人都想要这个。现在试试扭曲的东西;听起来非常聪明。非常感谢你! - dreeves
没关系,这里是 GitHub 的问题页面,列出了目前无法实现的原因:https://github.com/sbmpost/AutoRaise/issues/47 - Jan
"扭曲问题有漏洞,没有办法禁用它吗?" - mjs
1
运作完美,强烈推荐。 - Boris Sadakov
2
在我的 MacOS Ventura 13.3.1 上运行得非常好。 - knkbga
显示剩余6条评论

50

对于 OS X 操作系统来说,鼠标跟随焦点并不是一个特别适合的输入方式,因为它的菜单栏被设计在屏幕顶部。当鼠标移出你的应用程序窗口到达菜单时,如果途中穿过了其他应用程序的窗口,那么菜单就会改变。

所以,回答 dreeves 的评论,它在 Terminal(或桌面上的任何其他单个应用程序)上完全正常工作,因为它将影响的唯一其他窗口是终端窗口,因此在切换窗口时菜单永远不会改变。而且它在 X11 上也可以正常工作,因为 X11 应用程序通常将其菜单栏嵌入窗口中,因此您无需离开窗口即可访问它们。

当然,您可以通过在焦点更改和/或菜单切换之前引入人为延迟来解决菜单更改问题,但它永远不会像在其他桌面上那样有效。


5
关于菜单栏的观点完全正确,但由于标准延迟,实际上对我并不是问题。 - dreeves
24
像其他人一样,我几年前把旧的X窗口转变成了Mac。与其他人一样,这个问题让我非常恼火。需要点击一个窗口以使其聚焦并自动上升到顶部是很糟糕的。(我本来想写“疯狂”之类的话,但决定不要过于夸张。) - VTPete
7
@Calum:抱歉,我不同意。我曾经在Mac OS X上使用过Focus-Follows-Mouse(使用CodeTek Virtual Desktop Pro),它完美地运行了! 它在所有应用程序中的表现都很稳定,并且切换应用程序、将窗口移动到不同的工作区以及导航工作区比最新的OS X [10.6.7]实现方式更加容易。遗憾的是,苹果公司扼杀了CodeTek及其产品——Virtual Desktop Pro实际上比OS X工作区的实现方式更加出色。它的运行方式基本上类似于Linux上的Fvwm——超快速的导航。 - Tilo
10
这只是为数不多的理由之一,解释了为什么OS X中的脱离式顶部菜单栏是我见过的最荒谬、可笑的用户界面设计想法之一。那些提出这个想法的人应该受到指责和批评。 - Nate
2
@Nate 屏幕边缘是非常容易到达的位置,如果你使用鼠标、轨迹球或触摸板作为指针设备(基本上除了触摸或笔之外的任何东西),因为你可以简单地“超过”菜单项的一般方向,你的指针就会停在它上面。请注意菜单项的热点与屏幕顶部和彼此对齐。 - Tobia
显示剩余10条评论

24
所以我决定再次改进MouseFocus.app的工作,因为它还有一些缺陷。这些现在已经修复了。我把整个东西重命名为"AutoRaise"以更好地反映这个工具的功能:当你悬停在一个窗口上时,它会被提升到前面(延迟由你选择),并获得焦点。可以在这里下载该工具。要使用它,请将它复制到/ Applications /文件夹中,确保它是可执行的(chmod 700 AutoRaise)。然后从Finder中双击它。要快速切换开/关状态,可以使用下面的applescript,并将其粘贴到自动化服务工作流程中。然后通过系统偏好设置|键盘|快捷键将创建的服务绑定到键盘快捷方式。 更新(29-03-2017):AutoRaise二进制文件已更新。如果命令行没有指定延迟,它现在也会在相同的主目录中查找AutoRaise.delay文件。这在使用下面的applescript时特别有用,因为“启动应用程序”不支持命令行参数。延迟应以20ms单位指定。例如,要指定20ms的延迟,请在终端中运行此命令:'echo 1 > ~/AutoRaise.delay'。
on run {input, parameters}
    tell application "Finder"
        if exists of application process "AutoRaise" then
            quit application "/Applications/AutoRaise"
            display notification "AutoRaise Stopped"
        else
            launch application "/Applications/AutoRaise"
            display notification "AutoRaise Started"
        end if
    end tell
    return input
end run

更新 (18-04-2019): 源代码https://github.com/sbmpost/AutoRaise

更新 (05-06-2020): 默认延迟设置为2,轮询时间缩短。这些设置可以防止鼠标快速移动时意外地窗口上升(例如到达顶部菜单)。还添加了“弯曲鼠标”功能和修复了一个内存泄漏问题。有关详细信息,请查看 README


2
你能否编辑一下之前的帖子吗?这样在一个帖子中投票某个应用程序会更清晰和容易,而不是发布多个版本的帖子。 - Diamondo25
1
@dreeves 添加了使其可执行的指令:从命令行(在应用程序文件夹中)运行 chmod 700 AutoRaise。还修复了一个错误,即当通知到达时,提升功能会停止工作。同时减少了默认延迟。我正在使用它来管理多个屏幕,对此目的而言,它似乎做得很好。 - sbmpost
1
啊,我删掉了我的旧(过时的)帖子。所以请随意给这个点赞吧;-) - sbmpost
2
感谢您提供的工具,非常出色。如果您将其开源,那就太棒了! - Steve Goranson
7
这件事情早就该做了,但是它的来源可以在这里找到:https://github.com/sbmpost/AutoRaise - sbmpost
显示剩余10条评论

21
“菜单问题是传统的鼠标跟随焦点无法工作的唯一原因。”
“这里有一个替代方案:在键盘上按下一个键之前不要改变焦点。这将涵盖95%的焦点跟随鼠标的使用情况,并会让这位老派的X用户非常高兴。我不知道自己在Chrome中滚动网页时,有多少次按下Command-T打开新标签页,结果却在终端中打开了标签页。如果我的大脑在使用Mac 8个月后还没有适应,那就永远不会了。”

1
和我一样!:P 但是苹果声称他们更懂。 - Tilo
3
这将很棒。焦点跟随鼠标的主要重点之一是在不必明确点击它们的情况下为其他窗口提供键盘焦点,因此按键时应该执行正确的操作。有哪些实现了这个功能呢? - jamesdlin
如果我能使用焦点跟随鼠标,那么对于少数需要访问菜单的情况,我将很高兴地使用Ctrl+F2键盘快捷键。 - Matthew
我已经从事这个行业将近8年了,但我的大脑仍然无法适应! 我同意这将是一个很好的解决方案! 我为Hammerspoon编写了一些Lua代码,可以在鼠标移动停滞时触发代码,但从未进一步开发以使其有用。 - ericslaw

17

Amethyst 支持这个功能。你可以使用 brew install amethyst 命令轻松安装。

这是我使用的配置文件,除了鼠标跟随焦点之外,它将所有功能都关闭了。将其保存到 ~/.amethyst 文件中。

{
    "LAYOUTS": "----------------------",
    "layouts": [
    ],

    "MODIFIERS": "----------------------",
    "Valid modifiers are": [
        "option",
        "shift",
        "control",
        "command"
    ],

    "mod1": [
    ],
    "mod2": [
    ],

    "COMMANDS": "----------------------",
    "Commands are": {
        "cycle-layout": "Cycle layout to the next layout",
        "cycle-layout-backward": "Cycle layout to the previous layout",
        "focus-screen-1": "Focus the main window on the first screen",
        "focus-screen-2": "Focus the main window on the second screen",
        "focus-screen-3": "Focus the main window on the third screen",
        "focus-screen-2": "Focus the main window on the second screen",
        "focus-screen-3": "Focus the main window on the third screen",
        "focus-screen-4": "Focus the main window on the fourth screen",
        "throw-screen-1": "Throw the focused window to the first screen",
        "throw-screen-2": "Throw the focused window to the second screen",
        "throw-screen-3": "Throw the focused window to the third screen",
        "throw-screen-4": "Throw the focused window to the fourth screen",
        "shrink-main": "Shrink the main pane of the current layout",
        "expand-main": "Expand the main pane of the current layout",
        "increase-main": "Increase the number of windows in the main pane",
        "decrease-main": "Decrease the number of windows in the main pane",
        "focus-ccw": "Move window focus counter-clockwise on the current screen",
        "focus-cw": "Move window focus clockwise on the current screen",
        "swap-ccw": "Swap focused window with the next window going counter-clockwi$
        "swap-cw": "Swap focused window with the next window going clockwise",
        "swap-main": "Swap focused window with the main window of its screen",
        "throw-space-1": "Throw the focused window to the first space",
        "throw-space-2": "Throw the focused window to the second space",
        "throw-space-3": "Throw the focused window to the third space",
        "throw-space-4": "Throw the focused window to the fourth space",
        "throw-space-5": "Throw the focused window to the fifth space",
        "throw-space-6": "Throw the focused window to the sixth space",
        "throw-space-7": "Throw the focused window to the seventh space",
        "throw-space-8": "Throw the focused window to the eighth space",
        "throw-space-9": "Throw the focused window to the ninth space",
        "throw-space-8": "Throw the focused window to the eighth space",
        "throw-space-9": "Throw the focused window to the ninth space",
        "toggle-float": "Toggle the focused window between being floating and tiled"
    },

    "screens": "3",

    "cycle-layout": {
        "mod": "mod1",
    },
    "cycle-layout-backward": {
        "mod": "mod2",
    },
    "select-tall-layout": {
        "mod": "mod1"
    },
    "select-wide-layout": {
        "mod": "mod1"
    },
    "select-fullscreen-layout": {
        "mod": "mod1"
    },
    "select-column-layout": {
        "mod": "mod1"
    },
        "mod": "mod1"
    },
    "focus-screen-1": {
        "mod": "mod1"
    },
    "focus-screen-2": {
        "mod": "mod1"
    },
    "focus-screen-3": {
        "mod": "mod1"
    },
    "focus-screen-4": {
        "mod": "mod1"
    },
    "throw-screen-1": {
        "mod": "mod2"
    },
    "throw-screen-2": {
        "mod": "mod2"
    },
    "throw-screen-3": {
        "mod": "mod2"
    },
    "throw-screen-4": {
        "mod": "mod2"
    "throw-screen-4": {
        "mod": "mod2"
    },
    "shrink-main": {
        "mod": "mod1"
    },
    "expand-main": {
        "mod": "mod1"
    },
    "increase-main": {
        "mod": "mod1"
    },
    "decrease-main": {
        "mod": "mod1"
    },
    "focus-ccw": {
        "mod": "mod1"
    },
    "focus-cw": {
        "mod": "mod1"
    },
    "swap-screen-ccw": {
        "mod": "mod2"
    },
    "swap-screen-cw": {
    },
    "swap-screen-cw": {
        "mod": "mod2"
    },
    "swap-ccw": {
        "mod": "mod2"
    },
    "swap-cw": {
        "mod": "mod2"
    },
    "swap-main": {
        "mod": "mod1"
    },
    "throw-space-1": {
        "mod": "mod2"
    },
    "throw-space-2": {
        "mod": "mod2"
    },
    "throw-space-3": {
        "mod": "mod2"
    },
    "throw-space-4": {
        "mod": "mod2"
    },

        "mod": "mod2"
    },
    "throw-space-5": {
        "mod": "mod2"
    },
    "throw-space-6": {
        "mod": "mod2"
    },
    "throw-space-7": {
        "mod": "mod2"
    },
    "throw-space-8": {
        "mod": "mod2"
    },
    "throw-space-9": {
        "mod": "mod2"
    },
    "toggle-float": {
        "mod": "mod1"
    },
    "toggle-tiling": {
        "mod": "mod2"
    },
    "display-current-layout": {
        "mod": "mod1"
    "display-current-layout": {
        "mod": "mod1"
    },

    "MISC": "----------------------",
    "floating": [],
    "float-small-windows": false,
    "mouse-follows-focus": false,
    "focus-follows-mouse": true,
    "enables-layout-hud": false,
    "enables-layout-hud-on-space-change": false
}

1
@dreeves,这方面有一点延迟,但据我所知,时间无法配置。 - wprl
4
配置文件中存在几个语法错误。我已经纠正了这些错误,并将它们粘贴到了这里 - Jason R. Coombs
2
我尝试了Amethyst,它可以解决OP的问题。但似乎不支持无需Autoraise的变体“Focus Follows Mouse”。 - Jason R. Coombs
5
如果有人发现了一种“焦点跟随鼠标但不自动提升”的功能,请告诉我。同时:@JasonR.Coombs 你更新的~/.amethyst设置 对我很有帮助,谢谢。 - Johnny Utahh
3
您不需要手动修改配置文件。您可以在 Amethyst 的偏好设置中启用此功能。该选项名称为“焦点跟随鼠标”(实验性功能)。 - webcpu
显示剩余8条评论

12
在我的macOS(Mojave)上,使用chunkwm可以实现鼠标跟随焦点。查看此处Stack Overflow的回复可获得“不自动提升”解决方案。离开后将激活Autoraise。
chunkc set ffm_disable_autoraise         0

~/.chunkwmrc文件中。

编辑 2019-09-12:

chunkwm已被yabai取代。要安装:

brew tap koekeishiya/formulae
brew install yabai
mkdir -p ~/.config/yabai/
printf 'yabai -m config focus_follows_mouse autoraise' >> ~/.config/yabai/yabairc
brew services start yabai

需要注意的是,chunkwm和yabai都是平铺式窗口管理器。您的建议非常好,但即使有15.5毫米像素,我仍然希望有重叠的窗口。 - ericslaw
Yabai的主要目的是为macOS提供平铺式窗口管理器。其中一个子功能是焦点跟随鼠标。此处描述的配置仅使用焦点跟随鼠标,不使用平铺。 - Les Grieve

8
Codetek曾经有一个可以实现这个功能的产品,但他们从未发布过适用于Leopard或更高版本的版本。
MondoMouse可以实现焦点跟随鼠标,但无法自动提升窗口。即使是焦点跟随鼠标也存在问题。例如,它无法与命令+Tab键配合使用(如果你使用命令+Tab键切换到一个新应用程序并且不触摸鼠标,则焦点不应该返回到鼠标指针所在位置——我几乎确定我见过的每个Linux实现都能做到这一点,但MondoMouse不能)。
你可以为Terminal窗口启用焦点跟随鼠标(无自动提升),只需在终端中执行以下命令:
defaults write com.apple.Terminal FocusFollowsMouse -string YES

同样地,对于X11窗口:

defaults write org.x.X11 wm_ffm -bool true 

(针对 Mac 版本低于 10.5.5 的情况,此处为:)
defaults write com.apple.x11 wm_ffm true

我不知道有其他支持此功能的应用程序。


它是一个救命稻草。 - Amarjit Dhillon

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