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

att*_*ack 27 vim tmux

我是tmux的新手,我正在试图弄清楚如何编辑配置,以便vim打开的窗口显示在任务栏中,而不是像vim中打开#:vim的文件名一样
(ie "#:filename.php").看起来它应该是常见的事情,但我的搜索 - foo失败了.

che*_*ner 36

这是一个部分答案.它可以改进,但我现在没有时间解决它.

将以下内容放入您的.vimrc:

autocmd BufReadPost,FileReadPost,BufNewFile * call system("tmux rename-window " . expand("%"))
Run Code Online (Sandbox Code Playgroud)

还有其他事件(参见:help autocmd-eventsVim)也可用于处理.我还没想到的一件事是如果你vim在两个窗格的每个窗格中都有一个打开的实例,并且从一个窗格切换到另一个窗格,如何更改窗口名称.vim不知道活动tmux,因此不会vim触发任何事件.

  • 我不得不调整这个以使用expand()来获得扩展到窗口名称的百分号,否则我只是得到"%"作为我的窗口名称.这是vim 7.3.即:autocmd BufReadPost,FileReadPost,BufNewFile*调用系统("tmux rename-window".express("%")) (15认同)
  • expand("%:t")将放置文件名,而expand("%")则显示完整路径. (7认同)
  • 我发现当使用多个窗格或窗口,或者逃犯时,我需要将BufEnter添加到事件列表中,以便在缓冲区之间移动时保持标题. (4认同)
  • 离开vim后,这似乎会让窗口重命名.为了解决这个问题,我添加了`autocmd VimLeave*调用系统("tmux rename-window bash")`,如@Phluks中所述. (2认同)

gos*_*pes 17

有可能的!我想分享这个答案,因为我一直在寻找它.终于有时间自己实施了.将以下内容放入您的.vimrc:

autocmd BufEnter * let &titlestring = ' ' . expand("%:t")
set title
Run Code Online (Sandbox Code Playgroud)

它将终端标题设置为仅当前处于焦点%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]"
Run Code Online (Sandbox Code Playgroud)

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

[1 vim .tmux.conf][2 bash]...
Run Code Online (Sandbox Code Playgroud)

I窗口编号的代表.在W看台上为当前应用程序正在运行和T待机的终端称号.后来我们用来显示当前文件在vim中打开.终端标题始终设置(我的bash终端始终显示我不需要在状态栏描述中看到的主机名),因此仅在vim运行时显示它,将以下内容添加到您的.bashrc:

PROMPT_COMMAND='echo -ne "\033]0;\007"'
Run Code Online (Sandbox Code Playgroud)

对于bash,我使用的shell也是如此.PROMPT_COMMAND在终端中显示提示之前进行评估.echo命令将终端标题设置为空.因此,每当您从可能已更改标题的应用程序返回提示时,就会发生此操作.其他shell可能需要以不同方式配置......

tmux rename-window只要窗口存在,我就不会使用它来设置标题.您需要为每次应用程序启动调用它.所提出的方法使事物保持动态,因为它适用于窗口中的多个窗格以及在vim内打开的多个分屏/文件.


sc0*_*0ty 7

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

autocmd VimLeave * call system("tmux setw automatic-rename")
Run Code Online (Sandbox Code Playgroud)

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

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


Phl*_*uks 5

感谢很棒的输入,它为我节省了很多打字:-)

我将之前的两个答案合并为一个,我喜欢.

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
Run Code Online (Sandbox Code Playgroud)

第一个和sedond线用于tmux,第三个和第四个用于正常终端使用.您不必重新启动tmux,因为它是vim,可以显式更新tmux.