最近在研究炒股票精进赌博技艺,总感觉姿势不够炫酷,甚至有些痛苦。痛苦来自于两方面,一个是囿于设备有限,只有一块2K外接屏,没办法像个专业交易员赌徒那样8块屏幕挂在头上,一目十行并激烈操作;另一方面是每次查个股重复劳动不说而且很不便利,挨个打开挨个查看,非常浪费时间。

然后寻思弄个一键进入这种工作状态的脚本,通过alfred拉起来,具体来说是如下的步骤:

  • 要在外接显示器上新建一个macOS的Desktop
  • 切换并激活新的Desktop
  • 在Desktop中批量打开目标网页
  • 然后进行保存好的布局

最终达到的效果就是一键敲下去,开始看股票。因为所有东西都在Desktop里,在mac上直接划屏就能将整个工作区切来切去。

实现的步骤是:

  • 配置alfred workflow
  • 配置Moom布局
  • 编写AppleScript脚本创建Desktop

创建alfred workflow

这一步没什么可说的,trigger是keyword,然后接action,action选择脚本,语言选择如下图。

配置Moom布局

这一步也没什么可说的,唯一强调的是记得起一个title,因为在脚本里通过这个title来调用指定布局。

编写AppleScript

先贴脚本:

tell application "System Events"
        tell application "Mission Control" to launch
        tell group 2 of group 2 of group 1 of process "Dock"
            click (every button whose value of attribute "AXDescription" is "add desktop")
            tell list 1
                set countSpaces to count of buttons
                delay 0.5
                click button (countSpaces)
            end tell
        end tell
    end tell

delay 1

set urlsToOpen to {"https://baidu.com","https://google.com","https://cninfo.cn"}

tell application "Google Chrome"
    repeat with currentURL in urlsToOpen
        make new window
        open location currentURL
    end repeat
end tell

tell application "Moom"
    arrange windows according to snapshot named "个股"
end tell

脚本共分三部分。第一部分用来创建Desktop,第二部分打开固定的目标网站,第三部分调用Moom的layout进行自动布局。

第一部分有一点可以说,在这里确实给我添了点堵,导致我一顿乱查+一顿打log。因为平时mac都会接显示器用,而我想在外接显示器上创建Desktop。用AppleScript实现这个功能的方法可以说是千奇百怪了,分别有调用模拟点击流、快捷键流、模拟按键流以及脚本关键字调用流。他们分别长这样:

set displayIndex to 1

tell application "Mission Control"
    set currentSpace to space 1 of desktop displayIndex
    set newSpace to make new space at end of spaces of desktop displayIndex
    set index of newSpace to 2
    delay 0.5
    tell application "System Events" to key code 124 using control down
    delay 0.5
    set index of currentSpace to 2
end tell

这样:

set externalDisplay to ""

tell application "System Events"
    repeat with thisDesktop in every desktop
        if status of thisDesktop is true and (exists display window of thisDesktop) then
            set externalDisplay to name of thisDesktop
            exit repeat
        end if
    end repeat
end tell


tell application "Mission Control"
    tell application "System Events" to key code (Mission Control)
    delay 0.5
    tell application "System Events" to key code (123)
    delay 0.5
    tell application "System Events" to key code (124) using control down
    delay 0.5
    tell application "System Events" to key code (43) using control down
end tell

还有那样:

set extDisplayID to 0
repeat with displayID in (list of every desktop)
    if display ID of display preferences is not displayID then
        set extDisplayID to displayID
    end if
end repeat

do shell script "open -na '/Applications/Mission Control.app'"
delay 1
tell application "System Events" to tell process "Dock"
    click (first UI element whose role description is "desktop" and accessibility description is "Desktop " & (extDisplayID + 1))
end tell

而且AppleScript的API和当前系统的Mac OS版本也有关系,一些语法错误debug起来非常崩溃。

最终我采用的版本是模拟点击,调用”Mission Control”,在”Dock”里找到对应热区,这个Dock值得不是mac屏幕下方一排应用程序的dock,指的是”Mission Control”唤起以后顶部用来排布Desktop的“Dock”。

如上图,这个区域就是Dock,然后再看看tell语句是如何选中的:tell group 2 of group 2 of group 1 of process "Dock", 其中第二个group of是在找屏幕。第一个和第三个是啥俺已经忘记了,毕竟是通过打log进行的撞墙式开发,事后再回忆起来讲究一个“不求甚解”。剩下的就是选中,就是数数字而已,因为新建的空间在最后,所以有几个就选第几个。

而找屏幕的group of其实可以通过参数来确定,这样就能直接控制你想在哪个屏幕来这套一键大法,比如:


keyword:屏幕A ---|
keyword:屏幕B ---|--> alfred filter -> query + applescript
keyword:屏幕C ---|

在脚本里,不同屏幕要对应不同的layout,因为屏幕的分别率不同。

第二部分和第三部分都没啥可说的,第三部分刚说过,你可以通过filter来改造,适配不同场景和不同屏幕,或者再进一步接上SwitchResX…这一定会显得很傻吧。

最后看看效果:

看来儿子们今天不太争气。

Reference