在 tmux 中,状态栏通常会在窗口列表中显示窗格的当前工作目录。例如,如果我在一个窗口中有两个窗格,并且两个窗格具有不同的工作目录,是否可以使用我当前关注的窗格的当前工作目录自动更新状态栏?
澄清一下,如果我有一个带有两个窗格的窗口,并且第一个窗格在 in~
并且第二个窗格在 in ~/Sites
,我希望状态栏中的窗口列表显示1:~当我专注于第一个窗格时,并且1:~/当我专注于第二个窗格时的站点。
在 tmux 中,状态栏通常会在窗口列表中显示窗格的当前工作目录。例如,如果我在一个窗口中有两个窗格,并且两个窗格具有不同的工作目录,是否可以使用我当前关注的窗格的当前工作目录自动更新状态栏?
澄清一下,如果我有一个带有两个窗格的窗口,并且第一个窗格在 in~
并且第二个窗格在 in ~/Sites
,我希望状态栏中的窗口列表显示1:~当我专注于第一个窗格时,并且1:~/当我专注于第二个窗格时的站点。
有几种方法可以做到这一点。我自己做。最简单和最可定制的方法是设置一个 tmux 可以访问的全局变量。
首先将此添加到您的.bashrc
or.zshrc
文件中,以在每次提示后设置 PWD 变量:
# create a global per-pane variable that holds the pane's PWD
export PS1=$PS1'$( [ -n $TMUX ] && tmux setenv -g TMUX_PWD_$(tmux display -p "#D" | tr -d %) $PWD)'
现在,制作一个显示此变量的脚本,例如~/bin/display_tmux_pane_pwd.sh
:
#!/bin/bash
tmux showenv -g TMUX_PWD_$(tmux display -p "#D" | tr -d %) | sed 's/^.*=//'
剩下的就是将其添加到满足栏中.tmux.conf
:
set -g status-left '#(~/bin/display_tmux_pane_pwd.sh)'
切换窗格后可能需要一段时间才能更新,因此您可以使用此命令进行更改。默认情况下,它每 15 秒更新一次,这将使其变为 5 秒。随心所欲地改变它。
set -g status-interval 5
有时打开一个窗格或窗口并立即执行一个程序而不是启动另一个shell(例如)很有用tmux new-window vim
。这样,当您关闭该程序时,您也会关闭窗口。不幸的是,我上面描述的方式需要提示才能广播 PWD 的状态。但是,在许多程序中,您可以相当轻松地解决这个问题。这是我的.vimrc
文件中的一个示例,以便 vim 在更改缓冲区时更新 PWD 状态。
if exists("$TMUX")
" Get the environment variable
let tmux_pane_name_cmd = 'tmux display -p \#D'
let tmux_pane_name = substitute(system(g:tmux_pane_name_cmd), "\n", "", "")
let tmux_env_var = "TMUX_PWD_" . substitute(g:tmux_pane_name, "%", "", "")
unlet tmux_pane_name tmux_pane_name_cmd
function! BroadcastTmuxCwd()
let filename = substitute(expand("%:p:h"), $HOME, "~", "")
let output = system("tmux setenv -g ".g:tmux_env_var." ".l:filename)
endfunction
autocmd BufEnter * call BroadcastTmuxCwd()
endif
除了上一个答案,我想补充一点,您不必依赖 status-interval 选项。等待看到变化并不是很优雅。您可以使用以下方法手动更新事件的状态栏:
tmux refresh-client -S
我在窗格/窗口/会话切换后使用此选项。在我的 tmux 配置中,您会发现例如切换窗格:
bind -r k select-pane -U\; refresh-client -S
bind -r j select-pane -D\; refresh-client -S
bind -r l select-pane -R\; refresh-client -S
bind -r h select-pane -L\; refresh-client -S
我之前发过这个:手动刷新状态栏
这是另一种方法。
set -g status-interval 1
set-window-option -g window-status-separator ""
set-window-option -g window-status-current-format " *#{b:pane_current_path} "
set-window-option -g window-status-format " #{b:pane_current_path} "
#{b:pane_current_path}
#{pane_current_path}
path="#(if [[ $HOME == #{pane_current_path} ]]; then echo \"~\" ; else echo #{b:pane_current_path}; fi)"
set-window-option -g window-status-separator ""
set-window-option -g window-status-current-format " $path "
set-window-option -g window-status-format " $path "
如果您希望当前窗口名称反映目录名称,这里是原始答案的修改版本,不需要从 tmux 调用脚本并立即更新:
export PS1=$PS1'$( [ -n $TMUX ] && tmux rename-window $(basename $PWD))'
请注意,这意味着您不能再显示当前进程名称。反正对我来说价值不大。
我通过将其添加到我的 .zshrc(或 .bashrc)中解决了这个问题:
cd() {
builtin cd $1
tmux refresh-client -S
}
然后像其他人一样绑定tmux refresh-client -S
到窗格切换。