#:vim
,而是打开的文件的名称(例如"#:filename.php")
。看起来这应该是一个常见的问题,但我的搜索没有结果。autocmd BufReadPost,FileReadPost,BufNewFile * call system("tmux rename-window " . expand("%"))
除了在Vim中查看:help autocmd-events
的其他事件可用于处理。我还没想出如何更改窗口名称,如果你在两个面板中都打开了一个vim
实例,并且你从一个面板切换到另一个面板。vim
不知道在tmux
中的活动,因此不会触发任何vim
事件。
t_ts
。这适用于tmux/screen:set t_ts=^[k
。(使用ctrl-v,ESC输入^[
字符作为实际的转义符,如所需。) - Asherahautocmd VimLeave * call system("tmux rename-window bash")
。 - studgeek这是可以实现的!我想分享这个答案,因为我找了很长时间。最终我有时间自己实现了它。请将以下内容放入您的.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中打开的多个拆分屏幕/文件。
autocmd BufEnter * let &titlestring = ' ' . expand("%:t")
对我似乎不起作用。正如@Phluks建议的那样,在tmux内部使用tmux rename-window
方法。 - studgeekautocmd BufEnter * call system("tmux rename-window " . expand("%:t"))
autocmd VimLeave * call system("tmux rename-window bash")
autocmd BufEnter * let &titlestring = ' ' . expand("%:t")
set title
同时,在退出Vim时恢复自动窗口标题:
autocmd VimLeave * call system("tmux setw automatic-rename")
if exists('$TMUX')
autocmd BufEnter * call system("tmux rename-window '" . expand("%:t") . "'")
autocmd VimLeave * call system("tmux setw automatic-rename")
endif
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 source-file ~/.tmux.conf
最终我使用了bash,因为它允许在更改目录时立即重命名窗口,而且对于我的特定需求来说比vimscript更容易。它改变了cd
和vim
命令的功能,包括我的重命名函数。我还添加了在使用top
和nmtui
时将其重命名为命令本身的功能。
# 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
basedirRename () {
# "basepath/"
getval=$(pwd)
BASEPATH_FULL="${getval##*/}"
BASEPATH="${BASEPATH_FULL:0:$CHAR_LIMIT}/"
tmux rename-window " $BASEPATH "
tmux select-pane -T " $BASEPATH "
}
fileRename () {
# "filename"
FILENAME_FULL="$@"
FILENAME="${FILENAME_FULL:0:$CHAR_LIMIT}"
tmux rename-window " $FILENAME "
tmux select-pane -T " $FILENAME "
}
commandRename() {
tmux rename-window " $1 "
tmux select-pane -T " $1 "
}
cd () {
builtin cd "$@"
CD_STATUS=$?
basedirRename
return "$CD_STATUS"
}
vim () {
fileRename $@
$MY_VIM $@
VIM_STATUS="$?"
basedirRename
return "$VIM_STATUS"
}
top () { commandRename 'top'; /usr/bin/top; STATUS=$@; basedirRename; return $STATUS; }
nmtui () { commandRename 'nmtui'; /usr/bin/nmtui; STATUS=$@; basedirRename; return $STATUS; }
basedirRename
fi
. .bashrc
这里有一些很好的答案,但我仍然没能让它按照我所想要的方式工作: 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))
tmux new-window -n <window-name>
定义的静态窗口名称,同时让vim更改面板标题。在set-titles-string
中使用#T
来显示面板标题,例如:set-option -g set-titles-string "#W: #T"
将显示tmux窗口名称和面板标题。" 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.com 提供的 t_ts
和 t_fs
指南,以及 phluks 的自动命令。
.tmux.conf
set-option -g set-titles on
set-option -g set-titles-string '#W:#T' # window title,pane title
set -g allow-rename on
这是我在vim中设置titlestring
的方法:https://vi.stackexchange.com/a/40069/26406
无需在vim内部使用外部命令,这就是方法。
tmux rename-window
并使用活动缓冲区中文件的名称。 - chepner