9

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

澄清一下,如果我有一个带有两个窗格的窗口,并且第一个窗格在 in~并且第二个窗格在 in ~/Sites,我希望状态栏中的窗口列表显示1:~当我专注于第一个窗格时,并且1:~/当我专注于第二个窗格时的站点。

4

5 回答 5

7

提示符下的 Tmux 窗格 PWD

有几种方法可以做到这一点。我自己做。最简单和最可定制的方法是设置一个 tmux 可以访问的全局变量。

首先将此添加到您的.bashrcor.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
于 2013-10-06T03:23:46.690 回答
6

除了上一个答案,我想补充一点,您不必依赖 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

我之前发过这个:手动刷新状态栏

于 2014-01-06T09:55:56.273 回答
5

这是另一种方法。

工作环境:

操作系统

  • OSX 10.14.5

终端

多路复用器

  • tmux 2.9a

~/.tmux.config

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 插件

tmux 空间主题

于 2019-06-18T16:17:49.080 回答
2

如果您希望当前窗口名称反映目录名称,这里是原始答案的修改版本,不需要从 tmux 调用脚本并立即更新:

export PS1=$PS1'$( [ -n $TMUX ] && tmux rename-window $(basename $PWD))'

请注意,这意味着您不能再显示当前进程名称。反正对我来说价值不大。

于 2015-04-18T21:02:26.013 回答
0

我通过将其添加到我的 .zshrc(或 .bashrc)中解决了这个问题:

cd() { builtin cd $1 tmux refresh-client -S }

然后像其他人一样绑定tmux refresh-client -S到窗格切换。

于 2019-01-10T20:44:30.523 回答