rcmdnk's blog

AppleScript: The Definitive Guide: Scripting and Automating Your Mac (Definitive Guides)

OS X Yosemite 10.10にアップデートして気になったこととか の最後に書いたYosemiteでRuby1.8が削除された件について。

AppleScriptでウィンドウのサイズを変えたり位置を整えたりするものを 作って使ってるんですが、Yosemiteになってまた使えなくなって 今度は以前のMavericksへの変更の時のようなごまかしが効かなくなったので、 改めてスクリプトを書き直しました。

Ruby 1.8の削除

以前、Mavericksへのアップデートの際、 MacにインストールされているRubyのバージョンが1.8(Lion時)から 2.0にアップデート去っれて、require 'osx/cocoa'が出来なくなりました。

この時は、Mavericksには

/System/Library/Frameworks/Ruby.framework/Versions/1.8

という形で1.8自体は残っていたので、 スクリプト内で使うshebangを

#!/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby

の様に1.8のRubyに直接指定してやるとそのまま使えてました。

Mavericksでrequire ‘osx/cocoa’が出来ない

ですが、Yosemiteでは#!/System/Library/Frameworks/Ruby.framework/Versions/には 2.0しかなく、1.8はそのままでは使えません。

1.8のものを何処かから取ってくれば使えないことは無いと思いますが、 せっかくなのでスクリプトをアップデートして現状のものに対応させるようにしました。

ruby - cannot load such file – osx/cocoa error on 1.9.3 - Stack Overflow

使ってるAppleScript

ここにあるAppleScriptが使ってるものです。 これらをBetterTouchToolでキーボードショートカットに充てたりしてます。

ここにあるスクリプトはosadecompileしてテキストにしてあるので、 実際に使うときはosacompileコマンドを使ってscpt形式にして使う必要があります。 (もしくはスクリプトエディターに貼り付けてスクリプト(.scpt)として保存して使う。)

この中で、次のスクリプトが使えなく鳴りました。

AppleScript/windowSize.applescript at 131c0884c3d172053c497c98f6a646d5d29caa92 · rcmdnk/AppleScript

このスクリプトはスクリーンのサインズを取ってきて、 それに合わせてウィンドウのサイズを最大化させたり 半分の大きさにしたりするための大元のスクリプトです。

この中でrequire 'osx/cocoa'という宣言とともに Rubyのスクリプトを作って呼んでいます。

ただ、これはMacにインストールされたRuby 1.8に 依存していて、Mavericksなどからインストールされている2.0の方には osx/cocoaというのは入っていません。

ので、他の方法が必要に。

patrickhno/cocoa

patrickhno/cocoa というgemが作られていて、

$ gem install cocoa

とすると上のスクリプトで使ってる様な関数などが使えるようになる、様な感じ。

requireするものをcocoaとして、 OSX::となってるところをCocoa::とすればそのまま使えそうかな、 と思って入れてみましたが、 実際にこれを使ってみると、

$ irb
irb(main):001:0> require 'cocoa'
=> true
irb(main):002:0> mf = Cocoa::NSScreen.mainScreen().frame()
=> #<Cocoa::CGRect:0x007f9f44a60640>
irb(main):003:0> mf.origin.x
NoMethodError: undefined method `origin' for #<Cocoa::CGRect:0x007f9f44a60640>
from (irb):4
        from /usr/bin/irb:12:in `<main>'
        irb(main):005:0>

みたいな感じで、メインスクリーンのフレームの情報が取れません。

多分メインスクリーンのオブジェクト自体には単にこれだけではアクセスできないで、 何かしら取ってくる方法があるのだとは思いますが、 そのまま変換出来るわけではなさそうなのでここで一旦断念して他を探索。

AppKit Framework

ということでちょっと探してみると、Rubyをわざわざ呼ばなくても 中で使ってるNSScreen等のクラス等を直接呼べる事を知ったので それを使って変更してみることに。

Demonstration of how to use an AppleScript Bundle to enable access to NSScreen in AppleScriptObjC

AppKit Framework Reference

AppleScriptの中で

use framework "AppKit"

を宣言すると、

current application's NSScreen

みたいな感じで今のアプリケーションのNSScreenオブジェクトを取ってこれます。

ただ、上のスクリプトにあるような

NSScreen.mainScreen().frame()

みたいにいきなりNSScrreenを使うことは出来ず、 current application's NSScreenみたいに何処かのアプリケーションの 中のNSScreenオブジェクトを取ってくる必要があります。 (mainScrennをいきなり取ってくる方法もありそうなもんですがぱっと見つけられなかったのと これで取り敢えずはOKだったので取り敢えずこれで)

