Comment créer une nouvelle fenêtre sur le répertoire en cours dans tmux?

209

Il est possible d'ouvrir a new-windowavec son répertoire de travail défini sur celui dans lequel je suis actuellement. J'utilise zsh , si cela compte.

Shrikant Sharat
la source

Réponses:

140

A partir de tmux 1.9 l' default-pathoption a été supprimée, de sorte que vous devez utiliser l' -coption en new-window, et split-window(par exemple reconsolidation la c, "et les %liaisons à inclure
-c '#{pane_current_path}'). Voir d'autres réponses à cette question pour plus de détails.


Une fonctionnalité pertinente a atterri dans la jonction SVN de tmux au début du mois de février 2012. Dans les versions tmux incluant ce code, les liaisons de clé tmux appelantesnew-window créeront une nouvelle fenêtre avec le même répertoire de travail actuel que les processus actifs du volet actuel (tant que la default-pathsession est active). l’option est vide, c’est par défaut). Il en va de même pour le volet créé par la split-windowcommande lorsqu'il est appelé via une liaison.

Ceci utilise un code spécifique à la plate-forme, de sorte que seuls certains systèmes d'exploitation sont actuellement pris en charge: Darwin (OS X), FreeBSD, Linux, OpenBSD et Solaris.

Cela devrait être disponible dans la prochaine version de tmux (1.7?).


Avec tmux 1.4, je n’utilise généralement que

tmux neww

dans un shell qui a déjà le répertoire de travail actuel souhaité.

Si, toutefois, je prévois avoir besoin de créer plusieurs fenêtres avec le même répertoire de travail actuel (ou si je veux pouvoir les démarrer avec la cliaison de clé <préfixe> habituelle ), alors je mets l' default-pathoption de session via

tmux set-option default-path "$PWD"

dans un shell qui a déjà le répertoire de travail actuel souhaité (bien que vous puissiez évidemment le faire depuis n'importe quel répertoire et spécifier simplement la valeur à la place).

Si default-pathest défini sur une valeur non vide, sa valeur sera utilisée au lieu d’hériter du répertoire de travail en cours à partir des appels de ligne de commande de tmux neww.

La FAQ de tmux a une entrée intitulée «Comment puis-je ouvrir une nouvelle fenêtre dans le même répertoire que la fenêtre actuelle?» Qui décrit une autre approche; c'est un peu compliqué cependant.

Chris Johnsen
la source
6
Existe-t-il un moyen de mapper la <prefix>clecture du répertoire de travail de l’instance de shell sous-jacente (le cas échéant) et de la définir default-pathavant l’exécution new-window. Ou est-ce trop demander à tmux :)
Shrikant Sharat
Sur une autre note, est-il même possible de lire le répertoire de travail du shell sous-jacent? Je tuerais pour l'afficher dans ma barre d'état.
Shrikant Sharat
2
Il n'y a pas de moyen portable d'extraire le cwd d'un autre processus (bien que cela soit possible sur certaines plateformes (par exemple /proc/PID/cwdsur Linux)). Il existe une solution partielle dans une entrée de la FAQ de tmux (le shell enregistre son cwd lorsqu’il imprime une invite, puis lie une clé qui démarre un nouveau shell dans le répertoire enregistré).
Chris Johnsen
ok, ceci est un peu en dehors de ma connaissance et ne me semble pas très fiable. Quelque chose me dit que je serais peut-être mieux sans tout cela… merci quand même.
Shrikant Sharat
1
@paradroid: Tout ce qui est fait via une liaison utilisera (par défaut) le cwd du serveur tmux ou la valeur de l' default-pathoption de session (si celle-ci est définie). La FAQ de tmux contient une entrée décrivant un moyen de lier une clé qui ouvre une nouvelle fenêtre avec le cwd du shell exécuté dans la fenêtre actuelle ("Comment puis-je ouvrir une nouvelle fenêtre dans le même répertoire que la fenêtre actuelle?") , mais la méthode est assez compliquée. La même chose pourrait probablement être faite pour split-windowet new-session(au lieu de neww).
Chris Johnsen
268

La page de manuel actuelle (1.9a) de Tmux répertorie un -c start-directoryparamètre facultatif pour certaines commandes, notamment new-windowet split-window. Il contient également la variable de format pane_current_path, qui fait référence à Current path if available.

En les combinant, nous pouvons ouvrir une nouvelle fenêtre avec le répertoire de travail actuel à l'aide de
new-window -c "#{pane_current_path}"
La citation est nécessaire dans le cas où le chemin actuel contient des espaces.

