Generische Exit-Funktion für iTerm2

Ich habe vor kurzem begonnen, iTerm2 anstelle der macOS-Terminalanwendung zu verwenden, und ich bin wirklich zufrieden damit. Ich bin sehr daran gewöhnt, den exitBefehl to zu verwenden, um die Instanz zu schließen , die derzeit den Fokus hat. Mit Instanz meine ich eines der folgenden: Tab, Window oder Split Panel.

Wie kann ich einen Funktionsausgang schreiben, der die gerade laufende Instanz schließt? Die folgende Problemumgehung funktioniert für Fenster, aber weder für Registerkarten noch für geteilte Bedienfelder:

function exit {
    osascript -e 'tell application "iTerm2" to close first window'
}

zshDie Lösung sollte entweder mit oder funktionieren bash.

exitist eine eingebaute Shell (Befehl). Es ist keine gute Idee, eine Funktion mit demselben Namen zu haben.
Dieses Problem ist nicht sehr klar. Wenn ich mehrere Instanzen von iTerm habe, schließt die Eingabe von exit nur diese Instanz (nur zur Überprüfung getestet).
@Allan Entschuldigung für die Verwirrung: Mit Instanz meine ich eines der folgenden: Tab, Window oder Split Panel. Das heißt, ich meine Folgendes: Wenn ich ein iTerm2-Fenster habe, das zwei Registerkarten enthält, möchte ich die fokussierte schließen, indem ich tippe exit. Wenn diese erste Registerkarte geschlossen wird, exitschließt sich das gesamte Fenster (das ist der Teil, der bereits funktioniert).
Wenn dieser erste Tab geschlossen ist, schließt exit das gesamte Fenster . Das ist der Teil, der verwirrend ist. Wenn Ihr erster Tab geschlossen ist, haben Sie kein iTerm2-Fenster mehr, das aus zwei Tabs besteht. Sie haben ein Fenster, das aus einer Registerkarte besteht. Der Ausgang schließt das einzige, was übrig bleibt.
@Allan Nochmals Entschuldigung für die Verwirrung. Genau das möchte ich erreichen, da es das Standardverhalten jedes mir bekannten Linux-Terminals nachahmt.
Ok ... ich lese das also so, dass Sie möchten, dass die Exit- Funktion anders funktioniert, wenn es> 1 Fenster / Registerkarte / Bereich gibt. Ich sehe das nicht als möglich an.
Ja genau. Danke soweit. Mit der Terminal-App funktioniert es .
Ich denke, es gibt eine Verwirrung zwischen dem Beenden einer Sitzung und dem Schließen eines Fensters. Ich bin bereit, das in Terminal zu sein, wenn Sie eingeben exit, wird die Sitzung geschlossen , aber das Fenster/die Registerkarte/der Bereich bleibt geöffnet. Richtig?

Antworten (3)

In Terminal ist die Standardeinstellung für den Umgang mit geschlossenen Sitzungen, das Fenster geöffnet zu lassen.

In Einstellungen > Profile:

Geben Sie hier die Bildbeschreibung ein

In iTerm2 wird das Fenster standardmäßig geschlossen

Geben Sie hier die Bildbeschreibung ein

Wenn Sie diese Option in iTerm2 deaktivieren, sollte es Ihnen das gewünschte Verhalten geben.

Der Abschnitt Scripting der iTerm2-Dokumentation hat mir geholfen, mein Problem zu beheben.

In .zshrchabe ich folgende Funktion definiert:

function exit {
    osascript ~/.zsh/.function_exit.as
}

Mit ~/.zsh/.function_exit.asals

tell application "iTerm2"
    tell current window to close current session
end tell

Zusätzlich habe ich in den iTerm2-Einstellungen folgende Option gesetzt:

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Wenn ich alle oben genannten Dinge zusammen verwende, erreiche ich das folgende Verhalten:

Geben Sie hier die Bildbeschreibung ein

Da dies nicht von der verwendeten Shell abhängt, sollte alles perfekt funktionieren, wenn Sie bash(und die entsprechende dot-Datei) verwenden.

Mit Ausnahme des Funktionsnamens ist dies eine gute Lösung. exitist ein eingebauter Befehl , und das Erstellen einer Funktion mit einem reservierten Namen kann zu nachteiligen Ergebnissen führen.

in deinem .profil könntest du hinzufügen

alias killiTerm2='killall iTerm2'

Vom Terminal aus würden Sie einfach killiTerm2 aufrufen, und es würde jede laufende Instanz von iTerm2 beenden

Dies löst in keiner Weise mein Problem, da ich nicht die gesamte Anwendung schließen möchte.