Öffnen Sie eine neue Registerkarte im selben Verzeichnis

41

Angenommen, Sie befinden sich im Ordner / very / cool / und / deeply / nested /. Und Sie möchten eine neue Terminal-Registerkarte im selben Ordner öffnen.

Wie würdest du das machen?

Ich benutze Mac OS und Zsh.

Nerian
quelle

Antworten:

62

Verwenden Sie Oh-My-Zsh und fügen Sie das 'osx'-Plugin in Ihre ~ / .zshrc-Datei wie folgt ein:

plugins=(osx)

Wenn Sie die Terminal-App von OSX verwenden, müssen Sie auch das terminalappPlugin hinzufügen : credit

plugins=(osx terminalapp)

Wenn Sie iTerm verwenden, müssen Sie eine Konfigurationsoption festlegen ( Beachten Sie, dass Sie möglicherweise die zsh-Plugins nicht benötigen, damit dies funktioniert ): credit

Voreinstellungen> Profile> Standard> Allgemein> Arbeitsverzeichnis> Verzeichnisoption der vorherigen Sitzung wiederverwenden

iTerm2 Preferences Panel Update zur Wiederverwendung des vorherigen Sitzungsverzeichnisses.

Das ist alles was Sie tun müssen!

Pieter
quelle
1
Funktioniert das auch in iTerm?
Ahmy
1
@ahmy sieht aus wie es sollte: github.com/robbyrussell/oh-my-zsh/blob/master/plugins/osx/…
philfreo
2
Dies funktioniert für mich, es sei denn, ich führe einen Prozess in der Konsole aus. Wenn ein Prozess railsausgeführt wird und ich versuche, über Befehl-n ein neues Fenster zu öffnen, kehre ich in mein Ausgangsverzeichnis zurück.
YWCA Hallo
@YWCAHallo hast du eine Lösung für dieses Problem gefunden?
Michał Miszczyszyn
@ Miszy Ich zog zurück zu Vanille Bash: /
YWCA Hallo
23

Eine weitere Option, die jetzt in Mac OS X Lion verfügbar ist, ist die Verwendung der integrierten Funktion. Es verwendet 'Escape-Sequenzen', um das aktuelle Verzeichnis herauszufinden. Bei mir funktioniert es, wenn ich diese Befehle in meinem .zshrc verwende:

precmd () {print -Pn "\e]2; %~/ \a"}
preexec () {print -Pn "\e]2; %~/ \a"}

es ist auch möglich PS1(für Bash, aus diesem Wiki ):

export PS1="\[\e]2;\u@\H \w\a\e[32;1m\]>\[\e[0m\] "

wo \e]2;ist die Escape-Sequenz, um Dinge in der Titelleiste zu drucken. Es scheint, dass Terminal.app seine Informationen von dort erhält.

Mehr Informationen:

Tim
quelle
Ich denke auch, oh-my-zsh hat dies standardmäßig. Ich benutze das jetzt seit ungefähr einer Woche und es funktioniert so ziemlich sofort.
Tim
Ab Mac OS X Lion 10.7 zeigt Terminal das Arbeitsverzeichnis über das Proxy-Symbol in der Titelleiste an, bietet Optionen zum Erstellen neuer Terminals im selben Verzeichnis und unterstützt das Wiederaufnehmen von Terminals. Zur Vereinfachung überprüft das Terminal den Inhalt der Fenster- / Registerkartentitel, um festzustellen, ob sie einen gültigen Pfadnamen enthalten. /etc/bashrcSie werden jedoch feststellen, dass es auch einen neuen Escape-Code unterstützt, mit dem Terminal über eine file:URL über das Arbeitsverzeichnis informiert wird. Diese URL kann alle gültigen Pfadnamen über die Prozentcodierung verarbeiten (die Fenster- / Tabulatortitel dürfen nur eine Teilmenge von ASCII-Zeichen enthalten ).
Chris Seite
2
Die Escape-Sequenz für das Festlegen des Arbeitsverzeichnisses ist derselbe Grundcode wie für das Festlegen der Titel - Operating System Command (OSC) - mit Code 7 anstelle von 0-2:\e]7;file://hostname/percent-encoded-pathname\a
Chris Page
3
Warum precmd und preexec verwenden? Warum nicht einfach chpwd () {print -Pn "\e]2; %~/ \a"}?
Nick
1
Ich verstehe, wie dies die Titelleiste aktualisiert, aber ich verstehe nicht, wie dies dazu führt, dass eine neue Registerkarte im selben Verzeichnis wie die vorherige Registerkarte geöffnet wird.
Mareoraft
3

Dies ist eine sehr einfache Version, die ich in bash verwendet habe und die auch in zsh funktioniert. Der aktuelle Ordner wird nach jedem Befehl in einer Datei gespeichert (IMO schadet nicht zu sehr) und ein neues Terminal wird im gespeicherten aktuellen Ordner geöffnet.

Fügen Sie .zshrc Folgendes hinzu

