Tmux 重命名 window 到当前目录

Tmux rename window to current directory

所以我的 .zshrc 中有这个功能,可以将我当前的 tmux window 重命名为当前目录。

precmd () {
    tmux set-window-option -qg window-status-format "#[fg=colour18 bg=colour18] | #[fg=white, bg=colour18] #I | ${PWD##/*/} #[fg=colour18, bg=colour18] | "
    tmux set-window-option -qg window-status-current-format "#[fg=colour18, bg=blue] | #[fg=white, bg=blue] #I | ${PWD##/*/} #[fg=blue, bg=colour18] | "
}

这工作正常,但我想知道为什么相同的代码在我的 .tmux.conf

中不起作用
# Status Bar
set-window-option -qg window-status-format "#[fg=colour18 bg=colour18] | #[fg=white, bg=colour18] #I | ${PWD##/*/} #[fg=colour18, bg=colour18] | "

set-window-option -qg window-status-current-format "#[fg=colour18, bg=blue] | #[fg=white, bg=blue] #I | ${PWD##/*/} #[fg=blue, bg=colour18] | "

如果我尝试使用它,我会在启动 tmux 时遇到错误。 这有什么原因吗?我可以使用 #{pane_current_path}" 获得相同的效果并将路径缩短到当前目录吗?

我认为它不起作用,因为该函数是在创建 tty 之前执行的。它与 shell 函数一起工作,因为你在 tmux 完全启动后执行它。但是 .tmux.conf 是在 tmux 启动时执行的。

所以我会把它保存在您的 .zshrc 中,可能会立即执行该功能。

恐怕暂时没有简单的方法可以实现。除了@rednaw 所说的,还有一个重要的因素使它不可能。

tmux 支持“#(shell-command)”的语法。因此,您可能很想

tmux set-window-option window-status-format "#(echo ${PWD##/*/})"

但是,这条线不会像您预期的那样工作。棘手的是:"PWD" 是当前会话的 PWD,而不是当前窗格的 PWD。

尽管 shell 命令在会话的工作目录中 运行(而不是 window 或窗格),所以您不能使用 $PWD,您仍然可以使用 #{pane_current_path} 从该命令中获取窗格的工作路径,然后使用 shell 命令将其缩短到路径的最后一部分,例如我的 tmux 配置中有这个:

tmux_conf_theme_window_status_format='#I #(tmux_pwd="#{pane_current_path}"; echo "${tmux_pwd//*\//}"): #W'
tmux_conf_theme_window_status_current_format='(#I) #(tmux_pwd="#{pane_current_path}"; echo "${tmux_pwd//*\//}"): #W'