使用活动窗格pwd自动更新tmux状态栏

时间:2013-10-05 17:25:54

标签: tmux

在tmux中,状态栏通常显示窗口列表中窗格的当前工作目录。如果我在窗口中有两个窗格,并且两个窗格具有不同的工作目录,是否可以使用我当前关注的窗格的当前工作目录自动更新状态栏?

为了澄清,如果我有一个带有两个窗格的窗口,并且第一个窗格位于~而第二个窗格位于~/Sites,我希望状态栏中的窗口列表说明 1:〜当我专注于第一个窗格时, 1:〜/ Sites 当我专注于第二个窗格时。

5 个答案:

答案 0 :(得分:5)

提示时的Tmux窗格PWD

有几种方法可以做到这一点。我自己做。最简单,最可自定义的方法是设置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

其他程序中的Tmux-pane PWD

有时打开窗格或窗口并立即执行程序而不是启动另一个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)

这是另一种方法。

有效的ENV:

操作系统

  • OSX 10.14.5

终端

Tmux

  • tmux 2.9a

状态右字段示例

~/.tmux.config在提供的示例中调出外部bash脚本,文件位于此处:~/.tmux_path.sh

〜/ .tmux.config

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很好。

〜/ .tmux_path.sh

#!/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

〜/ .tmux.conf

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绑定到窗格切换。