在tmux中,状态栏通常显示窗口列表中窗格的当前工作目录。如果我在窗口中有两个窗格,并且两个窗格具有不同的工作目录,是否可以使用我当前关注的窗格的当前工作目录自动更新状态栏?
为了澄清,如果我有一个带有两个窗格的窗口,并且第一个窗格位于~
而第二个窗格位于~/Sites
,我希望状态栏中的窗口列表说明 1:〜当我专注于第一个窗格时, 1:〜/ Sites 当我专注于第二个窗格时。
答案 0 :(得分:5)
有几种方法可以做到这一点。我自己做。最简单,最可自定义的方法是设置tmux可以访问的全局变量。
首先将其添加到您的.bashrc
或.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
答案 1 :(得分:4)
除了上一个答案之外,我想补充一点,你不必依赖于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
我之前发布过:manually refresh status bar
答案 2 :(得分:2)
如果您希望当前窗口名称反映目录名称,则此处是原始答案的修改版本,不需要从tmux调用脚本并立即更新:
export PS1=$PS1'$( [ -n $TMUX ] && tmux rename-window $(basename $PWD))'
请注意,这意味着您无法再显示当前进程名称。无论如何,这对我来说没什么价值。
答案 3 :(得分:1)
这是另一种方法。
~/.tmux.config
在提供的示例中调出外部bash脚本,文件位于此处:~/.tmux_path.sh
set -g status-interval 1
set -g status-right-length 150
set -g status-right "#(~/.tmux_path.sh #{pane_current_path}) %Y-%m-%d %H:%M:%S"
示例bash脚本读取#{pane_current_path)arg。 basename
截断起始路径,仅显示当前路径。用作窗口ID很好。
#!/bin/sh
printf '\033%s\007' $(basename $1) # show full path use $1 instead of $(basename $1)
chmod +x ~/.tmux_path.sh
~/.tmux_path.sh
set -g status-interval 1
set -g window-status-current-format "[#[fg=white] #(~/.tmux_path.sh #{pane_current_path})]"
set -g window-status-format "#[fg=black] #(~/.tmux_path.sh #{pane_current_path})"
答案 4 :(得分:0)
我通过将其添加到我的.zshrc(或.bashrc)中来解决此问题:
cd() {
builtin cd $1
tmux refresh-client -S
}
然后像其他操作一样将tmux refresh-client -S
绑定到窗格切换。