Befehlszeile

Mit dem Befehl groupshelf gruppierst du geöffnete Fenster, erweiterst und löst Gruppen auf und listest Fenster auf – im Terminal oder in einem Skript. Er gehört zu GroupShelf 1.3.0 und neuer.

Installieren

Der Befehl ist Teil von GroupShelf.app. Ihn zu installieren heißt, ihn in einen Ordner in deinem PATH zu verlinken.

Mit Homebrew wird der Befehl beim Installieren von GroupShelf automatisch verlinkt:

brew install --cask alpharium-tech/tap/groupshelf

Wenn du GroupShelf vor 1.3.0 mit Homebrew installiert hast, fügen Updates in der App den Link nicht hinzu. Führe dies einmal aus:

brew reinstall --cask groupshelf

Ohne Homebrew zeigt GroupShelf unter Einstellungen › Befehlszeile den Befehl, der den Link anlegt, zum Kopieren an. Führe ihn im Terminal aus; dabei wirst du nach deinem Mac-Passwort gefragt. Für GroupShelf im Ordner „Apps“ lautet er:

sudo mkdir -p /usr/local/bin && sudo ln -sf '/Applications/GroupShelf.app/Contents/Helpers/groupshelf' /usr/local/bin/groupshelf

Die Einstellungen bieten ihn erst an, wenn GroupShelf im Ordner „Apps“ liegt und von dort geöffnet wurde: Ein Link auf eine Kopie in „Downloads“ würde nicht mehr funktionieren, sobald die App bewegt wird.

Sobald der Befehl eingerichtet ist, zeigt Einstellungen › Befehlszeile, wo er installiert ist, und groupshelf version gibt die Version des zugehörigen GroupShelf aus.

Aktivieren

Befehle, die auf Fenster wirken, funktionieren erst, wenn du sie erlaubst: Aktiviere in GroupShelf unter Einstellungen › Befehlszeile „Steuerung über die Befehlszeile und Skripte erlauben“. Bis dahin bleibt es deaktiviert. help und version funktionieren in jedem Fall.

Solange es aktiviert ist, können Apps, denen du die Steuerung von GroupShelf erlaubst (etwa deine Terminal-App), und alles, was darin läuft, Fenster gruppieren und die Titel aller Fenster auf diesem Schreibtisch lesen.

Berechtigungen

Beim ersten Mal fragt macOS, ob deine Terminal-App GroupShelf steuern darf, und der Befehl wartet auf deine Antwort. Falls du abgelehnt hast, aktiviere GroupShelf unter Systemeinstellungen › Datenschutz & Sicherheit › Automation bei deiner Terminal-App.

Visual Studio Code

Dem Universal-Build von VS Code, den die meisten herunterladen (Versionen 1.104 und neuer), fehlt ein Eintrag, den macOS braucht, bevor es nach dieser Berechtigung fragt. macOS würde ohne Nachfrage ablehnen und GroupShelf nie bei Visual Studio Code aufführen. Deshalb bringt groupshelf macOS trotzdem dazu, zu fragen. Es gibt diese Zeile aus, und der Dialog nennt Visual Studio Code:

groupshelf: asking macOS whether your terminal app may control GroupShelf…

Beantworte ihn einmal, dann funktioniert es von da an. Wird GroupShelf in Automation weiterhin nicht bei Visual Studio Code aufgeführt, installiere statt Universal den Apple-silicon- oder Intel-Build von VS Code: Beide enthalten den Eintrag. Der Homebrew-Cask visual-studio-code installiert den Build für den Chip deines Mac.

Fenster angeben

Überall, wo ein Befehl ein <window> erwartet, kannst du es auf drei Arten angeben. Setze alles mit Leerzeichen in Anführungszeichen.

Nenne eine App zweimal, um zwei ihrer Fenster zu nehmen.

Passt ein Titel auf mehrere Fenster, ist das ein Fehler – es sei denn, du fügst --frontmost hinzu, das das vorderste davon nimmt, oder --all, das alle nimmt. --all nimmt außerdem alle Fenster einer ohne Titel angegebenen App.

groupshelf öffnet nie eine App, also muss die App laufen. group und add warten bis zu 30 Sekunden, bis ein Fenster einer laufenden App erscheint – eine gerade erst geöffnete App funktioniert also:

open -a Safari && open -a Terminal && groupshelf group Safari Terminal

Nur Fenster auf diesem Schreibtisch zählen, minimierte eingeschlossen. Ein Fenster im Vollbildmodus hat einen eigenen Schreibtisch und zählt daher nicht.

