Há três etapas principais para realizar o que você está perguntando:
- obtendo o nome do arquivo alternativo
- abrir esse arquivo na janela atual ou em outra janela, conforme desejado
- restaurando a posição do cursor dentro desse arquivo
Para encontrar o nome do arquivo alternativo, você deseja dividir o nome do arquivo atual em "raiz" e "extensão". Uma maneira simples de fazer isso é:
let parts = split(expand("%:p"), "[.]");
let root = parts[0]
let extension = parts[1]
Se você souber que apenas alterna entre arquivos .h
e .cpp
, poderá alterar a extensão de um para outro facilmente:
if extension == "h"
let extension = "cpp"
else
let extension = "h"
endif
Como alternativa, crie um dicionário que mapeie extensões conhecidas para extensões alternativas potencialmente válidas. Ou use globpath()
para obter todas as alternativas possíveis para o arquivo atual:
let alternates = globpath(expand("%:h"), root . ".*")
e escolha o primeiro, ou o que for. Eu prefiro a globpath
abordagem, com algumas esperanças extras que descreverei mais adiante. Depois de escolher a extensão de destino, forme o caminho de destino completo:
let target = root . "." . alternates[whicheverAlternateExtensionYouWant]
Agora você pode abrir o arquivo alternativo na janela atual:
execute "edit " . target
Ou use winnr()
para obter o número da "outra janela" ( winnr("#")
é a janela para a qual <C-W>p
saltaria, ou você pode codificá-lo se souber que sempre será o mesmo para a sua instalação) e faça algo como:
let window = winnr("#")
execute window . "wincmd w"
execute "edit " . target
Isso fornece uma solução realmente básica para abrir arquivos alternativos. Existem algumas deficiências com a abordagem acima, desde que eu a escrevi para ser direta e é um pouco improvisada. Eu escrevi um plug - in que alterna a troca de arquivos "do jeito que eu queria" (percorrendo todos os globpath()
resultados disponíveis ). Ele resolve alguns dos problemas com a simplicidade do exposto acima. Você pode verificar sua implementação se estiver interessado em explorar mais.
Finalmente, o ponto "restaurar posição do cursor". Guardei-o por último, uma vez que é ortogonal à coisa de troca alternativa (meu plug-in não lida com isso, por exemplo), mas você pode colocá-lo em sua função se quiser criar o seu próprio. :help line()
possui um comando automático útil para restaurar a posição do cursor para onde estava quando o arquivo foi aberto pela última vez:
:au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif
Acabei de colocar isso, ou algo muito semelhante, no meu, .vimrc
já que prefiro o comportamento o tempo todo. Você poderia facilmente colocar o código em outro lugar.
:h line()
(solução genérica): "Este comando automático salta para a última posição conhecida em um arquivo logo após abri-lo, se a marca '" estiver definida:: au BufReadPost * if line ("' \ "")> 1 && linha ("'\" ") <= linha (" $ ") | exe "normal! g` \" "| endif