让你的 MAC自动化起来(自动启动项目和 iTerm 相关 AppleScript语句)

如需转载请注明出处:让你的 MAC自动化起来(自动启动项目和iTerm 相关 AppleScript语句)

简介

如果你是一名程序员每天早上到公司启动开发项目要有多少步骤操作?
以我自己为例。我每天到公司要在 iTerm 中启动5个项目操作如下:

  1. 启动 mysql mysql.server start
  2. 进入 python 工作环境 workon SPC
  3. 进入到项目根目录 cd /Users/machao/Desktop/Projects
  4. 进入到开发分支git checkout develop
  5. 获取最新的代码git pull origin develop
  6. 如果有数据库变化更新数据库python manage.py migrate
  7. 启动项目python manage.py runserver 8088

以上是我启动了一个项目,在不算 mysql 启动命令,我还要在启动4个项目重复上面2~7的步骤,一共要在操作24次,其中还不算给 iTerm 切分窗口的操作。以上这一坨操作大概要花掉5分钟左右。
为了让你节约这五分钟,而且可以在你同事面前显呗一下吼吼。

OK先看效果:


自动化效果.gif

看到了吧。AppleScript 可以把5分钟的操作简化为5秒中。
下面进入正题。

基本语句

首先我先将本章会用到的 iTerm 的 AppleScript 语句写出来。如果不懂 AppleScript 语法和基本流程语句请参考《AppleScript 基础一》《AppleScript 基础二》

iTerm的 AppleScript 基本语句

下面也是一个执行顺序

语句 说明
create window with default profile 创建一个新的窗口
set win to current window 获取到当前的窗口
create tab with default profile 创建一个新的 tab 页
current tab of current window 获取当前窗口下的 tab
set columns to sessions 获取当前tab下所有分栏(返回一个 list)
tell second session 告诉第几个分栏做什么( second 随便替换)
split horizontally with default profile 在当前tab中水平切分一个分栏
split vertically with default profile 在当前tab中垂直切分一个分栏
set name to "name" 设置 iTerm窗口名
write text "ls" 在 iTerm中写入命令

关于 窗口-tab-分栏,看下图:下图就是一个窗口,窗口里面两个 tab,当前 tab 中有3个分栏;

窗口-tab-分栏

iTerm AppleScript 语句用法说明

1. 创建一个新的窗口 create window with default profile

  tell application "iTerm"
    create window with default profile
  end tell

2. 在窗口中创建 tab create tab with default profile

创建 tab的前提是你要告诉 iTerm 在那个窗口创建所,以需要 tell current window

  tell application "iTerm"
      tell current window
          create tab with default profile
      end tell
  end tell

3. 获取当前 tab 中分栏数量set sessionCount to the count of sessions

tell application "iTerm"
    tell current tab of current window
        set sessionCount to the count of sessions
        get sessionCount
    end tell
end tell
>>> 3

4. 在当前 tab 中水平切分一个分栏 split horizontally with default profile

创建分栏你要告诉 iTerm 是在哪个窗口的哪个 tab 中的哪个分栏创建新的分栏

tell application "iTerm"
    -- 当前窗口的当前 tab
    tell current tab of current window
        -- 第一个分栏中
        tell first session
            -- 水平切分一个新的分栏
            split horizontally with default profile
        end tell
    end tell
end tell

5. 垂直分类和水平分栏创建过程相同 split vertically with default profile

tell application "iTerm"
    tell current tab of current window
        tell first session
            split vertically with default profile
        end tell
    end tell
end tell

6. 在 iTerm 中输入命令 write text ...

同样也是需要告诉 iTerm 命令是在哪个窗口的哪个 tab 中的哪个分栏执行

tell application "iTerm"
    tell current tab of current window
        tell first session
            write text "ls"
        end tell
    end tell
end tell

7. 设置 iTerm 分栏名称 set name to ...

在 Build 3.3.0beta1 版本突然不能用了,不知道为什么。

tell application "iTerm"
    tell current tab of current window
        tell first session
            set name to "AA"
        end tell
    end tell
end tell

以上是在我的自动化程序中最常用的命令;
iTerm 官方 AppleScript 语句点击这里查看

下面是我启动项目脚本的源码

on selectItem()
        -- 定义按钮
    set itemButtons to {"Gateway", "Raven", "Cancel"}
    set temp to display dialog "Select the item to launch:" buttons itemButtons
    set itemName to button returned of temp
    if itemName is "Gateway" then
        runGateway()
    else if itemName is "Raven" then
        runRaven()
    else
        
    end if
end selectItem

-- public
on closeTab(windowSession, maxTabs)
    get windowSession
    tell application "iTerm"
        tell windowSession
            set tabCount to the count of sessions
            if tabCount ≥ maxTabs then
                set itermTabs to sessions
                set a to 1
                -- 循环tab中分栏字典
                repeat tabCount - 1 times
                    -- 获取字典里面单个分栏元素
                    set value to item a of itermTabs
                    -- 索引+1
                    set a to a + 1
                    -- 告诉tab中单个分栏关闭
                    tell value
                        close
                    end tell
                end repeat
            end if
        end tell
    end tell
end closeTab

-- 检测 iterm 是否启动
on checkiTermActive()
    tell application "iTerm"
        -- 激活 iterm
        tell application "iTerm" to activate
        try
            -- 检测 iterm 是否有 window 没有报错
            tell current tab of current window
                set tabCount to the count of sessions
            end tell
        on error the errorMessage number the errorNumber
            -- 创建一个 window
            create window with default profile
        end try
    end tell
    return true
end checkiTermActive
-- end public