Ein relativer Pfad wird vom aktuellen Ordner aus gelesen. Um einem Pfad einen Titel hinzuzufügen, schreibe ihn nach .app:, etwa /Applications/Safari.app:Docs.

Befehle

groupshelf help listet die Befehle auf, groupshelf help <command> erklärt einen davon. Läuft GroupShelf nicht, startet ein Befehl es im Hintergrund; die Apps, die du angibst, öffnet er nie.

Optionen können überall vor einem -- stehen, ihr Wert folgt nach einem Leerzeichen oder =: --name Work oder --name=Work. Eine App, deren Name mit - beginnt, gehört hinter --.

group

groupshelf group [--name <name>] [--all | --frontmost] <window> <window>...

Fasst Fenster in der angegebenen Reihenfolge zu einer Reihe von Tabs zusammen. Das erste Fenster bestimmt Position und Größe der Gruppe, und sein Tab wird am Ende angezeigt. Ein Fenster aus einer anderen Gruppe verlässt diese für die neue.

Es braucht mindestens zwei Fenster oder ein einzelnes <window> mit --all. Erscheinen manche nicht innerhalb von 30 Sekunden, wird die Gruppe aus den übrigen gebildet, und der Befehl meldet die fehlenden. Auf eine Gruppe aus genau diesen Fenstern angewendet, ordnet er nur die Tabs in der angegebenen Reihenfolge.

Optionen
--name <name>
Gibt der neuen Gruppe einen Namen, um sie später mit --group zu finden.
--frontmost
Nimmt das vorderste Fenster, wenn ein Titel auf mehrere passt.
--all
Nimmt alle passenden Fenster: alle Fenster einer App, alle Fenster mit dem Titel.
Beispiele
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>...

Fügt Fenster am Ende einer bestehenden Gruppe auf diesem Schreibtisch hinzu; Position, Größe und angezeigter Tab der Gruppe bleiben. Ein Fenster aus einer anderen Gruppe wechselt herüber. Wie bei group werden nur bereits geöffnete Fenster verwendet, mit bis zu 30 Sekunden Wartezeit.

Gib die Gruppe mit --group an oder über eines ihrer Fenster (<member>, geschrieben wie ein <window>). Eine App oder ein Titel mit --frontmost nimmt ein Fenster, das die Gruppe noch nicht hat, sofern es eines gibt; ein Fenster, das schon in der Gruppe ist, bleibt, wie es ist.

Optionen
--group <name>
Eine Gruppe über ihren Namen, unabhängig von Groß- und Kleinschreibung: den mit --name vergebenen oder den über „Gruppe benennen …“ nach einem Rechtsklick auf ihre Tableiste.
--frontmost
Nimmt das vorderste Fenster, wenn ein Titel auf mehrere passt.
--all
Nimmt alle passenden Fenster: alle Fenster einer App, alle Fenster mit dem Titel.
Beispiele
groupshelf add --group Work Slackgroupshelf add Code:proj-a Terminal:proj-a

detach

groupshelf detach [--all | --frontmost] <window>...

Löst Fenster aus ihren Gruppen; eine Gruppe mit nur noch einem Fenster wird aufgelöst. Nichts wird geöffnet oder abgewartet: Die Fenster müssen schon auf diesem Schreibtisch sein. Ein Fenster in keiner Gruppe bleibt, wie es ist.

Optionen
--frontmost
Nimmt das vorderste Fenster, wenn ein Titel auf mehrere passt.
--all
Nimmt alle passenden Fenster: alle Fenster einer App, alle Fenster mit dem Titel.
Beispiel
groupshelf detach Slack

ungroup

groupshelf ungroup [--group <name>]... [<member>]...

Löst Gruppen auf und lässt ihre Fenster, wo sie sind. Gib eine Gruppe mit --group an (für mehrere wiederholen) oder über eines ihrer Fenster (<member>, geschrieben wie ein <window>). Ein Fenster in keiner Gruppe wird übersprungen. Lässt sich eine Angabe nicht finden, wird keine Gruppe aufgelöst.

Optionen
--group <name>
Eine Gruppe über ihren Namen, unabhängig von Groß- und Kleinschreibung: den mit --name vergebenen oder den über „Gruppe benennen …“ nach einem Rechtsklick auf ihre Tableiste.
Beispiele
groupshelf ungroup --group Workgroupshelf ungroup Code:proj-a

list

groupshelf list

