명령줄
groupshelf 명령을 사용하면 터미널이나 스크립트에서 열려 있는 윈도우를 그룹화하고, 그룹에 추가하거나 그룹을 해제하고, 윈도우 목록을 볼 수 있습니다. GroupShelf 1.3.0 이상에 포함되어 있습니다.
설치
명령은 GroupShelf.app에 포함되어 있습니다. 설치란 PATH에 있는 폴더에 명령으로 연결되는 링크를 만드는 것입니다.
Homebrew를 사용하면 GroupShelf를 설치할 때 명령도 자동으로 연결됩니다:
brew install --cask alpharium-tech/tap/groupshelf1.3.0 이전에 Homebrew로 GroupShelf를 설치했다면 앱 안에서 업데이트해도 링크가 추가되지 않습니다. 다음을 한 번 실행하십시오:
brew reinstall --cask groupshelfHomebrew를 사용하지 않는다면 GroupShelf의 설정 › 명령줄에 링크를 만드는 명령이 복사할 수 있는 형태로 표시됩니다. 터미널에서 실행하면 Mac 암호를 묻는 메시지가 표시됩니다. 응용 프로그램 폴더에 있는 GroupShelf의 경우 다음과 같습니다:
sudo mkdir -p /usr/local/bin && sudo ln -sf '/Applications/GroupShelf.app/Contents/Helpers/groupshelf' /usr/local/bin/groupshelf이 명령은 GroupShelf를 응용 프로그램 폴더로 옮기고 해당 폴더에서 열었을 때만 표시됩니다. 다운로드 폴더에 있는 사본으로 연결되는 링크는 앱을 옮기면 끊어지기 때문입니다.
명령이 설치되면 설정 › 명령줄에 설치 위치가 표시되고, groupshelf version을 실행하면 명령이 속한 GroupShelf의 버전이 표시됩니다.
켜기
윈도우를 다루는 명령은 허용해야만 작동합니다. GroupShelf의 설정 › 명령줄에서 ‘명령줄 및 스크립트에서 제어 허용’을 켜십시오. 켜기 전까지는 꺼져 있습니다. help와 version은 어느 상태에서든 작동합니다.
켜져 있는 동안에는 GroupShelf 제어를 허용한 앱(예: 터미널 앱)과 그 안에서 실행되는 모든 프로그램이 윈도우를 그룹화하고 이 데스크탑에 있는 모든 윈도우의 제목을 읽을 수 있습니다.
권한
처음 사용할 때 macOS가 터미널 앱이 GroupShelf를 제어하도록 허용할지 묻고, 명령은 응답을 기다립니다. 허용하지 않았다면 시스템 설정 › 개인정보 보호 및 보안 › 자동화에서 터미널 앱 아래의 GroupShelf를 켜십시오.
Visual Studio Code
대부분의 사람이 내려받는 VS Code의 Universal 빌드(버전 1.104 이상)에는 macOS가 이 권한을 묻기 전에 요구하는 항목이 없습니다. macOS는 묻지 않고 거부하며 Visual Studio Code 아래에 GroupShelf를 표시하지도 않으므로, groupshelf가 macOS에 확인을 요청합니다. 다음 줄이 표시되고, 대화상자에는 Visual Studio Code의 이름이 나타납니다:
groupshelf: asking macOS whether your terminal app may control GroupShelf…
한 번 응답하면 이후로는 계속 작동합니다. 그래도 자동화에서 Visual Studio Code 아래에 GroupShelf가 표시되지 않으면 Universal 대신 VS Code의 Apple silicon 또는 Intel 빌드를 설치하십시오. 두 빌드 모두 해당 항목이 있습니다. Homebrew의 visual-studio-code cask는 Mac의 칩에 맞는 빌드를 설치합니다.
윈도우 지정
명령이 <window>를 받는 곳에서는 다음 세 가지 방법 중 하나로 작성합니다. 공백이 들어 있으면 따옴표로 묶으십시오.
- 앱
해당 앱의 윈도우 하나입니다. 앱에서 활성화된 윈도우, 없으면 가장 앞에 있는 윈도우입니다. 앱은 Dock에 표시되는 이름이나 파일 이름(대소문자 구분 없음), 또는 번들 ID나 경로로 지정합니다.Safari"Visual Studio Code"com.apple.Safari/Applications/Safari.app - 앱과 제목의 일부
제목에 해당 텍스트가 들어 있는 그 앱의 윈도우입니다(대소문자 구분 없음).Code:proj-a"Terminal:my server" - 윈도우 ID
groupshelf list가 표시하는 번호입니다.
같은 앱을 두 번 쓰면 그 앱의 윈도우 두 개를 사용합니다.
제목이 여러 윈도우에 해당하면 오류가 발생합니다. 단, --frontmost를 추가하면 그중 가장 앞의 윈도우를, --all을 추가하면 모두를 사용합니다. --all은 제목 없이 지정한 앱의 모든 윈도우도 사용합니다.
groupshelf는 앱을 열지 않으므로 앱이 실행 중이어야 합니다. group과 add는 실행 중인 앱의 윈도우가 나타나기를 최대 30초 동안 기다리므로, 바로 전에 연 앱도 사용할 수 있습니다:
open -a Safari && open -a Terminal && groupshelf group Safari Terminal이 데스크탑에 있는 윈도우만 대상이 되며, 최소화된 윈도우도 포함됩니다. 전체 화면 윈도우는 자체 데스크탑을 가지므로 대상이 되지 않습니다.
상대 경로는 현재 폴더를 기준으로 읽습니다. 경로에 제목을 붙이려면 /Applications/Safari.app:Docs처럼 .app: 뒤에 쓰십시오.
명령
groupshelf help는 명령 목록을, groupshelf help <command>는 각 명령의 설명을 표시합니다. GroupShelf가 실행 중이 아니면 명령이 백그라운드에서 GroupShelf를 실행합니다. 지정한 앱을 여는 일은 없습니다.
옵션은 -- 앞이라면 어디에나 쓸 수 있으며, 값은 공백이나 = 뒤에 씁니다(--name Work 또는 --name=Work). 이름이 -로 시작하는 앱은 -- 뒤에 쓰십시오.
group
groupshelf group [--name <name>] [--all | --frontmost] <window> <window>...
윈도우를 지정한 순서대로 하나의 탭 묶음으로 그룹화합니다. 첫 번째 윈도우가 그룹의 위치와 크기를 정하며, 완료되면 그 탭이 표시됩니다. 이미 다른 그룹에 있는 윈도우는 그 그룹을 떠나 이 그룹에 들어옵니다.
윈도우가 두 개 이상 필요하며, --all을 사용하면 <window> 하나로 충분합니다. 30초 안에 나타나지 않는 윈도우가 있으면 나머지로 그룹을 만들고 누락된 윈도우를 알려 줍니다. 정확히 그 윈도우들로 이루어진 그룹에 실행하면 탭을 지정한 순서로 정렬하기만 합니다.
--name <name>- 새 그룹에 이름을 붙여 나중에
--group으로 찾을 수 있게 합니다. --frontmost- 제목이 여러 윈도우에 해당할 때 가장 앞의 윈도우를 사용합니다.
--all- 해당하는 모든 윈도우를 사용합니다. 앱이라면 그 앱의 모든 윈도우, 제목이라면 그 제목이 들어 있는 모든 윈도우입니다.
groupshelf group Safari Terminal Notes Mailgroupshelf group --name Work Code:proj-a Terminal:proj-a Safariopen -a Safari && open -a Terminal && groupshelf group Safari Terminalgroupshelf group --all Terminal
add
groupshelf add [--all | --frontmost] --group <name> <window>... groupshelf add [--all | --frontmost] <member> <window>...
이 데스크탑에 있는 기존 그룹의 끝에 윈도우를 추가합니다. 그룹의 위치, 크기, 표시 중인 탭은 그대로 유지됩니다. 이미 다른 그룹에 있는 윈도우는 옮겨집니다. group과 마찬가지로 이미 열려 있는 윈도우만 사용하며, 최대 30초 동안 기다립니다.
그룹은 --group으로 지정하거나, 그룹에 속한 윈도우 하나(<member>, <window>와 같은 방식으로 작성)로 지정합니다. 앱이나 --frontmost를 붙인 제목은 그룹에 아직 없는 윈도우가 있으면 그것을 사용하며, 이미 그룹에 있는 윈도우는 그대로 둡니다.
--group <name>- 이름으로 지정한 그룹입니다(대소문자 구분 없음).
--name으로 붙인 이름이나, 탭 막대를 오른쪽 클릭하여 ‘그룹 이름 지정…’으로 붙인 이름입니다. --frontmost- 제목이 여러 윈도우에 해당할 때 가장 앞의 윈도우를 사용합니다.
--all- 해당하는 모든 윈도우를 사용합니다. 앱이라면 그 앱의 모든 윈도우, 제목이라면 그 제목이 들어 있는 모든 윈도우입니다.
groupshelf add --group Work Slackgroupshelf add Code:proj-a Terminal:proj-a
detach
groupshelf detach [--all | --frontmost] <window>...
윈도우를 그룹에서 분리합니다. 윈도우가 하나만 남은 그룹은 해제됩니다. 아무것도 열거나 기다리지 않으므로 윈도우가 이미 이 데스크탑에 있어야 합니다. 그룹에 속하지 않은 윈도우는 그대로 둡니다.
--frontmost- 제목이 여러 윈도우에 해당할 때 가장 앞의 윈도우를 사용합니다.
--all- 해당하는 모든 윈도우를 사용합니다. 앱이라면 그 앱의 모든 윈도우, 제목이라면 그 제목이 들어 있는 모든 윈도우입니다.
groupshelf detach Slackungroup
groupshelf ungroup [--group <name>]... [<member>]...
그룹을 해제하며, 윈도우는 그 자리에 남습니다. 그룹은 --group으로 지정하거나(여러 개라면 반복), 그룹에 속한 윈도우 하나(<member>, <window>와 같은 방식으로 작성)로 지정합니다. 그룹에 속하지 않은 윈도우는 건너뜁니다. 하나라도 찾을 수 없으면 어떤 그룹도 해제하지 않습니다.
--group <name>- 이름으로 지정한 그룹입니다(대소문자 구분 없음).
--name으로 붙인 이름이나, 탭 막대를 오른쪽 클릭하여 ‘그룹 이름 지정…’으로 붙인 이름입니다.
groupshelf ungroup --group Workgroupshelf ungroup Code:proj-a
list
groupshelf list
이 데스크탑에서 그룹화할 수 있는 윈도우를 앞에서 뒤 순서로, 최소화된 윈도우는 마지막에 나열합니다. GroupShelf 자체의 윈도우와 제외된 앱의 윈도우는 빠집니다. 한 줄이 윈도우 하나이며, 다음 필드가 탭으로 구분되어 있고 머리글 줄은 없습니다:
- 윈도우 ID
- 앱 이름
- 제목
- 그룹 번호(없으면 비어 있음)
- 그룹 이름(없으면 비어 있음)
minimized(최소화되지 않았으면 비어 있음)
groupshelf list4211 Safari GroupShelf — Command line 1 Work4198 Terminal proj-a — zsh 1 Work4305 Mail Inbox3977 Notes Shopping minimized
제목 안의 탭이나 줄바꿈은 공백으로 바뀌므로 필드가 항상 맞춰집니다. ID는 다른 명령의 <window>로 사용할 수 있으며, fzf와 함께 쓰면 윈도우를 골라 그룹화할 수 있습니다:
groupshelf list | fzf -m | cut -f1 | xargs groupshelf grouphelp
groupshelf help [<command>]
명령 목록이나 group, add, detach, ungroup, list 중 하나의 사용법을 표시합니다.
groupshelf help groupversion
groupshelf version
명령이 포함된 GroupShelf의 버전과 빌드를 표시합니다. 둘은 항상 같은 빌드입니다.
종료 상태
스크립트는 종료 상태에 따라 분기할 수 있습니다. 메시지는 표준 오류로 출력되며 모두 groupshelf:로 시작합니다.
0- 성공.
1- GroupShelf가 오류를 보고했습니다. 실행 중이 아닌 앱 등 요청 내용을 고쳐야 합니다. 일부 윈도우가 빠진 채 그룹이 만들어진 경우도 포함됩니다.
2- 사용법 오류. 명령줄 자체가 잘못되었습니다. 명령이 무엇이 잘못되었는지와 사용법을 표시하며, GroupShelf에는 연결하지 않습니다.
3- GroupShelf에 연결할 수 없습니다. 권한이 없는 등 설정을 고쳐야 합니다.
문제 해결
각 메시지의 의미와 대처 방법입니다. 메시지 속 이름과 숫자는 예시이며, 실제로는 입력한 내용이 표시됩니다.
GroupShelf 연결 · 종료 상태 3
groupshelf: GroupShelf.app not found
명령이 자신이 포함된 GroupShelf를 찾을 수 없습니다. 앱 밖에 복사해 둔 명령이며 GroupShelf도 설치되어 있지 않은 상태입니다. GroupShelf를 설치한 다음, 명령을 복사하지 말고 ‘설치’에 나온 대로 링크하십시오.
groupshelf: GroupShelf could not be launched: <reason>
GroupShelf가 실행 중이 아니었고, macOS도 표시된 이유로 열 수 없었습니다. GroupShelf를 직접 연 다음 명령을 다시 실행하십시오.
groupshelf: GroupShelf did not start within 15 seconds
GroupShelf를 백그라운드에서 열었지만 제시간에 준비되지 않았습니다. 명령을 다시 실행하십시오.
groupshelf: GroupShelf did not answer in time; if macOS asked whether your terminal app may control GroupShelf, answer that and try again
대부분 macOS가 아직 권한 요청에 대한 응답을 기다리고 있는 경우입니다. 응답한 다음 명령을 다시 실행하십시오.
groupshelf: not allowed to control GroupShelf; allow your terminal app in System Settings › Privacy & Security › Automation
터미널 앱이 GroupShelf를 제어하도록 허용되어 있지 않습니다. 시스템 설정 › 개인정보 보호 및 보안 › 자동화에서 터미널 앱 아래의 GroupShelf를 켜십시오.
groupshelf: if Visual Studio Code doesn't list GroupShelf there, install VS Code's Apple silicon or Intel build; its Universal build can't ask macOS for this permission
VS Code의 터미널에서는 위 줄에 이어서 표시됩니다. ‘권한’의 Visual Studio Code 부분을 참조하십시오.
groupshelf: this version of GroupShelf doesn't support groupshelf; update GroupShelf
명령이 연결한 GroupShelf가 명령보다 이전 버전입니다(예: Mac의 다른 위치에 있는 이전 사본). GroupShelf를 1.3.0 이상으로 업데이트하고 이전 사본은 삭제하십시오.
groupshelf: could not reach GroupShelf (error <number>)
다른 이유로 macOS가 요청을 전달하지 못했습니다. 숫자는 macOS의 오류 코드입니다. GroupShelf를 종료했다가 다시 연 다음 다시 시도하십시오. 계속 발생하면 그 숫자와 함께 지원팀에 문의하십시오.
GroupShelf 설정 및 상태 · 종료 상태 1
groupshelf: control from the command line is off; turn on "Allow control from the command line and scripts" in GroupShelf Settings › Command Line
‘켜기’에 나온 대로 설정 › 명령줄의 스위치를 켜십시오.
groupshelf: GroupShelf needs Accessibility access; allow it in System Settings › Privacy & Security › Accessibility
이 권한이 없으면 GroupShelf가 윈도우를 움직일 수 없습니다. 시스템 설정 › 개인정보 보호 및 보안 › 손쉬운 사용에서 GroupShelf를 켜십시오.
groupshelf: GroupShelf is paused while Stage Manager is on
GroupShelf는 스테이지 매니저와 함께 사용할 수 없습니다. 시스템 설정에서 스테이지 매니저를 끈 다음 GroupShelf를 재시동하십시오.
groupshelf: GroupShelf hasn't finished starting; try again
잠시 후 명령을 다시 실행하십시오.
groupshelf: another group request is still running
GroupShelf는 요청을 한 번에 하나씩 처리하며, group과 add는 윈도우를 최대 30초 동안 기다릴 수 있습니다. 다른 요청이 끝난 다음 다시 실행하십시오.
groupshelf: "Slack" is excluded from grouping in GroupShelf settings
해당 앱이 설정 › 그룹화의 ‘제외된 앱’에 들어 있습니다. 윈도우를 그룹화하려면 그곳에서 제거하십시오.
윈도우 지정 · 종료 상태 1
groupshelf: "Safari" isn't running; open it first — groupshelf only works with windows already open
먼저 앱을 여십시오. 그러면 group과 add가 그 윈도우를 최대 30초 동안 기다립니다.
groupshelf: no application named "Safary"
철자를 확인하십시오. 실행 중이 아니고 응용 프로그램 폴더에도 없는 앱은 번들 ID나 경로로만 지정할 수 있습니다.
groupshelf: "/Applications/Utilities" is not an application
경로가 앱이 아닌 것을 가리킵니다. .app 자체를 가리키도록 하십시오.
groupshelf: "Terminal:proj" fits 2 windows ("proj-a — zsh", "proj-b — zsh"); give more of the title, a window ID from groupshelf list, or --frontmost or --all여러 윈도우의 제목에 해당 텍스트가 들어 있습니다. 메시지에 나온 방법 중 하나로 범위를 좁히십시오.
groupshelf: no window 4211 on this desktop; groupshelf list shows the windows there
윈도우가 닫혔거나, 다른 데스크탑에 있거나, 전체 화면 상태입니다. groupshelf list를 실행하여 현재 ID를 확인하십시오.
groupshelf: no window for "Slack" on this desktop
detach, ungroup, <member>는 이 데스크탑에 이미 있는 윈도우만 보며 기다리지 않습니다. 윈도우가 이곳에 열려 있는지 확인하십시오.
groupshelf: "4211" names a window another argument already names
두 인수가 같은 윈도우를 가리킵니다. 둘 중 하나를 제거하십시오.
groupshelf: GroupShelf can't group its own windows
명령에서 GroupShelf를 빼십시오.
그룹 지정 · 종료 상태 1
groupshelf: no group named "Work"
그 이름의 그룹이 없습니다. groupshelf list의 다섯 번째 필드에 각 윈도우의 그룹 이름이 표시됩니다.
groupshelf: --group "Work" fits 2 groups; name the group by one of its windows instead
같은 이름의 그룹이 여러 개 있습니다. 대신 그룹에 속한 윈도우 하나를 <member>로 지정하십시오.
groupshelf: the group of "Work" isn't on this desktop
add는 이 데스크탑에 있는 그룹에만 추가할 수 있습니다. 그룹이 있는 데스크탑으로 이동하여 그곳에서 실행하십시오.
groupshelf: "Safari" isn't in a group; groupshelf group makes one
<member>로 지정한 윈도우가 어떤 그룹에도 속해 있지 않습니다. group으로 그룹을 만드십시오.
일부만 완료된 경우 · 종료 상태 1
groupshelf: grouped 3 windows; no window for "Mail" on this desktop within 30 seconds groupshelf: added 1 window; no window for "Mail" on this desktop within 30 seconds groupshelf: nothing added; no window for "Mail" on this desktop within 30 seconds
첫 번째 세미콜론 앞의 내용은 완료되었습니다. 그 뒤에 나열된 윈도우는 30초 안에 이 데스크탑에 나타나지 않아 포함되지 않았습니다.
groupshelf: no group created: only 1 window to group; no window for "Mail" on this desktop within 30 seconds
윈도우가 두 개 미만이어서 아무것도 변경하지 않았습니다.
groupshelf: grouped 2 windows; "Mail" could not be added to the group
윈도우가 속한 그룹이나 들어갈 그룹이 잠겨 있습니다. 잠긴 그룹의 탭 막대를 오른쪽 클릭하고 ‘그룹 잠금 해제’를 선택한 다음 명령을 다시 실행하십시오.
사용법 오류 · 종료 상태 2
groupshelf: unknown option '--names' Usage: groupshelf group [--name <name>] [--all | --frontmost] <window> <window>... Run 'groupshelf help group' for more.
명령줄 자체가 잘못되었습니다. 첫 줄에 무엇이 잘못되었는지가 나오고, 이어서 명령의 사용법이 표시됩니다. GroupShelf에는 아무것도 보내지 않았습니다.