Il y a trois étapes principales pour accomplir ce que vous demandez:
- obtenir le nom du fichier alternatif
- ouvrir ce fichier dans la fenêtre actuelle ou dans une autre fenêtre comme vous le souhaitez
- restauration de la position du curseur dans ce fichier
Pour trouver le nom de fichier alternatif, vous souhaitez décomposer le nom de fichier actuel en «racine» et «extension». Un moyen simple de le faire est:
let parts = split(expand("%:p"), "[.]");
let root = parts[0]
let extension = parts[1]
Si vous savez que vous ne faites que basculer entre les fichiers .h
et .cpp
, vous pouvez facilement changer l'extension de l'un à l'autre:
if extension == "h"
let extension = "cpp"
else
let extension = "h"
endif
Vous pouvez également créer un dictionnaire mappant les extensions connues à des extensions alternatives potentiellement valides. Ou utilisez globpath()
pour obtenir toutes les alternatives possibles pour le fichier actuel:
let alternates = globpath(expand("%:h"), root . ".*")
et choisissez le premier, ou autre chose. Je préfère l' globpath
approche, avec quelques astuces supplémentaires que je décrirai plus tard. Une fois que vous avez choisi l'extension cible, formez le chemin cible complet:
let target = root . "." . alternates[whicheverAlternateExtensionYouWant]
Vous pouvez maintenant ouvrir le fichier alternatif dans la fenêtre actuelle:
execute "edit " . target
Ou utilisez winnr()
pour obtenir le numéro de "l'autre fenêtre" ( winnr("#")
c'est la fenêtre vers laquelle <C-W>p
sauter, ou vous pouvez la coder en dur si vous savez qu'elle sera toujours la même pour votre configuration) et faites quelque chose comme:
let window = winnr("#")
execute window . "wincmd w"
execute "edit " . target
Cela vous donne une solution vraiment basique pour ouvrir des fichiers alternatifs. Il y a quelques lacunes avec l'approche ci-dessus, car je l'ai écrite pour être simple et c'est un peu à l'improviste. J'ai écrit un plugin qui alterne le changement de fichier "comme je le voulais" (en parcourant tous les globpath()
résultats disponibles ). Il résout certains des problèmes liés à la simplicité de ce qui précède, vous pouvez vérifier sa mise en œuvre si vous souhaitez en savoir plus.
Enfin, le point "restaurer la position du curseur". Je l'ai gardé pour la dernière fois car il est orthogonal à la chose de commutation alternative (mon plugin ne le gère pas par exemple), mais vous pouvez le mettre dans votre fonction si vous voulez rouler le vôtre. :help line()
a une autocommande qui est utile pour restaurer la position du curseur à l'endroit où il était lors de la dernière ouverture du fichier:
:au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif
Je mets juste ça, ou quelque chose de très similaire, dans mon .vimrc
puisque je préfère le comportement tout le temps. Cependant, vous pouvez facilement mettre le code ailleurs.
:h line()
(solution générique): "Cette autocommande saute à la dernière position connue dans un fichier juste après son ouverture, si la marque" "est définie:: au BufReadPost * if line (" ' \ "")> 1 && ligne ("'\" ") <= ligne (" $ ") | exe "normal! g` \" "| endif