tmux选项卡,带有在vim中打开的文件名

egmofgnx  于 2022-11-11  发布在  其他
关注(0)|答案(7)|浏览(153)

我是tmux的新手,正在尝试找出如何编辑配置,以便打开了vim的窗口在任务栏中显示为#:vim,而不管在vim中打开的文件的名称是什么
(ie "#:filename.php").看起来应该是很常见的东西,但是我的search - foo失败了。

yi0zb3m4

yi0zb3m41#

这是一个部分的答案。它可以改进,但我现在没有时间去解决它。
.vimrc中输入以下内容:

autocmd BufReadPost,FileReadPost,BufNewFile * call system("tmux rename-window " . expand("%"))

还有其他事件(参见Vim中的:help autocmd-events)也可以用来处理。有一件事我还没有弄清楚,如果您在两个窗格中的每一个中都打开了vim的示例,并且您从一个窗格切换到另一个窗格,则如何更改窗口名称。vim不知道tmux中的活动,因此不会触发vim事件。

tsm1rwdh

tsm1rwdh2#

这是可能的!我想分享这个答案,因为我一直在寻找它相当长的一段时间。终于有时间实现它自己。把以下内容放在你的.vimrc

autocmd BufEnter * let &titlestring = ' ' . expand("%:t")
set title

它会将终端标题设置为当前焦点中的文档标题(%t代表没有路径的文档标题)。由于BufEnter事件,终端标题会在您每次切换焦点到另一个文档时更改。同样,当离开Vim时,它会更改回原始状态。将以下内容放入(或替换)您的.tmux.conf

set-window-option -g window-status-current-format "[#I #W#T]"
set-window-option -g window-status-format "[#I #W#T]"

没有必要完全复制它,但它看起来像这样:

[1 vim .tmux.conf][2 bash]...

I代表窗口编号。W代表当前运行的应用程序,T代表终端标题。后者用于显示当前在vim中打开的文件。终端标题总是设置的(我的bash终端总是显示主机名,我不需要在状态栏描述中看到),因此,为了只在Vim运行时显示它,请将以下内容添加到您的.bashrc

PROMPT_COMMAND='echo -ne "\033]0;\007"'

我使用的shell bash就是这样。在终端显示提示符之前,PROMPT_COMMAND会被求值。echo命令将终端标题设置为空。因此,每次从可能更改了标题的应用程序中返回提示符时,都会发生此操作。其他shell可能需要进行不同的配置...
我不会使用tmux rename-window,因为只要窗口存在,它就会设置标题。你需要在每次应用程序启动时调用它。所提供的方法保持了动态性,因为它可以在一个窗口中使用多个窗格,并在vim中打开多个分屏/文件。

aamkag61

aamkag613#

感谢伟大的投入,伙计们,它节省了我很多打字:-)
我把前面两个答案合二为一,这一点我很喜欢。

autocmd BufEnter * call system("tmux rename-window " . expand("%:t"))
autocmd VimLeave * call system("tmux rename-window bash")
autocmd BufEnter * let &titlestring = ' ' . expand("%:t")                                                                 
set title

第一行和第二行用于tmux,第三行和第四行用于正常的终端使用。你不必重新启动tmux,因为是vim显式地更新tmux。

niknxzdl

niknxzdl4#

并在Vim退出时恢复自动窗口标题:

autocmd VimLeave * call system("tmux setw automatic-rename")

我还建议检查一下我们是否在tmux下运行:

if exists('$TMUX')
    autocmd BufEnter * call system("tmux rename-window '" . expand("%:t") . "'")
    autocmd VimLeave * call system("tmux setw automatic-rename")
endif
smtd7mpg

smtd7mpg5#

答案很好,但我还是无法让它按我想要的方式工作,即:1)在打开Vim时更改TMUX窗口名称2)在退出时。完成后将其返回到以前的名称我用以下3个Vimrc行实现了它:

autocmd BufReadPost,FileReadPost,BufNewFile * call system("tmux rename-window " . expand("%:t"))
let tmuxtitle = system("tmux display-message -p '#W'")
autocmd VimLeave * call system("tmux rename-window " . shellescape(tmuxtitle))
e5nszbig

e5nszbig6#

作为设置tmux窗口名的替代方法,你可以让vim设置tmux窗格标题。这可以让你在让vim更改窗格标题的同时保留你用tmux new-window -n <window-name>定义的静态窗口名。你可以在set-titles-string中使用#T来显示窗格标题,例如set-option -g set-titles-string "#W: #T"将显示tmux窗口名和窗格标题。
更改窗格标题的VIM配置示例:

" Teach vim the tmux escape sequences for changing pane title
" Note the "^[" should be a literal escape code (use `^v<esc>` to enter it)
set t_ts=^[]2;
set t_fs=^[\\

" Turn on setting the title.
set title

" The following causes vim to refresh the title each time we change buffers.
" Otherwise it will only set the title once at startup.
augroup RefreshTitle
  autocmd!
  " The concatenation of the colon is a hack to prevent vim from
  " interpreting the string as a modeline.
  autocmd BufEnter * let &titlestring = "vim" . ":" . expand("%:t")
augroup END

赞扬vim.wikia.comt_tst_fs指导和phluks的自动命令。

x8diyxa7

x8diyxa77#

下面是我的方法,当在窗格之间来回导航和限制显示的字符数时,我也会重命名窗口。

文件名:
我喜欢不带索引号或其他符号的标题名称。

basepath/   -> at the prompt
filename    -> inside Vim

若要保留索引号,请将window-status-format和window-status-current-format行更改为“#I:#W”。


# window name formatting

set-window-option -g window-status-format "#W"
set-window-option -g window-status-current-format "#W"

# pane title formatting

set -g pane-border-format ' #T '

# rename window to pane title on focus

set -g focus-events on
set-hook -g pane-focus-in 'rename-window "#T"'
源文件tmux.conf
tmux source-file ~/.tmux.conf
~/.bashrc

我最终使用了bash,因为它允许在更改目录时立即重命名窗口,并且最终比vimscript更容易满足我的特定需求。它本质上改变了cdvim命令的功能,以包括我的重命名功能。


# max number of characters in title

CHAR_LIMIT=20
MY_VIM="/usr/bin/vim.gtk3"

# if tmux running...

tmux ls > /dev/null 2>&1
TMUX_STATUS=$?
if [ $TMUX_STATUS -eq 0 ]; then

    # outside vim
    basedirRename () {

        # "basepath/"
        getval=$(pwd)
        BASEPATH_FULL="${getval##*/}"
        BASEPATH="${BASEPATH_FULL:0:$CHAR_LIMIT}/"

        tmux rename-window " $BASEPATH "
        tmux select-pane -T " $BASEPATH "
    }

    # inside vim
    fileRename () {

        # "filename"
        FILENAME_FULL="$@"
        FILENAME="${FILENAME_FULL:0:$CHAR_LIMIT}"

        tmux rename-window " $FILENAME "
        tmux select-pane -T " $FILENAME "
    }

    cd () {

        builtin cd "$@"
        CD_STATUS=$?
        basedirRename
        return "$CD_STATUS"
    }

    vim () {

        fileRename $@
        $MY_VIM $@
        VIM_STATUS="$?"
        # edit file, then on close...
        basedirRename
        return "$VIM_STATUS"
    }

    basedirRename
fi
源代码.bashrc
. .bashrc

相关问题