Blog没怎么写,倒是天天总结AppleScript~ 其实可以写个applescript分类了,呵呵~

最近又折腾一档子 便民 利己小工具,窗口布局器。这名字听起来怪怪的,我也没有怎么仔细想过,姑且先这么叫吧。需求来源是,有时候要对照某个web页面的内容,在另外一个web页面或者其他程序里面写邮件或者做其他事情,这个需求是很多人都有的,工作生活中也很常见。解决办法一般都是移动和缩放两个窗口摆在桌面两边,或者上下两部分,或者两个显示器上。如果有个工具可以方便快捷完成这个操作,那应该不错。今天的“窗口布局器”就完成的这个功能;并且我还借鉴了Windows 7中摸索到的还没有精确确认的neat小功能,WIN+上下左右方向键对窗口进行最大/最小化等操作,最终让今天折腾的窗口布局器和QuickSilver快捷键设置绑定起来,做到最快布局窗口。

功能需求/描述是这样:编写 ResizeRepos.scpt ,通过执行它可将当前窗口尺寸变为全屏幕的高,全屏幕的N分之一宽,并且移动到距离窗口左上角位置最近的(宽度的N分之一的整数倍,0)的坐标。用通俗点的语言就是,假设你想把屏幕分成左右两半,执行ResizeRepos.scpt脚本后,无论你现在打开的是Terminal还是Preview,都会使窗口占据屏幕的一半,是左半边还是右半边取决于窗口原始位置是略靠左还是略靠右。如果已经移动到了屏幕的最左边,再次执行该脚本会将窗口移到最右边,再执行一次会移动回最左边。更为奇妙的是,如果你的桌面足够大,将屏幕分为三份/四份也是可以的。

废话不多说,上代码~~


property _deskwidth : 2048
property _deskheight : 1152
property _segments : 2

on run argv
    if (count argv) is not 0 then
        set _segments to (item 1 of argv) as integer
    end if
    set _cellw to _deskwidth div _segments
    set name_ to the name of (info for (path to frontmost application))
    tell application name_
        set {_posx, _y, _bx, _by} to bounds of front window
        set _newpos to _posx div _cellw * _cellw + _cellw
        if (_newpos ≥ _deskwidth) then
            set _newpos to 0
        end if
        set the bounds of the first window to ¬
        {_newpos, 0, _newpos + _cellw, _deskheight}
    end tell
end run


注:“¬”是折行符号,实际写的时候可以把它连接的两行连起来;“≥”是大于等于号,输入>=即可,保存的时候AppleScript Editor会自动变为≥

解释之:

  • _deskwidth 和 _deskheight 是自己桌面的宽和高,自己根据需要调整;动态获取也是可以的,比如获取宽度就是 set _deskwidth to word 3 of (do shell script "defaults read /Library/Preferences/com.apple.windowserver | grep -w Width") as number;显然自己桌面尺寸不会天天变,我们就不动态获取了;还有就是对于双显/三显/四显的土豪们,请参考 Daring Fireball 06年某文 解释多显虚拟桌面计量的文章,此处不多讨论

  • if (count argv) is not 0 then 一直到if结束,是获取执行时候的参数;我们希望调用的时候调用者告诉脚本是将屏幕划分为两半还是三瓣。。。

  • set name_ to the name of (info for (path to frontmost application)) 此行获取当前程序的名称,下面的tell都是在该程序中进行操作

  • set {_posx, _posy, _botx, _boty} to bounds of front window 获取当前程序的当前窗口左上角xy坐标右下角xy坐标

  • 对获取的xy坐标进行计算,这么简单的就不解释了,然后通过 set the bounds of the first window to {_newpos, 0, _newpos + _cellw, _deskheight} 将新坐标发回给窗口,就设置完成了位置和尺寸

仅仅写完了这个还没有彻底结束,这个script如果只是在Finder里双击运行或者Terminal里命令行执行,就只能修改修改这俩程序的窗口位置和尺寸了。现在我编写了两个脚本split2.sh和split3.sh,各自都只有一行,他们分别是 osascript /Users/kcome/sh/scripts/ResizeRepos.scpt 2 和 osascript /Users/kcome/sh/scripts/ResizeRepos.scpt 3 ;看到了吧,只有最后一个字符不同,第一个就是分两半的方案布局窗口,第二个是分三瓣。

然后进入QuickSilver的Triggers界面,添加项目,Select an item选择刚才写的split2.sh,Action就是默认的Run […],Target随便写一个字符(否则用快捷键启动时候会被询问Target,其实在这里是无用的参数);然后添加保存,指定快捷键,就大功告成了。按下快捷键试试吧?

其实,要说我这博有啥意义的话,我想只有两点,一个是想说AppleScript很强大,基本上发挥自己的想象力,可以完成许许多多的有趣有用功能;另外一个就是,善用google,勇于尝试,我不过是花了一两个小时,搜索了不到十个关键词组,比如“applescript get current desktop size”、“move window by applescript”、“howto get argument in applescript”,加上试验,修改,调试,就完成了这个功能。所以,写程序也不难,让电脑听话也是有趣事:)

参考最多的一篇博文 Applescript: Moving and Resizing Windows