ここで注意点があって、 まず、use framwork文は関数の中では使えないので スクリプトの関数とかの外側に書く必要があります。

また、use framework "AppKit"すると いくつか使えなく文字列があるのか文法が制限されるのか そのままでは使えなくなるコードが出てきます。

display dialog "test dialog"

とか

set myScript to load script file myScpt

などと言ったコードの所で

end of line があるべきところですが identifier が見つかりました。

と言ったエラーが出て、dialogscriptの部分が反転されます。

ただ、use framework "AppKit"を使ってNSScreen等を使う関数だけを 別ファイルに書いて、 他からスクリプトを読んで関数を実行する際には 呼ぶ側のスクリプトの方ではdisplay dialogとか、 また、呼ぶためのload scriptは実行可能です。

ということで、上のスクリプトの中にある、 getVisibleFrameの関数の部分だけを別に分けて みました。

AppleScript/windowSize.applescript at b5aca62c08c0990abdf940d07b84f39a32e10c56 · rcmdnk/AppleScript

AppleScript/visibleFrame.applescript at b5aca62c08c0990abdf940d07b84f39a32e10c56 · rcmdnk/AppleScript

取り敢えずこれでwindowSizeのスクリプトを実行すれば 現在一番上にあるアプリのウィンドウが画面に合わせて最大化 (メニューバーやDock、また、GeekTool等の上方部分を考慮した上で さらに上下左右に好きなスキマを入れて)出来ます。

同じレポジトリに在るスクリプトを使って、

  • wsFull: 最大化(windowSizeを直接呼ぶのと一緒)。 (--Return)
  • wsHalf: 名前はHalfですが中で{xsize:0.7, ysize:0.7}と指定してあって全画面の70%の大きさに変更。(---Return)
  • wsHalfBottom: 下半分に。(--J)
  • wsHalfLeft: 左半分に。(--H)
  • wsHalfRight: 右半分に。(--L)
  • wsHalfTop: 上半分に。(--K)

という変更が出来ます。 これらは現在の一番上にあるウィンドウに作用するので、 スクリプトをスクリプトエディタで開いた状態で実行すると エディタに作用しますが、メニューバーにスクリプトアイコンを表示させておいて そこから実行したり、 BetterTouchToolなんかでショートカットにスクリプトを充てておけば 今アクティブになっているウィンドウを最大化したり適当なサイズに変更できます。 上のカッコ内にあるキーは現在BetterTouchToolでそれぞれに割り当てているキー設定です。

Macで最初に行う設定備忘録: その他の設定

MacでVimっぽくカーソルやマウス、ウィンドウを動かす

また、スクリプトの中で、ウィンドウのサイズを変更する前に

  • moveForMon: GeekToolなどのデスクトップ表示アプリの整頓。(--.)

というスクリプト内にある関数を使って、 デスクトップに表示させているGeekTool等の情報表示をきちんと 正しい位置に移動させる様にしています。

これは特にMacを外部ディスプレイにつないだり外したりすることがよくあるときに 必須で、そうでないとディスプレイを繋いだりするたびに 手動で全部位置を調整しなくてはならないので表示自体を使いたくなくなってしまいます。

MacでのGeekToolの設定

このスクリプトがウィンドウのリサイズ時に必ず呼ばれるので、 ディスプレイを新しくして1回でもどれかリサイズすれば自動的に 表示も戻るし、勿論直すことだけしたいのであればmoveForMonを直接呼んであげれば良いだけ。

また、表示中全てのウィンドウを予め決めたとおりに整頓し直すスクリプトもあります。

  • moveForMonAll: 表示中の全てのウィンドウを整頓。(--/)

こちらは余り使いませんが、もうちょっと工夫すれば使い勝手もよくなるかも。

moveForMonの中にはGeekToolやその他の表示物、 また、moveForMonAll時にどのアプリを何処へどのサイズで持ってくるか、 的な事がハードコードされているので、もし使いたい人がいれば それらは自分の好きなように変更しなおして使ってください。

ウィンドウをリサイズするようなアプリなんかは沢山ありますし、 上で使ってるBetterTouchToolにも機能があったりしますが、 細かく上下左右のマージンをつけたり、またGeekToolみたいな画面に表示させてる 物を上手く避けて表示させたりすることが出来る物は今のところ見当たらないので 自分で細かく設定できる様に自分でスクリプトを書いて使うのは結構便利で より快適にMacが使える様になります。

Sponsored Links
Sponsored Links

« OS X Yosemite 10.10にアップデートして気になったこととか Mac Yosemiteでの外部からログインしてssh-agentを正しく使う方法 »

}