Auto-update tmux status bar with active pane pwd

前端 未结 3 988
鱼传尺愫
鱼传尺愫 2021-01-02 18:42

In tmux, the status bar normally shows the current working directory of a pane in the window list. If I have for example two panes in a window, and the two panes have differ

3条回答
  •  一生所求
    2021-01-02 19:08

    Tmux pane PWD at the prompt

    There are several ways that you can do this. I do it myself. The easiest and most customisable way is to set a global variable that tmux can access.

    First add this to your .bashrc or .zshrc file, to set the PWD variable after every prompt:

    # 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)'
    

    Now, make a script that displays this variable such as ~/bin/display_tmux_pane_pwd.sh:

    #!/bin/bash
    tmux showenv -g TMUX_PWD_$(tmux display -p "#D" | tr -d %)  | sed 's/^.*=//'
    

    All that is left is to add this to the satis-bar in .tmux.conf:

    set -g status-left '#(~/bin/display_tmux_pane_pwd.sh)'
    

    It may take awhile to update after switching panes, so you can change that with this command. By default it updates every 15 seconds, this will make it 5 seconds. Change it as you like.

    set -g status-interval 5
    

    Tmux-pane PWD in other programs

    Sometimes it is useful to open up a pane or window and immediately execute a program instead of booting up another shell (e.g. tmux new-window vim). This way, when you close that program you also close the window. Unfortunately, the way I describe above requires a prompt in order to broadcast the status of PWD. However, in many programs, you can work around this fairly easily. Here's an example of what is in my .vimrc file so that vim updates the PWD status whenever it changes buffers.

    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
    

提交回复
热议问题