[Mac] AppleScript를 이용해 window size, position 자동화하기

okstring·2021년 11월 19일
0
post-thumbnail

듀얼모니터를 사용하고 있는데 항상 Application을 켜고 이리저리 창을 배치하는게 굉장히 귀찮았다.

첫번째로 선택한 것은 Spectacle 인데 단축키를 이용해 다른 모니터로 넘길 수 있고 창을 화면의 반으로 sizing 할 수 있어서 편리하게 사용하고 지금도 자주 사용하지만 많은 창을 일일히 정리하는건 꽤나 시간이 많이 걸렸다.

그리고는 열려있는 창의 위치를 기억하는 방법이 있을까 하는 생각을 하며 찾아보다가 AppleScript로 window를 옮긴다는 댓글을 보고 무작정 파봤다.

AppleScript

AppleScript는 애플이 만든 스크립트 언어이며 시스템7 이후 매킨토시 운영체제에 통합되어있다고 한다. 처음 본 언어의 첫 느낌은 자연스러워 보이는 영어문장이라 왠지 친숙해보이긴 했다. 써보고나서는 자연스러운 영어문장 같지만 역시 프로그래밍 언어답게 문법을 철저하게 지켰다. 친숙한 느낌은 갑자기 사그라들었다

무작정 Finder - 응용프로그램 - 유틸리티 - 스크립트 편집기를 열어서 AppleScript를 사용해 window size, position 자동화를 해보려 했다.

이 포스팅에서는 열려있는 애플리케이션에 대해 위치를 변경하는 법을 알려준다

size, position 알아내기

우선 필요한건 열려있는 application에 접근해보려 했다.
참고로 (* *)은 주석이다

tell application "System Events" to tell application process "카카오톡" (*1*)
    say "Hello~~" (*2*)
end tell
  1. application process 카카오톡에 접근하고
  2. Hello 텍스트를 시스템에서 읽고 말해준다(?!). 텍스트가 아닌 경우는 읽히지 않는 경우도 있어보인다.(ex. list 자체 등등)

카카오톡에 접근했으니 해당 창의 position을 알아내는 코드를 넣어줬다.

get {size, position} of window 1

열려있는 윈도우 중 1번째 윈도우의 size, position 값을 가져온다.

그러면 {{390, 823}, {2404, 65}} 같은 중첩된 list 형태로 결과 창에 출력된다.

음 생각보다 수월했다. 다른 창들도 원하는 위치에 두고 size, position을 다 알아냈다.

그런데 이상하게 iTerm은 열려있는게 없다고 나왔다

이는 응용 프로그램에 있는 이름이 아니라 실제로 프로세스에 올라가있는 이름으로 구동해야한다.

해당 application에 size, position 적용하기

위 코드에서 조금만 더 추가하면 된다. 조금 더 안전하게 카카오톡이 열려있는지 조건문을 추가했다.

tell application "System Events"
    if exists application process "카카오톡" then
        tell application process "카카오톡" to tell window 1
            set {size, position} to {{1440, 1055}, {2091, 25}}
        end tell
    end if
end tell

그러면 촥! 하고 바로 카카오톡 창이 헤딩 위치로 이동해있다.

물론 앞서 말했듯이, 카카오톡이 열려있어야 한다

변수, list 활용해 iterable하게 접근하기

set apps to {"Xcode", "iTerm2", "카카오톡"}

list를 apps 라는 이름으로 선언할 때는 이렇게 선언한다

repeat with n from 1 to count of apps
    set app_name to item n of apps
end repeat

그리고 리스트 안의 원소 갯수에 맞춰 인덱스를 알아내고 인덱스를 사용해 원소에 접근하기 위해서는 이렇게 접근한다

size, position값에 따라 각각의 app을 배치하는 전체 코드는 다음과 같다

set apps to {"Xcode", "iTerm2", "카카오톡"}
set positions to {{{1725, 1055}, {{505, 383}, {29, 605}}, {{390, 823}, {2404, 65}}}

tell application "System Events"
	
    repeat with n from 1 to count of apps
        set app_name to item n of apps
        set size_position to item n of positions
		
        if exists application process app_name then
            tell application process app_name to tell window 1
                set {size, position} to size_position
            end tell
        end if
		
    end repeat
end tell

tell application "Set Window Position"
    quit
end tell

작성한 코드를 가지고 응용 프로그램으로 만들기

파일 - 내보내기 - 파일포맷을 응용 프로그램으로 지정하고 내보내면 된다

그러면 바로 실행할 수 있는 파일로 저장이 되는데 보안 및 개인정보보호에서 접근 권한을 허용해줘야 한다 안그러면 실행이 안된다.

응용프로그램 실행부터 시작하는 등 완벽한 자동화는 아니지만 간단한 window position 조정을 자동화 할 수 있었다.

추가 - record 활용해보기

use framework "Foundation"
set my_recode to {Safari:{{1440, 1055}, {2091, 25}}, 카카오톡:{{390, 823}, {2404, 65}}}

set objCDictionary to current application's NSDictionary's dictionaryWithDictionary:my_recode
set allKeys to objCDictionary's allKeys()

Objective-C의 Foundation을 사용해 Dictionary를 구현할 수도 있다. 이를 통해 key를 iterable하게끔 읽을 수도 있다. as를 통한 text 타입캐스팅은 필수다

마치며

맛보기로 AppleScript를 배워보면서 느낀건 아이폰의 단축어가 많이 생각났다. 비록 간단하게 자동화를 구현했지만 한 번에 여러 애플리케이션을 다루는데에 큰 매력을 느꼈고 앞으로 심화된 자동화에도 쓰는 등 활용할 길이 많아보였다.


reference

https://www.cocoadev.co.kr/208

https://ko.wikipedia.org/wiki/애플스크립트

https://stackoverflow.com/questions/18062494/how-to-enumerate-the-keys-and-values-of-a-record-in-applescript!

profile
step by step

0개의 댓글