Tmux oublie le répertoire où la session a été créée

8

Lorsque je crée plusieurs sessions dans tmux, le répertoire actuel de chaque nouvelle fenêtre des sessions suivantes est défini comme le répertoire actuel de la première.

Par exemple:

-> cd /home/one && tmux new-session -n one\; new-window -n two
   # /home/one is the current directory for each window

-> cd /home/two && tmux new-session -n three\; new-window -n four #\; etc.
   # "/home/two" is the current directory for the window "three"
   # but for the window "four" and other created windows it is "/home/one"

Comment puis-je forcer tmux à définir le répertoire actuel pour chaque nouvelle fenêtre dans les sessions suivantes comme le répertoire où la session a été créée?

tmux 1.6

zsh 4.3

Shamaoke
la source

Réponses:

21

Depuis tmux 1.9, l'option de chemin par défaut a été supprimée .

Vous pouvez utiliser ce qui suit pour ouvrir dans le répertoire dans lequel la session s'est ouverte (le «client» dans le nom m'indiquerait qu'il s'agit du runnin tmux actuel dans votre shell, mais il semble changer de chemin lors du basculement entre les sessions dans le même client):

bind-key c  new-window -c "#{client_cwd}"

Sinon, pour copier le chemin du volet actuel:

bind-key c  new-window -c "#{pane_current_path}"

Il existe également pane_start_path qui pourrait faire appel à certains flux de travail.

bind-key c  new-window -c "#{pane_start_path}"

Pour les commandes de fenêtre fractionnée.

bind-key % split-window -h -c "#{pane_current_path}"
bind-key '"' split-window -c "#{pane_current_path}"
David C. Bishop
la source
1
CECI est la bonne réponse. Plus précisément la 2e option dans mon cas.
Mike Rapadas
en passant, n'oubliez pas de fermer tous les terminaux tmux en cours de fonctionnement, y compris l'arrière-plan avant de modifier votre fichier de configuration, sinon tmux ne chargera pas de nouvelles configurations.
randomness2077
@lightmanhk Vous devriez pouvoir juste: la source ~ / .tmux.conf
David C. Bishop
1
Est-il possible de généraliser cela pour les divisions de volet? split-window -h "#{pane_current_path}"ne fonctionnera pas ...
Bach
1
@Bach Essayez avec un -c. split-window -h -c "#{pane_current_path}"
David C. Bishop
3

Je me rends compte que cette question est assez ancienne, mais elle est apparue comme l'une des seules questions sur StackExchange lorsque je cherchais moi-même la réponse, alors voici comment je l'ai résolue pour tmux 1.8.

La new-windowcommande prend un -cdrapeau qui vous permettra de spécifier le répertoire courant de la nouvelle fenêtre. Par défaut, il s'agit d'une chaîne vide, qui va utiliser le répertoire de travail des volets actuels comme répertoire pour la nouvelle fenêtre. La saisie de a -comme valeur pour l' -cindicateur définira le répertoire de la nouvelle fenêtre dans lequel la session a été ouverte.

Voici un extrait de la documentation:

-c specifies the working directory in which the new window is created.  It may 
have an absolute path or one of the following values (or a subdirectory):

       Empty string    Current pane's directory
       ~               User's home directory
       -               Where session was started
       .               Where server was started

Si vous souhaitez modifier le comportement par défaut de la <PREFIX> cliaison de touches pour refléter cela, voici ce que j'ai fait dans mon ~/.tmux.conf:

bind-key c   new-window -c -
nicklamuro
la source
0

il y a pas mal de réponses ici: /unix/12032/create-new-window-with-current-directory-in-tmux

En résumé:

de la FAQ tmux, une manière obtuse (mais très générale et assez indépendante du shell):

  • Comment puis-je ouvrir une nouvelle fenêtre dans le même répertoire que la fenêtre actuelle?

Une option consiste à exécuter simplement "TMUX = tmux" dans la fenêtre. Cependant, cela ne fonctionne que si aucune commande n'est en cours d'exécution, afin que vous puissiez entrer la commande.

Une solution de contournement consiste à informer tmux du chemin actuel via une variable d'environnement. Pour ce faire, utilisez la commande suivante:

[ -n "$TMUX" ] && tmux setenv TMUXPWD_$(tmux display -p "#I") $PWD

Ce qui définit TMUXPWD_i (où i est le numéro de la fenêtre courante) sur le chemin du répertoire courant. Cette commande peut être ajoutée à PS1, par exemple:

PS1='$([ -n "$TMUX" ] && tmux setenv TMUXPWD_$(tmux display -p "#I") $PWD)\h$ '

Lorsqu'une nouvelle fenêtre est créée, le shell doit être invité à changer de répertoire. Vous pouvez définir une nouvelle liaison (par exemple, si vous utilisez GNU bash):

bind-key C-c run-shell 'tmux neww "cd $(tmux display -p "\$TMUXPWD_#I"); exec bash"'

Cette solution fonctionnera même si une commande est en cours d'exécution dans le terminal, mais elle ne fonctionnera pas à partir d'une fenêtre qui vient d'être échangée avec une autre car TMUXPWD_i ne sera pas mis à jour après un échange. Cependant, une fois qu'une nouvelle invite s'affiche, TMUXPWD_i est mis à jour correctement.

remplacez simplement les appels au shell selon vos besoins.

aussi, les versions apparemment plus récentes de tmux ont ce problème avec une commande

tmux nouvelle fenêtre

les anciennes versions fonctionneraient ainsi:

appel

tmux neww

à partir de votre shell ouvrira tmux dans ce répertoire.

si vous souhaitez pouvoir ouvrir de nouvelles fenêtres ou volets à partir du répertoire de travail actuel dans tmux, vous devez plutôt:

tmux set-option default-path "$ PWD"

morse
la source
Merci d'avoir essayé d'aider, morse . J'ai vu cette question sur unix.stackexchange et j'ai lu la FAQ. Cependant, ce ne sont pas les réponses à ma question.
Shamaoke
1
Regardez, lorsque vous créez une nouvelle session, le répertoire en cours pour chaque nouvelle fenêtre ou volet que vous ouvrez dans cette session sera le répertoire dans lequel vous démarrez la session . Cela est vrai si je crée une seule session. Cependant, lorsque j'ouvre une nouvelle fenêtre de terminal et que j'y démarre une autre session, le répertoire de travail actuel pour chaque nouvelle fenêtre sera le répertoire dans lequel je démarre la première session mais pas la session actuelle. Il s'agit apparemment d'un bogue dans tmux 1.6 car lorsque je l'ai rétrogradé à la version 1.3, le bogue n'apparaissait pas.
Shamaoke