-- Gateway
on initGatewayItem()
    if checkiTermActive() then
        tell application "iTerm"
            -- 获取 iterm window 中第一个 Tab
            set tabRecord to tab of current window
            set firstTab to item 1 of tabRecord
            -- 关闭多余的 分栏(session)
            closeTab(firstTab, 2) of me
            tell firstTab
                set tabCount to the count of sessions
                -- 检测tab中分栏数量是否为1
                if tabCount = 1 then
                    tell first session
                        -- 在tab中创建新的分栏
                        -- vertically垂直切分
                        -- horizontally 水平切分
                        split vertically with default profile
                        split horizontally with default profile
                        runItem() of me
                    end tell
                end if
            end tell
        end tell
    end if
end initGatewayItem


on runItem()
    tell application "iTerm"
        set tabRecord to tab of current window
        set firstTab to item 1 of tabRecord
        tell firstTab
            set tabCount to the count of sessions
            if tabCount = 3 then
                -- 告诉第一个分栏
                tell first session
                    -- 设置分栏名
                    set name to "Nexus(staging)"
                    -- 在分栏中执行下面的命令
                    write text "mysql.server start"
                    write text "workon SC"
                    write text "Nexus"
                    write text "gck staging"
                    write text "gpullo staging"
                    write text "pym migrate"
                    write text "runnexus"
                end tell
                
                tell second session
                    set name to "Arbiter(develop)"
                    write text "Arbiter"
                    write text "workon SC"
                    write text "gck develop"
                    write text "gpullo develop"
                    write text "pym migrate"
                    write text "runarbiter"
                end tell
                
                tell third session
                    set name to "Gateway(newui)"
                    write text "Gateway"
                    write text "workon SC"
                    write text "gck newui"
                    write text "gpullo newui"
                    write text "pym migrate"
                    write text "rungateway"
                end tell
            else
                initGatewayItem() of me
            end if
        end tell
    end tell
end runItem

on runGateway()
    initGatewayItem()
end runGateway
-- end Gateway


-- Raven
on initRaveniTerm()
    if checkiTermActive() then
        tell application "iTerm"
            tell application "iTerm" to activate
            set tabRecord to tab of current window
            set tabCount to the count of tabRecord
            if tabCount is 1 then
                tell current window
                    create tab with default profile
                end tell
            end if
            set tabRecord to tab of current window
            set secondTab to item 2 of tabRecord
            closeTab(secondTab, 2) of me
        end tell
    end if
end initRaveniTerm


on runRaven()
    initRaveniTerm()
    tell application "iTerm"
        -- 获取当前窗口 tab 列表和数量
        set tabRecord to tab of current window
        set tabCount to the count of tabRecord
        if tabCount ≥ 2 then
            -- 获取窗口中第二个 tab
            set secondTab to item 2 of tabRecord
            -- 告诉第二个 tab
            tell secondTab
                -- 告诉第二个tab 的第一个分栏
                tell first session
                    split vertically with default profile
                    set name to "Raven"
                    write text "workon SC-py3"
                    write text "Raven"
                    write text "gck develop"
                    write text "gpullo develop"
                    write text "runraven"
                end tell
                tell second session
                    set name to "Raven UI"
                    write text "workon SC-py3"
                    write text "Raven"
                    write text "gck develop"
                    write text "gpullo develop"
                    write text "cd ui"
                    write text "npm start"
                end tell
            end tell
        end if
    end tell
end runRaven
-- end Raven

selectItem()

里面有很多我启动项目的命令缩写;mac在~/.bash_profile中记录,继续向下看

alias gadd='git add'
alias gb='git branch'
alias gc='git commit'
alias gs='git status'
alias gpusho='git push origin'
alias gpu='git push upstream'
alias gpull='git pull'
alias gpullo='git pull origin'
alias gf='git fetch'
alias gfo='git fetch origin'
alias gck='git checkout'
alias gr='git rm'
alias gm='git mv'
alias gcp='git cherry-pick'
alias gdiff='git diff'
alias ll='ls -al'

alias runnexus='cd /Users/machao/Desktop/Projects/Nexus/ && python manage.py runserver 127.0.0.1:8080'
alias runngnexus='cd /Users/machao/Desktop/Projects/NgNexus/ && python manage.py runserver 127.0.0.1:8080'
alias rungateway='cd /Users/machao/Desktop/Projects/Gateway/ && python manage.py runserver 127.0.0.1:9000'
alias runarbiter='cd /Users/machao/Desktop/Projects/Arbiter/ && python manage.py runserver 127.0.0.1:8000'
alias runcommander='cd /Users/machao/Desktop/Projects/Commander/ && python manage.py runserver 127.0.0.1:8090'
alias runraven='cd /Users/machao/Desktop/Projects/Raven/ && python manage.py runserver 127.0.0.1:8090'

模拟 MAC 快捷键操作

关于按键的编码点击这里查看

  1. 单键点击key code
    模拟按键必须在 System Events 这里面进行
tell application "System Events"
  key code 49
end tell
  1. 多个键点击 keystroke ".." using {... ,...}
--粘贴操作 
tell application "System Events"
    keystroke "v" using {command down}
end tell

\color{red}{注意}:这里的 v 是小写
如果把 v变成大写 V 系统会认为你要操作的是 command + shift + v

  1. 有些可以直接输入名字即可
tell application "System Events"
    keystroke return
    keystroke space
    keystroke tab
end tell

让你的 MAC自动化起来(自动启动项目和iTerm 相关 AppleScript语句)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,417评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,921评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,850评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,945评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,069评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,188评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,239评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,994评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,409评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,735评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,898评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,578评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,205评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,916评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,156评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,722评论 2 363
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,781评论 2 351