Esta é uma ótima pergunta e uma ótima ideia! Mal posso esperar para incorporá-lo ao meu fluxo de trabalho.
De qualquer forma, na minha opinião, a melhor maneira de conseguir isso é usar a funcionalidade de servidor do vim, que permite controlar sua instância vim em execução usando o comando vim.
A ideia é que na primeira vez que você executar o vim, você o executará como:
vim --servername $VIM_SERVER_NAME
e, em seguida, toda vez que você quiser abrir uma nova guia nessa instância, será executado:
vim --servername $VIM_SERVER_NAME --remote-tab $PATH_TO_FILE_TO_OPEN
Além disso, a única coisa que você precisará adicionar é a lógica para identificar e alternar para a janela vim (que pode ser feita usando o título da janela).
Eu coloquei tudo isso junto na seguinte função de 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
}
Se você adicionar essa definição de função em ~/.profile
(ou ~/.bash_profile
se você usar o bash), sempre que quiser usar o vim, use apenas v
. Ele irá verificar se você está atualmente em uma sessão de tela e, em caso afirmativo, usará a janela designada do vim e mudará para ela (ou tornará a janela atual a janela designada do vim se não existir), caso contrário, usará o vim normalmente. Ele também deve funcionar mesmo se você estiver usando várias sessões de tela ao mesmo tempo e estiver usando v
em todas elas.
Repare que eu também redefino o título da janela para o nome do shell se / quando você sair do servidor vim, isto é para evitar duas ou mais janelas com o título "vim" se você usar v
em uma janela diferente após fechando em um.
Como sou mais do tipo tmux, esta é a função de shell que estou planejando usar:
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
}
Esta versão da função irá funcionar tanto para o tmux como para o screen (quantas sessões diferentes você quiser), e também para o vim normal, se não dentro de qualquer um dos dois.