在屏幕上,是否可以在一个窗口中打开 vim 的所有实例?(例如窗口 2)最初,窗口将切换到指定窗口并打开缓冲区中的文件。随后调用 vim(从其他窗口)将在该窗口的新 vim 选项卡中打开文件。我正在运行 cygwin。
答案1
这是一个很棒的问题,也是一个很棒的想法!我迫不及待地想将其纳入我的工作流程中。
无论如何,在我看来,实现此目的的最佳方法是使用 vim 的服务器功能,它允许您使用 vim 命令控制正在运行的 vim 实例。
这个想法是,第一次运行 vim 时,你将按如下方式运行它:
vim --servername $VIM_SERVER_NAME
然后每次你想在这个实例中打开一个新标签时,你都可以运行:
vim --servername $VIM_SERVER_NAME --remote-tab $PATH_TO_FILE_TO_OPEN
除此之外,您唯一需要添加的是识别和切换到 vim 窗口的逻辑(可以使用窗口标题完成)。
我把所有这些放在以下 shell 函数中:
v() {
if [ $STY ]; then
# screen
VIM_SERVER_NAME="VIM-SCREEN-$STY"
if [ "`vim --serverlist | grep -i $VIM_SERVER_NAME`" = "" ]; then
# No vim server, become the server
screen -X title vim
vim --servername $VIM_SERVER_NAME "$@"
screen -X title `basename $SHELL`
else
# A vim server exists, use it, then switch to it.
vim --servername $VIM_SERVER_NAME --remote-tab "$@"
screen -X select vim
fi
else
vim $@
fi
}
如果您添加了此函数定义~/.profile
(或者~/.bash_profile
如果您使用 bash),那么每当您想使用 vim 时,只需使用v
即可。它将检查您当前是否处于屏幕会话中,如果是,它将使用指定的 vim 窗口并切换到它(或者如果不存在,则将当前窗口设为指定的 vim 窗口),否则它将恢复正常使用 vim。即使您同时使用多个屏幕会话并v
在所有会话中使用,它也应该可以工作。
请注意,如果/当您退出 vim 服务器时,我还会将窗口标题重置为 shell 名称,这是为了避免在v
关闭一个窗口后在另一个窗口中使用时出现两个或多个标题为“vim”的窗口。
因为我更喜欢 tmux,所以这是我实际上计划使用的 shell 函数:
v() {
if [ $STY ]; then
# screen
VIM_SERVER_NAME="VIM-SCREEN-$STY"
if [ "`vim --serverlist | grep -i $VIM_SERVER_NAME`" = "" ]; then
# No vim server, become the server
screen -X title vim
vim --servername $VIM_SERVER_NAME "$@"
screen -X title `basename $SHELL`
else
# A vim server exists, use it, then switch to it.
vim --servername $VIM_SERVER_NAME --remote-tab "$@"
screen -X select vim
fi
elif [ $TMUX ]; then
# tmux
VIM_SERVER_NAME="VIM-TMUX-`tmux list-windows -F '#{session_name}' | head -1`"
if [ "`vim --serverlist | grep -i $VIM_SERVER_NAME`" = "" ]; then
# No vim server, become the server
tmux rename-window vim
vim --servername $VIM_SERVER_NAME "$@"
tmux rename-window `basename $SHELL`
else
# A vim server exists, use it, then switch to it.
vim --servername $VIM_SERVER_NAME --remote-tab "$@"
tmux select-window -t vim
fi
else
vim "$@"
fi
}
此版本的功能可适用于 tmux 和 screen(任意数量的不同会话),如果不在其中,则回退到普通 vim。
答案2
您无法在不同的屏幕窗口中运行两个 vim 实例,这样您就无法同时从两个实例编辑同一个文件。如果您尝试打开第二个 vim 实例来编辑同一个文件,您将收到一条消息,警告您该文件已被编辑。
话虽如此,你能通过在 vim 中执行此命令,在新屏幕窗口中打开 vim 的第二个实例以查看当前文件:
:!screen screen vim -R %
该-R
选项以只读模式启动 vim。