web-dev-qa-db-fra.com

Comment renommer automatiquement tmux windows dans le répertoire actuel

J'aimerais que tmux renomme automatiquement la fenêtre avec le répertoire de travail actuel (cwd). Comme par défaut, il nomme l'onglet/fenêtre en tant que nom du processus actuel, tel que zsh ou vim.

Lorsque j'ouvre une nouvelle fenêtre dans tmux, le nom est reattach-to-use-namespace, puis il bascule immédiatement en zsh.

tmux tabs

Je suis sous OS X 10.10.2, j'utilise zshell et j'ai tmux 1.9a.

Pour être clair, je ne veux pas que le chemin entier soit dans le nom de la fenêtre, mais seulement dans le répertoire courant, alors par exemple, je veux projectName, pas /Users/username/Development/projectName.

Si vous voulez voir mon tmux.conf actuel, le voici .

32
aharris88

En développant ce que Josef a écrit, vous pouvez mettre le nom de base du répertoire dans le statut à l'aide d'un extrait de shell:

# be sure to see note* below
set -g window-status-format '#I:#(pwd="#{pane_current_path}"; echo ${pwd####*/})#F'
set -g window-status-current-format '#I:#(pwd="#{pane_current_path}"; echo ${pwd####*/})#F'

# status bar updates every 15s by default**, change to 1s here 
# (this step is optional - a lower latency might have negative battery/cpu usage impacts)
set -g status-interval 1

* Notez que ce qui serait ${pwd##*/} est échappé à ${pwd####*/} car # a une signification particulière dans la chaîne de formatage.

** Voir ici pour un exemple de configuration par défaut de tmux.

20
CEL

Avec tmux 2.3+ , le modificateur de format b: affiche le "nom de base" (ou "queue") d'un chemin.

set-option -g status-interval 5
set-option -g automatic-rename on
set-option -g automatic-rename-format '#{b:pane_current_path}'

La section FORMATS de man tmux décrit d'autres modificateurs, tels que #{d:} et même #{s/foo/bar/:}.


Avec tmux 2.2 ou version antérieure , vous pouvez utiliser la commande basename Shell.

set-option -g status-interval 5
set-option -g automatic-rename on
set-option -g automatic-rename-format '#(basename "#{pane_current_path}")'
12
Justin M. Keyes

Afficher les N premiers composants

 enter image description here

Afficher seulement le nom de base génère trop d'ambiguïté, mais les chemins complets sont trop encombrés, alors j'ai choisi:

the/last/path

au lieu de:

/a/very/long/the/last/path

ou juste:

path

.tmux.conf:

set-window-option -g window-status-current-format '#[fg=white,bold]** #{window_index} #[fg=green]#{pane_current_command} #[fg=blue]#(echo "#{pane_current_path}" | rev | cut -d'/' -f-3 | rev) #[fg=white]**|'
set-window-option -g window-status-format '#[fg=white,bold]#{window_index} #[fg=green]#{pane_current_command} #[fg=blue]#(echo "#{pane_current_path}" | rev | cut -d'/' -f-3 | rev) #[fg=white]|'

Astuce tirée de: Unix supprime une partie du chemin

Si cela ne résout toujours pas l'ambiguïté, je choisis:

bind-key -r w choose-window -F '#{window_index} | #{pane_current_command} | #{Host} | #{pane_current_path}'

Testé sur Tmux 2.1, Ubuntu 16.04.

J'utilise ce qui suit dans ~/.tmux.conf pour y parvenir (en travaillant sur OSX, zsh, tmux-2.3):

set -g automatic-rename-format '#{pane_current_path}'
set -g status-interval 5

Vous pouvez définir status-interval sur 1 pour qu'il réponde plus rapidement aux changements de répertoires.

Selon le changelog ( https://raw.githubusercontent.com/tmux/tmux/master/CHANGES ), cela devrait fonctionner dans tmux 1.9 et plus.

Si vous utilisez ssh sur une machine CentOS avec tmux 2.3, le nom de la fenêtre ne change pas tant que je n’ai pas appuyé sur Entrée dans le nouveau panneau, sans savoir pourquoi.

2
Harry Mallon

Faites quelque chose comme ceci dans une session tmux pour zsh Shell:

setopt Prompt_SUBST
export PS1=$'\ek$(basename $(pwd))\e\\> '

Si quelqu'un utilise bash Shell:

export PS1="\033k\$(basename \$(pwd))\033\\> "

Vous pouvez ajouter ces commandes dans le fichier d'initialisation du shell à la condition que la variable $TERM env soit définie sur la valeur "screen".

1
JuniorCompressor

J'utilise crochet zsh pour cela

Ajouter ce qui suit dans ~/.zshrc

precmd () {
  if [ -n "$TMUX" ]; then
    tmux set-window-option -q window-status-format "#[fg=cyan bg=cyan] | #[fg=white, bg=cyan] #I | ${PWD##/*/} #[fg=cyan, bg=cyan] | "
    tmux set-window-option -q window-status-current-format "#[fg=cyan, bg=cyan] | #[fg=white, bg=cyan] #I | ${PWD##/*/} #[fg=cyan, bg=cyan] | "
  fi
}
1
logcat

Ajouter cette configuration à votre fichier ~/.tmux.conf devrait fonctionner:

set-option -g window-status-current-format '#I:#{pane_current_path}#F'
set-option -g window-status-format '#I:#{pane_current_path}#F'
set-option -g status-interval 1

Cela dépend toutefois de votre version de Tmux. Je ne pouvais pas le faire fonctionner sur 1.9a3 (dans Cygwin) - mais avec Tmux 1.8 sur Ubuntu (dans Vagrant), cela fonctionnait bien.

1
Josef

Je suis sûr que vous voulez utiliser ceci:

set -g status-left '#{pane_current_path} '

 enter image description here

0
jibancanyang

Cela ne répond pas strictement à votre question - il ne renomme pas automatiquement une session tmux existante en répertoire de travail actuel.

En revanche, lors de la création d'une nouvelle session, il la nomme après le répertoire de travail en cours.

Voici ce que j'ai fait:

à

~/.aliases

ajouter

alias tm='tmux new -s `basename $PWD`'

Ouvrez une nouvelle fenêtre de terminal et tapez:

tm

Cela crée maintenant une nouvelle session tmux nommée d'après le répertoire de travail actuel.

Remarque: Ceci repose sur basename qui n'existe pas sous Windows.

0
FreePender

Pour changer ce que vous voyez dans la liste de fenêtres, vous pouvez spécifier un format lorsque vous définissez la liaison de clé pour la fonction chose-window comme ceci:

bind-key '"'  choose-window  -F "#{session_name} | #{window_name} - #{b:pane_current_path} (#{pane_current_command})"
0
Rho Phi