如何以编程方式在 MacOS 上的触摸栏布局之间切换?

How to programatically switch between touchbar layouts on MacOS?

系统

M1 Mac图书专业版

MacOS 大苏尔

问题

我喜欢日常使用的默认 Mac 触摸栏布局,但我更喜欢编程时触手可及的 F1-F12 键。我也不喜欢按住 fn 键。这就是为什么我写了两个 AppleScript 来切换布局(包括在下面)。

这些脚本可以工作,但它们有问题。这是因为他们依赖于打开系统偏好设置应用程序并浏览菜单。我用 Automator 制作了几个“应用程序” 只是 运行 脚本,然后将它们分配给键盘快捷键。

这是一个不错的解决方案,但我想做一些更优雅的事情。理想情况下,我的脚本应该 运行 在幕后立即更改触摸栏布局,而不是打开系统偏好设置,从下拉列表中选择项目,然后最后关闭系统偏好设置。

在求助于 Automator 之前,我用 shell 弄乱了一段时间但没有成功。有什么比较精明的人有什么建议吗?

代码

这使 F1-F12 键成为默认的触摸栏布局:

tell application "System Preferences"
    set the current pane to pane id "com.apple.preference.keyboard"
    delay 0.25
    reveal anchor "keyboardTab" of pane "com.apple.preference.keyboard"
end tell

tell application "System Events"
    tell process "System Preferences"
        click pop up button 2 of tab group 1 of window "Keyboard"
    end tell
end tell

tell application "System Events"
    tell process "System Preferences"
        click menu item "F1, F2, etc. Keys" of menu 1 of pop up button 2 of tab group 1 of window "Keyboard"
    end tell
end tell

tell application "System Events"
    tell process "System Preferences"
        click pop up button 4 of tab group 1 of window "Keyboard"
    end tell
end tell

tell application "System Events"
    tell process "System Preferences"
        click menu item "Show App Controls" of menu 1 of pop up button 4 of tab group 1 of window "Keyboard"
    end tell
end tell

quit application "System Preferences"

而这个则相反(使应用控制默认的触摸栏布局):

tell application "System Preferences"
    set the current pane to pane id "com.apple.preference.keyboard"
    delay 0.25
    reveal anchor "keyboardTab" of pane "com.apple.preference.keyboard"
end tell


tell application "System Events"
    tell process "System Preferences"
        click pop up button 2 of tab group 1 of window "Keyboard"
    end tell
end tell

tell application "System Events"
    tell process "System Preferences"
        click menu item "App Controls" of menu 1 of pop up button 2 of tab group 1 of window "Keyboard"
    end tell
end tell

tell application "System Events"
    tell process "System Preferences"
        click pop up button 4 of tab group 1 of window "Keyboard"
    end tell
end tell

tell application "System Events"
    tell process "System Preferences"
        click menu item "Show F1, F2, etc. Keys" of menu 1 of pop up button 4 of tab group 1 of window "Keyboard"
    end tell
end tell

quit application "System Preferences"

macOS Catalina 上切换目标设置时,它会更改 PresentationModeGlobal 键的 in ~/Library/Preferences/com.apple.touchbar.agent.plistappWithControlStripfunctionKeys 或者这两个选择相反。但是,使用 defaults 命令 以编程方式切换它,同时它在 UI 中更改它,但不会更改它Touch Bar 而无需重新启动 ControlStrip process.

以下示例 shell脚本代码是我使用的一个 键盘快捷键 显示应用程序控件 F1、F2 等之间切换。键 作为这就是我系统上系统偏好设置>键盘>键盘中分别设置的内容。

示例 shell 脚本 代码:

#!/bin/zsh

pmg="$(defaults read com.apple.touchbar.agent 'PresentationModeGlobal')"

if [[ $pmg == "appWithControlStrip" ]]; then
    defaults write com.apple.touchbar.agent 'PresentationModeGlobal' 'functionKeys'
    killall "ControlStrip"
else
    defaults write com.apple.touchbar.agent 'PresentationModeGlobal' 'appWithControlStrip'
    killall 'ControlStrip'
fi

备注:

其他版本的 macOS 可能需要更改其他设置和/或重新启动其他 进程 ,例如 pkill 'Touch Bar agent' 如果适用。

Terminal 中,您可以使用 defaults 命令的 read verb 检查对 com.apple.touchbar.agent.plist 当你在 UI 中制作它们时,看看 value 是否有额外的 keys 也需要更改。




旁注

至于你的 AppleScript code,我会根据你的 code 作为单个 脚本 在两个选项之间切换。

你没有说你 macOS 是什么版本 运行 因为我没有 弹出按钮 4 我无法测试下面显示的 example AppleScript code ,但是,这应该消除两个单独的scripts 它只是通过一个 键盘快捷键 .

在两者之间切换

示例 AppleScript 代码:

tell application "System Preferences"
    set the current pane to pane id "com.apple.preference.keyboard"
    delay 0.25
    reveal anchor "keyboardTab" of pane "com.apple.preference.keyboard"
end tell

tell application "System Events"
    tell tab group 1 of window 1 of process "System Preferences"
        if value of pop up button 2 is "Show App Controls" then
            click pop up button 2
            click menu item "F1, F2, etc. Keys" of menu 1 of pop up button 2
            click pop up button 4
            click menu item "Show App Controls" of menu 1 of pop up button 4
        else
            click pop up button 2
            click menu item "Show App Controls" of menu 1 of pop up button 2
            click pop up button 4
            click menu item "F1, F2, etc. Keys" of menu 1 of pop up button 4
        end if
    end tell
end tell

quit application "System Preferences"


注意:示例 AppleScript code 就是这样,没有包含任何 错误处理 不包含任何额外的 错误处理 可能是适当的。用户有责任根据需要或需要添加任何 错误处理 。查看 try statement and error statement in the AppleScript Language Guide. See also, Working with Errors. Additionally, the use of the delay 命令 在适当的事件之间可能是必要的,例如delay 0.5,适当设置延迟