Ouvrir un nouvel onglet dans le même répertoire

41

Supposons que vous êtes dans le dossier / very / cool / et / profondément / imbriqué /. Et vous voulez ouvrir un nouvel onglet de terminal dans le même dossier.

Comment feriez-vous cela?

J'utilise Mac OS et Zsh.

Nerian
la source

Réponses:

62

Utilisez Oh-My-Zsh et ajoutez le plugin 'osx' dans votre ~ / .zshrc comme:

plugins=(osx)

Si vous utilisez l'application Terminal OSX d'OSX, vous devez également ajouter le terminalappplugin: credit

plugins=(osx terminalapp)

Si vous utilisez iTerm, vous devez définir une option de configuration ( notez que vous n’avez peut-être pas besoin des plugins zsh pour que cela fonctionne ): credit

Préférences> Profils> Par défaut> Général> Répertoire de travail> Réutiliser l'option de répertoire de la session précédente

Le panneau Préférences iTerm2 se met à jour pour réutiliser le répertoire de session précédent.

C'est tout ce que vous devez faire!

Pieter
la source
1
cela fonctionne-t-il également dans iTerm?
Ahmy
1
@ahmy a l'air d'être comme il se doit: github.com/robbyrussell/oh-my-zsh/blob/master/plugins/osx/…
philfreo
2
Cela fonctionne pour moi sauf si j'exécute un processus dans la console. Si j'ai un processus, par exemple en railscours d'exécution, et que j'essaie d'ouvrir une nouvelle fenêtre via commande-n, je me retrouve dans mon répertoire personnel.
YWCA Bonjour
@YWCAHello avez-vous trouvé une solution à ce problème?
Michał Miszczyszyn
@Miszy je suis revenu à la vanille Bash: /
YWCA Bonjour
23

Une autre option maintenant disponible dans Mac OS X Lion utilise la fonctionnalité intégrée. Il utilise des "séquences d'échappement" pour trouver le répertoire actuel. Pour moi, cela fonctionne si j'utilise ces commandes dans mon .zshrc:

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

il est également possible d'utiliser PS1(pour Bash, à partir de ce wiki ):

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

\e]2;est la séquence d'échappement pour imprimer des choses dans la barre de titre. Il semble que Terminal.app tire ses informations de là.

Plus d'information:

Tim
la source
aussi, je pense que oh-my-zsh a cela par défaut. Je l'utilise depuis environ une semaine maintenant et cela fonctionne quasiment hors de la boîte.
Tim
À partir de Mac OS X Lion 10.7, Terminal affiche le répertoire de travail à l’aide de l’icône «proxy» dans la barre de titre. Il comporte des options permettant de créer de nouveaux terminaux dans le même répertoire et prend en charge les terminaux de reprise. Pour plus de commodité, Terminal examinera le contenu des titres de fenêtre / onglet pour voir s’ils contiennent un chemin valide. Cependant, /etc/bashrcvous verrez qu'il prend également en charge un nouveau code d'échappement pour informer le terminal du répertoire de travail à l'aide d'une file:URL, qui peut gérer tous les noms de chemin valides via un codage en pourcentage (les titres de fenêtre / onglet ne peuvent contenir qu'un sous-ensemble de caractères ASCII )
Chris Page
2
La séquence d'échappement permettant de définir le répertoire de travail correspond au même code de base que celui permettant de définir les titres - Commande du système d'exploitation (OSC) - avec le code 7 au lieu de 0-2:\e]7;file://hostname/percent-encoded-pathname\a
Chris Page
3
Pourquoi utiliser precmd et preexec? Pourquoi pas juste chpwd () {print -Pn "\e]2; %~/ \a"}?
Nick
1
Je comprends comment cela met à jour la barre de titre, mais je ne comprends pas comment cela provoque l’ouverture d’un nouvel onglet dans le même répertoire que l’ancien.
mareoraft
3

C'est une version très simple que j'ai utilisée dans bash et qui fonctionne également en zsh. Il enregistre le dossier actuel dans un fichier, après chaque commande (ne fait pas trop de mal à OMI) et ouvre un nouveau terminal dans le dossier actuel enregistré.

ajoutez ce qui suit à .zshrc

# 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
la source
C'est cool, mais vous devez exécuter une commande dans un onglet pour la mise à jour. Cela peut dans de rares cas provoquer un comportement inattendu. Peut-être que nous pouvons utiliser une fonction différente qui est déclenchée lorsque vous changez d'onglet au lieu d'exécuter une commande?
mareoraft
1

gdirs semble presque un moyen de le faire: nouvel onglet, puis gdirs pour sélectionner le répertoire deep et le tour est joué. Ma première idée était de faire en sorte que la pile de répertoires soit partagée entre tous les onglets et de faire cd ~ 1 après le nouvel onglet, mais je ne trouve pas comment le faire, car il semblerait que chaque instance de zsh conserve le sien. Le partage d'historique s'effectue via un fichier commun, alors peut-être que cela pourrait être fait ici aussi ...

Henno
la source
0

Voici comment vous le faites en bash.

Ce script shell indiquera (en silence, littéralement, en utilisant Applescript) Terminal.app pour ouvrir un nouvel onglet, puis basculer vers le répertoire actuel:

#!/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

… Placez le script shell ci-dessus dans un répertoire de votre $PATH(par exemple, / usr / local / bin) et assurez-vous qu'il est exécutable:

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

( source )

Fusil
la source
Notez qu'à partir de Mac OS X Lion 10.7, par défaut, Terminal ouvrira de nouveaux onglets dans le même répertoire de travail que l'onglet précédent. Il vous suffit donc de vous arranger pour créer l'onglet maintenant. (Si vous utilisez bash. Si vous utilisez un autre shell, examinez le code dans / etc / bashrc pour savoir comment indiquer à Terminal le répertoire de travail actuel.)
Chris Page
0

Si vous devez ouvrir ce nouvel onglet maintenant, sans changer vos fichiers de configuration ni installer de nouveaux plugins, lancez ceci:

pwd | pbcopy

Puis ouvrez un nouvel onglet Terminal manuellement (avec ⌘T), et dans le nouvel onglet:

cd "`pbpaste`"

Attention : cela écrasera le contenu du presse-papiers du système.


Une méthode alternative plus longue qui n'écrase pas le presse-papiers:

pwd > $TMPDIR/wd

Ouvrez votre nouvel onglet.

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

Selon le commentaire de Pieter ci-dessus, une fois les plugins=(git osx)plugins installés, il vous suffit de taper tabpour ouvrir un nouvel onglet dans votre répertoire actuel.

Cas
la source
0

Si vous voulez que le répertoire change automatiquement quand un nouvel onglet est ouvert, utilisez le plugin dirpersist .

Le plug-in osx ne sauvegarde que le dernier répertoire, mais vous devez exécuter la commande tabpour ouvrir un nouvel onglet, ce qui n'est pas toujours possible (si, par exemple, vous utilisez quelque chose dans votre onglet actuel).

garageàtrois
la source
0

L'ajout de terminalapp à .zshrc ne fonctionnait pas pour moi alors j'ai cherché le plugin ~/.oh-my-zsh/plugins/terminalappet il m'a dit:

# 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
la source
0

De nouveaux onglets s'ouvrent déjà dans le même dossier (Cmd + T). Pour les nouvelles fenêtres (Cmd + N), la solution de Pieter est la bonne:

Préférences> Profils> Par défaut> Général> Répertoire de travail> Réutiliser l'option de répertoire de la session précédente

Punnerud
la source