Si vous souhaitez diviser le volet actuel verticalement, utilisez
split-window -c "#{pane_current_path}"
ou, pour une division horizontale
split-window -h -c "#{pane_current_path}"

Pour que les raccourcis clavier ouvrent de nouvelles divisions et fenêtres avec le répertoire de travail actuel par défaut, ajoutez ce qui suit à votre .tmux.conf. Les "guillemets environnants indiquent à Tmux qu'il ne devrait pas commencer une chaîne, mais plutôt lier la "clé.

bind '"' split-window -c "#{pane_current_path}"
bind % split-window -h -c "#{pane_current_path}"
bind c new-window -c "#{pane_current_path}"
Simon Kohlmeyer
la source
1
Est-ce que cela ne fonctionne pas sur tmux 1.9? Je ne peux pas le faire faire la chose attendue.
Erik Garrison
1
bind-key -r Entrez dans new-window -c "# {chemin_courbe_courbe}", fonctionne pour tmux 2.1
Marslo
5
Fonctionne dans tmux 2.3 sur OSX. N'oubliez pas d'arrêter / de tuer toutes les sessions existantes pour voir ces liaisons appliquées.
Jmgarnier
1
@jmgarnier ou re-source le profil: prefix- :, puis tapezsource ~/.tmux.conf
ijoseph
8
@jmgarnier ou tout simplement tmux source-file .tmux.conf.
phil294
37

Oui, utilisez new-window -c "#{pane_current_path}". Vous pouvez ajouter ce qui suit à votre ~/.tmux.confpour le rendre persistant (d'assumer les associations de touches par défaut):

bind c new-window -c "#{pane_current_path}"
bind '"' split-window -c "#{pane_current_path}"
bind % split-window -h -c "#{pane_current_path}"

Le default-pathréglage de la trajectoire a été retiré à partir du code en amont et l' auteur de tmux recommandé par le fait que le message de validation en utilisant soit -c "#{pane_current_path}"ou -c "$PWDdans le new-windowet les split-windowcommandes.

J'ai également répondu à cette question en double .

mmoya
la source
10

Avec les versions récentes de tmux (v1.8, mais peut-être aussi dans v1.7):

tmux new-window -c "$PWD"
Mislav
la source
Cela semble également fonctionner avec split-window, par exempletmux split-window -v -c "$PWD"
user7089
3
$PWDne semble pas fonctionner pour moi dans tmux 1.9a. Je devais utiliser pane_current_pathcomme suggéré ci-dessus.
Jordelver
3

Les autres réponses ne fonctionnent pas pour moi lorsque j'essaie de les définir comme des liaisons (spécifiquement tmux split-window -c). Mais j'ai créé ma propre solution que j'utilise depuis plus d'un an et qui fonctionne à la fois pour new-window et les divisions:

~/.bashrc:

PS1="$PS1"'$([ -n "$TMUX" ] && tmux setenv TMUXPWD_$(tmux display -p "#D" | tr -d %) "$PWD")'

~/.tmux.conf:

unbind-key c
bind-key c run-shell 'tmux new-window "cd \"$(tmux show-environment $(echo "TMUXPWD_#D" | tr -d %) | sed -e "s/^.*=//")\"; exec $SHELL"'
bind-key C new-window

bind-key - run-shell 'tmux split-window -v "cd \"$(tmux show-environment $(echo "TMUXPWD_#D" | tr -d %) | sed -e "s/^.*=//")\"; exec $SHELL"'
bind-key | run-shell 'tmux split-window -h "cd \"$(tmux show-environment $(echo "TMUXPWD_#D" | tr -d %) | sed -e "s/^.*=//")\"; exec $SHELL"

Fonctionne au moins avec $ (tmux -V) 1.8. Voir les lignes commentées ici pour une version fonctionnant pour les anciens tmux n'ayant pas la commande show-environment.

Erik Westrup
la source
0

tmux l’a fait dans la version 1.8 mais en 1.9 cette fonctionnalité a été supprimée au profit de -cflag.

Cela peut être résolu en liant new-windowmais si vous voulez utiliser autre chose, cela devient trop verbeux: au lieu de taper, neww man tmuxvous devrez taper neww -c "#{pane_current_path}" man tmuxce que vous ne voudrez probablement pas faire.

Il existe un mod de tmux (j'en suis l'auteur) pour ajouter un langage de script approprié à tmux afin de permettre l'utilisation d'alias, la liaison de plusieurs commandes en "mode", des variables, des boucles, etc. : de nouvelles fenêtres et volets sont ouverts dans le répertoire en cours.

Il peut être construit à partir de sources ici: http://ershov.github.io/tmux/

Yuriy Ershov
la source