# emulate bash PROMPT_COMMAND (only for zsh)
precmd() { eval "$PROMPT_COMMAND" }
# open new terminal in same dir
PROMPT_COMMAND='pwd > "${HOME}/.cwd"'
[[ -f "${HOME}/.cwd" ]] && cd "$(< ${HOME}/.cwd)"
mjspier
quelle
Dies ist cool, erfordert jedoch, dass Sie tatsächlich einen Befehl in einer Registerkarte ausführen, um die Aktualisierung durchzuführen. Dies kann in seltenen Fällen zu unerwartetem Verhalten führen. Vielleicht können wir eine andere Funktion verwenden, die ausgelöst wird, wenn Sie die Tabulatoren wechseln, anstatt einen Befehl auszuführen?
Mareoraft
1

gdirs scheint eine Möglichkeit zu sein, es fast zu tun: Neuer Tab, dann gdirs, um das tiefe Verzeichnis und voila auszuwählen. Meine erste Idee war, den Verzeichnisstapel für alle Tabs freizugeben und nach dem neuen Tab cd ~ 1 zu machen, aber ich kann nicht herausfinden, wie das geht, da anscheinend jede Instanz von zsh ihre eigene behält. Das Teilen des Verlaufs erfolgt über eine gemeinsame Datei. Vielleicht kann dies auch hier durchgeführt werden.

Henno
quelle
0

So machst du es in bash.

Dieses Shell-Skript teilt Terminal.app mit (im wörtlichen Sinne mit Applescript), um eine neue Registerkarte zu öffnen, und wechselt dann in das aktuelle Verzeichnis:

#!/bin/bash
osascript -e 'tell application "Terminal"' \
-e 'tell application "System Events" to tell process "Terminal" to keystroke "t" using command down' \
-e "do script with command \"cd `pwd`;clear\" in selected tab of the front window" \
-e 'end tell' &> /dev/null

… Legen Sie das obige Shell-Skript in ein Verzeichnis in Ihrem $PATH(zB / usr / local / bin) und stellen Sie sicher, dass es ausführbar ist:

$ chmod +x /usr/local/bin/nt

( Quelle )

Nifle
quelle
Beachten Sie, dass das Terminal ab Mac OS X Lion 10.7 standardmäßig neue Registerkarten im selben Arbeitsverzeichnis wie die vorherige Registerkarte startet. Sie müssen sich also nur noch anordnen, um die Registerkarte zu erstellen. (Wenn Sie bash verwenden. Wenn Sie eine andere Shell verwenden, lesen Sie den Code in / etc / bashrc, um zu erfahren, wie Sie Terminal über das aktuelle Arbeitsverzeichnis informieren können.)
Chris Page
0

Wenn Sie diese neue Registerkarte sofort öffnen müssen, ohne Ihre Konfigurationsdateien zu ändern oder neue Plugins zu installieren, führen Sie Folgendes aus:

pwd | pbcopy

Öffnen Sie dann manuell eine neue Registerkarte Terminal (mit ⌘T) und in der neuen Registerkarte:

cd "`pbpaste`"

Warnung : Dadurch wird der Inhalt der Systemzwischenablage überschrieben.


Eine alternative, längere Methode, die die Zwischenablage nicht überschreibt:

pwd > $TMPDIR/wd

Öffnen Sie Ihren neuen Tab.

cd "$(cat $TMPDIR/wd)"
rm -f $TMPDIR/wd
Rory O'Kane
quelle
0

Nach dem obigen Kommentar von Pieter plugins=(git osx)können Sie nach der Installation der Plugins einfach eingeben tabund es wird ein neuer Tab in Ihrem aktuellen Verzeichnis geöffnet.

Fall
quelle
0

Wenn das Verzeichnis beim Öffnen einer neuen Registerkarte automatisch geändert werden soll, verwenden Sie das Verzeichnis- Plugin.

Das osx-Plugin speichert nur das letzte Verzeichnis, aber Sie müssen den Befehl ausführen tab, um eine neue Registerkarte zu öffnen, was nicht immer möglich ist (wenn Sie beispielsweise etwas in Ihrer aktuellen Registerkarte ausführen).

garageàtrois
quelle
0

Das Hinzufügen von terminalapp zu .zshrc hat bei mir nicht funktioniert, also habe ich nach dem Plugin gesucht ~/.oh-my-zsh/plugins/terminalappund es sagt mir:

# This file is intentionally empty.
#
# The terminalapp plugin is deprecated and may be removed in a future release.
# Its functionality has been folded in to the core lib/termsupport.zsh, which
# is loaded for all users. You can remove terminalapp from your $plugins list
# once all your systems are updated to the current version of Oh My Zsh.
Steve Root
quelle
0

Im selben Ordner werden bereits neue Registerkarten geöffnet (Cmd + T). Für neue Fenster (Cmd + N) ist die Lösung von Pieter richtig:

Voreinstellungen> Profile> Standard> Allgemein> Arbeitsverzeichnis> Verzeichnisoption der vorherigen Sitzung wiederverwenden

Punnerud
quelle