Listet die Fenster auf diesem Schreibtisch auf, die sich gruppieren lassen, von vorn nach hinten, minimierte zuletzt. Fenster von GroupShelf selbst und von ausgeschlossenen Apps fehlen. Jede Zeile ist ein Fenster mit diesen Feldern, getrennt durch Tabulatoren und ohne Kopfzeile:

  1. Fenster-ID
  2. App-Name
  3. Titel
  4. Gruppennummer oder leer
  5. Gruppenname oder leer
  6. minimized oder leer
groupshelf list4211	Safari	GroupShelf — Command line	1	Work	4198	Terminal	proj-a — zsh	1	Work	4305	Mail	Inbox			3977	Notes	Shopping			minimized

Ein Tabulator oder Zeilenumbruch in einem Titel wird zu einem Leerzeichen, damit die Felder immer passen. Die ID funktioniert bei den anderen Befehlen als <window>; mit fzf kannst du Fenster auswählen und gruppieren:

Beispiel
groupshelf list | fzf -m | cut -f1 | xargs groupshelf group

help

groupshelf help [<command>]

Zeigt die Liste der Befehle oder die Verwendung eines davon: group, add, detach, ungroup oder list.

Beispiel
groupshelf help group

version

groupshelf version

Zeigt Version und Build des GroupShelf, zu dem der Befehl gehört. Beide sind immer ein und derselbe Build.

Exit-Status

Skripte können anhand des Exit-Status verzweigen. Meldungen gehen an die Standardfehlerausgabe und beginnen jeweils mit groupshelf:.

0
Erfolg.
1
GroupShelf hat einen Fehler gemeldet: Die Anfrage muss korrigiert werden, etwa wegen einer App, die nicht läuft. Auch eine Gruppe, der einige ihrer Fenster fehlen, zählt dazu.
2
Aufruffehler: Die Befehlszeile selbst ist falsch. Der Befehl nennt den Fehler und zeigt seine Verwendung, ohne GroupShelf anzusprechen.
3
GroupShelf war nicht erreichbar: Die Einrichtung muss korrigiert werden, etwa wegen einer fehlenden Berechtigung.

Fehlerbehebung

Was jede Meldung bedeutet und was zu tun ist. Namen und Zahlen darin sind Beispiele; deine zeigen, was du eingegeben hast.

GroupShelf erreichen · Exit-Status 3

groupshelf: GroupShelf.app not found

Der Befehl findet das GroupShelf nicht, zu dem er gehört: Er ist eine Kopie außerhalb der App, und kein GroupShelf ist installiert. Installiere GroupShelf und verlinke den Befehl wie unter „Installieren“, statt ihn zu kopieren.

groupshelf: GroupShelf could not be launched: <reason>

GroupShelf lief nicht, und macOS konnte es aus dem genannten Grund nicht öffnen. Öffne GroupShelf selbst und führe den Befehl erneut aus.

groupshelf: GroupShelf did not start within 15 seconds

GroupShelf wurde im Hintergrund geöffnet, war aber nicht rechtzeitig bereit. Führe den Befehl erneut aus.

groupshelf: GroupShelf did not answer in time; if macOS asked whether your terminal app may control GroupShelf, answer that and try again

Meist wartet macOS noch auf deine Antwort auf die Berechtigungsanfrage. Beantworte sie und führe den Befehl erneut aus.

groupshelf: not allowed to control GroupShelf; allow your terminal app in System Settings › Privacy & Security › Automation

Deine Terminal-App darf GroupShelf nicht steuern. Aktiviere unter Systemeinstellungen › Datenschutz & Sicherheit › Automation GroupShelf bei deiner Terminal-App.

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

Im Terminal von VS Code folgt diese Zeile auf die obige. Siehe Visual Studio Code unter „Berechtigungen“.

groupshelf: this version of GroupShelf doesn't support groupshelf; update GroupShelf

Das GroupShelf, das der Befehl erreicht hat, ist älter als der Befehl, etwa eine alte Kopie an anderer Stelle auf deinem Mac. Aktualisiere GroupShelf auf 1.3.0 oder neuer und entferne alte Kopien.

groupshelf: could not reach GroupShelf (error <number>)

macOS konnte die Anfrage aus einem anderen Grund nicht zustellen; die Zahl ist der Fehlercode. Beende GroupShelf, öffne es erneut und versuche es noch einmal. Tritt der Fehler weiter auf, wende dich mit der Zahl an den Support.

Einstellungen und Zustand von GroupShelf · Exit-Status 1

groupshelf: control from the command line is off; turn on "Allow control from the command line and scripts" in GroupShelf Settings › Command Line

Aktiviere den Schalter unter Einstellungen › Befehlszeile, wie unter „Aktivieren“ beschrieben.

