現在の作業ディレクトリ(cwd)でウィンドウの名前を自動的に変更するtmuxが欲しいです。デフォルトでは、タブ/ウィンドウにzshやvimなどの現在のプロセスの名前を付けます。
Tmuxで新しいウィンドウを開くと、名前はreattach-to-use-namespace
になり、すぐにzsh
に切り替わります。
私はOS X 10.10.2を使用しています。zshellを使用しており、tmux 1.9aを使用しています。
明確にするために、ウィンドウの名前にパス全体ではなく、現在のディレクトリだけが必要なので、たとえば、/Users/username/Development/projectName
ではなくprojectName
が必要です。
現在のtmux.conf
を表示する場合は、 ここにあります です。
Josefが書いたことを展開すると、シェルスニペットを使用してディレクトリのベース名をステータスに入れることができます。
# 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
* ${pwd##*/}
はフォーマット文字列で特別な意味を持つため、${pwd####*/}
は#
にエスケープされます。
**デフォルトのtmux構成の例については、 here を参照してください。
tmux 2.3 +を使用すると、b:
形式修飾子はパスの「ベース名」(または「テール」)を示します。
set-option -g status-interval 5
set-option -g automatic-rename on
set-option -g automatic-rename-format '#{b:pane_current_path}'
man tmux
のFORMATSセクションでは、#{d:}
や#{s/foo/bar/:}
などの他の修飾子について説明しています。
tmux 2.2以前では、代わりにbasename
Shellコマンドを使用できます。
set-option -g status-interval 5
set-option -g automatic-rename on
set-option -g automatic-rename-format '#(basename "#{pane_current_path}")'
上位N個のコンポーネントを表示
ベース名だけを表示するとあいまいさが非常に多くなりますが、完全なパスは煩雑になりすぎます。
the/last/path
の代わりに:
/a/very/long/the/last/path
あるいは単に:
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]|'
以下から得られるトリック: nix remove part of path
それでもあいまいさが解決しない場合は、次のことにします。
bind-key -r w choose-window -F '#{window_index} | #{pane_current_command} | #{Host} | #{pane_current_path}'
Tmux 2.1、Ubuntu 16.04でテスト済み。
〜/ .tmux.confで以下を使用してこれを実現します(OSX、zsh、tmux-2.3で動作します):
set -g automatic-rename-format '#{pane_current_path}'
set -g status-interval 5
Status-intervalを1に設定すると、ディレクトリの変更に対する応答が速くなります。
Changelog( https://raw.githubusercontent.com/tmux/tmux/master/CHANGES )によると、これはtmux 1.9以降で動作するはずです。
Tmux 2.3でCentOSマシンにsshを使用すると、新しいパネルでreturnを押すまでウィンドウ名は変わりません。なぜそれが起こっているのかわかりません。
Zshシェルのtmuxセッションで次のようなことを行います。
setopt Prompt_SUBST
export PS1=$'\ek$(basename $(pwd))\e\\> '
誰かがbashシェルを使用している場合:
export PS1="\033k\$(basename \$(pwd))\033\\> "
$TERM
env変数が値"screen"
に設定されている場合、これらのコマンドをシェル初期化ファイルに追加できます。
私はそのためにzshフックを使用しています
~/.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
}
この設定を〜/ .tmux.confファイルに追加すると動作するはずです:
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
ただし、Tmuxのバージョンによって異なります。 1.9a3(Cygwin)では動作しませんでしたが、Ubuntu(Vagrant)でTmux 1.8を使用すると正常に動作しました。
これは厳密にはあなたの質問に答えません。既存のtmuxセッションの名前を現在の作業ディレクトリに自動的に変更しません。
むしろ、新しいセッションを作成するとき、現在の作業ディレクトリに基づいてそのセッションに名前を付けます。
私がやったことは次のとおりです。
to
〜/ .aliases
add
alias tm='tmux new -s `basename $PWD`'
新しいターミナルウィンドウを開き、次のように入力します。
tm
これにより、現在の作業ディレクトリにちなんで命名された新しいtmuxセッションが作成されます。
注:これは、Windowsには存在しないbasename
に依存しています。
ウィンドウリストに表示される内容を変更するには、次のようにchose-window
関数のキーバインドを定義するときに形式を指定できます。
bind-key '"' choose-window -F "#{session_name} | #{window_name} - #{b:pane_current_path} (#{pane_current_command})"