【问题标题】:Mac OS X: Bring (non-bundle) GUI applications to foreground when launched from the command lineMac OS X:从命令行启动时将(非捆绑)GUI 应用程序置于前台
【发布时间】:2013-04-07 02:36:44
【问题描述】:

当从 OS X 终端启动 GUI 进程时,窗口会在后台显示,您必须使用 command-tab 来获得焦点。

有没有办法让终端在这些 GUI 启动后自动获得焦点? 例如(假设安装了 gitk):

% gitk

应该启动 GUI,然后切换到它。

注意:出于多种原因,使用open 作为this answer 的建议并不是一个通用的解决方案。

更新:为了更好地解释为什么 open 方法不能令人满意,这里有一个示例 bash 会话(带有诙谐的评论)。

% cd /my_repo
% gitk

等待 GUI 出现……现在任何一天……哦等等——它已经打开了。我只是没有注意到,因为它在我的终端后面打开了一个窗口。我不知道我要在这里等多久......

% open gitk
The file /my_repo/gitk does not exist.

啊,当然。

% which gitk
/usr/bin/gitk
% open /usr/bin/gitk

什么...它打开了一个新的终端窗口来运行 gitk,它是在我的主目录中执行的,而不是 /my_repo,所以 gitk 抱怨当前目录实际上不是存储库...

【问题讨论】:

  • 如果您能详细解释一下为什么需要从命令行同步调用窗口应用程序(而不是使用 open 异步打开它),这可能会有所帮助。
  • 并非所有应用程序都可以通过open(例如gitk)打开。另外,可以通过这种方式打开的会通过单独的终端打开,这可能会很不方便。
  • '并非所有应用程序都可以通过 open 打开' 为什么不呢?我想不出它是真的原因——根据定义,普通/窗口应用程序应该是您可以从 Finder 或 Dock 打开的东西。 “将通过单独的终端打开”我不明白“单独的终端”是什么意思。你的意思是,即使你打开了一个终端,你也不能从那个终端使用open ...?如果是这样,为什么不呢?
  • 抱歉含糊不清。我刚刚更新了这个问题。希望它能解释为什么 open 没有完全削减它......
  • gitk 正在做一些奇怪的事情,它的行为部分像一个 GUI 应用程序,部分像一个命令行工具(注意它的当前工作目录)。我认为理想情况下它应该负责将自己带到最前沿。

标签: macos terminal


【解决方案1】:

您需要同步调用它吗?如果没有,您可以使用& 异步启动它,然后使用osascript -e 'tell application "gitk" to activate' 激活它。

【讨论】:

  • 这一直有效,直到 macOS Big Sur 出现并且似乎已经毁了它。如果我仍然自己从终端单独运行 osascript 命令,它就可以工作。但作为一个功能的一部分,我使用& 调用实际工具,然后在延迟0.5 后执行激活,它不再起作用。我错过了什么吗?
【解决方案2】:

如果你正在专门处理 gitk,你可以编辑 gitk 文件来实现这一点,我在苹果堆栈交换上发布了一个答案:https://apple.stackexchange.com/a/74917/35956

您可以在终端使用以下命令找到 gitk 文件

which gitk

在我的 gitk 文件中,我在顶部附近找到了如下所示的一行(第 3 行)

exec wish "$0" -- "$@"

我改成了这个

exec wish "$0" -- "$@" & exec osascript -e "tell application \"Wish\" to activate"

当我从命令行执行 gitk 时,gitk 窗口来到前台,这样做的另一个副作用是它异步执行

【讨论】:

    【解决方案3】:

    您可以将 @chris 页面的答案包装在 bash 函数中,然后将其放入您的 .bashrc 中

    function gitk() {
      command gitk "$@"&
      command osascript -e "delay .5" -e "tell application \"wish\" to activate"
    }
    

    应该有一种方法可以通过循环并在超时后查找“wish”来消除延迟。

    注意:“Wish”是我的 Mac 上为 gitk 显示的窗口标题。

    【讨论】:

    • 在今天最新的 macOS 上这是否仍然适用于您?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 2012-01-24
    • 2014-10-08
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 2012-05-26
    相关资源
    最近更新 更多