groupshelf: GroupShelf needs Accessibility access; allow it in System Settings › Privacy & Security › Accessibility

Ohne diese Berechtigung kann GroupShelf keine Fenster bewegen. Aktiviere GroupShelf unter Systemeinstellungen › Datenschutz & Sicherheit › Bedienungshilfen.

groupshelf: GroupShelf is paused while Stage Manager is on

GroupShelf kann nicht zusammen mit Stage Manager laufen. Deaktiviere Stage Manager in den Systemeinstellungen und starte GroupShelf neu.

groupshelf: GroupShelf hasn't finished starting; try again

Führe den Befehl gleich noch einmal aus.

groupshelf: another group request is still running

GroupShelf bearbeitet eine Anfrage nach der anderen, und group und add können bis zu 30 Sekunden auf Fenster warten. Führe den Befehl erneut aus, wenn die andere Anfrage fertig ist.

groupshelf: "Slack" is excluded from grouping in GroupShelf settings

Die App steht unter Einstellungen › Gruppierung in „Ausgeschlossene Apps“. Entferne sie dort, um ihre Fenster zu gruppieren.

Fenster angeben · Exit-Status 1

groupshelf: "Safari" isn't running; open it first — groupshelf only works with windows already open

Öffne die App zuerst. group und add warten dann bis zu 30 Sekunden auf ihr Fenster.

groupshelf: no application named "Safary"

Prüfe die Schreibweise. Eine App, die nicht läuft und nicht in einem Ordner „Apps“ liegt, lässt sich nur über ihre Bundle-ID oder ihren Pfad angeben.

groupshelf: "/Applications/Utilities" is not an application

Der Pfad führt nicht zu einer App. Lass ihn auf die .app selbst zeigen.

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

Die Titel mehrerer Fenster enthalten den Text. Grenze ihn auf eine der in der Meldung genannten Arten ein.

groupshelf: no window 4211 on this desktop; groupshelf list shows the windows there

Das Fenster wurde geschlossen oder ist auf einem anderen Schreibtisch oder im Vollbildmodus. Führe groupshelf list aus, um die aktuellen IDs zu sehen.

groupshelf: no window for "Slack" on this desktop

detach, ungroup und ein <member> richten sich nach den Fenstern, die schon auf diesem Schreibtisch sind, ohne zu warten. Prüfe, ob das Fenster hier geöffnet ist.

groupshelf: "4211" names a window another argument already names

Zwei Argumente verweisen auf dasselbe Fenster. Entferne eines davon.

groupshelf: GroupShelf can't group its own windows

Lass GroupShelf im Befehl weg.

Gruppen angeben · Exit-Status 1

groupshelf: no group named "Work"

Keine Gruppe hat diesen Namen. groupshelf list zeigt im fünften Feld den Gruppennamen jedes Fensters.

groupshelf: --group "Work" fits 2 groups; name the group by one of its windows instead

Mehrere Gruppen haben diesen Namen. Gib die Gruppe stattdessen über eines ihrer Fenster an, als <member>.

groupshelf: the group of "Work" isn't on this desktop

add fügt nur zu einer Gruppe auf diesem Schreibtisch hinzu. Wechsle zum Schreibtisch der Gruppe und führe den Befehl dort aus.

groupshelf: "Safari" isn't in a group; groupshelf group makes one

Das als <member> angegebene Fenster ist in keiner Gruppe. Erstelle eine mit group.

Teilergebnisse · Exit-Status 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

Alles vor dem ersten Semikolon wurde erledigt. Die danach aufgeführten Fenster fehlen: Keines davon ist innerhalb von 30 Sekunden auf diesem Schreibtisch erschienen.

groupshelf: no group created: only 1 window to group; no window for "Mail" on this desktop within 30 seconds

Es fanden sich weniger als zwei Fenster, daher wurde nichts geändert.

groupshelf: grouped 2 windows; "Mail" could not be added to the group

Die Gruppe des Fensters oder die Gruppe, der es beitreten soll, ist gesperrt. Klicke mit der rechten Maustaste auf die Tableiste der gesperrten Gruppe, wähle „Gruppe entsperren“ und führe den Befehl erneut aus.

Aufruffehler · Exit-Status 2

groupshelf: unknown option '--names'
Usage: groupshelf group [--name <name>] [--all | --frontmost] <window> <window>...
Run 'groupshelf help group' for more.

Die Befehlszeile selbst ist falsch: Die erste Zeile nennt den Fehler, danach folgt die Verwendung des Befehls. An GroupShelf wurde nichts gesendet.

← Zurück zur Startseite