Hay tres pasos principales para lograr lo que estás pidiendo:
- obtener el nombre del archivo alternativo
- abrir ese archivo en la ventana actual o en otra ventana como desee
- restaurar la posición del cursor dentro de ese archivo
Para encontrar el nombre de archivo alternativo, desea dividir el nombre del archivo actual en la "raíz" y la "extensión". Una forma simple de hacer esto es:
let parts = split(expand("%:p"), "[.]");
let root = parts[0]
let extension = parts[1]
Si sabe que sólo ha vuelto a la interfaz entre .h
y .cpp
archivos, puede cambiar la extensión de una a otra con facilidad:
if extension == "h"
let extension = "cpp"
else
let extension = "h"
endif
Alternativamente, cree un diccionario que asigne extensiones conocidas a extensiones alternativas potencialmente válidas. O use globpath()
para obtener todas las alternativas posibles para el archivo actual:
let alternates = globpath(expand("%:h"), root . ".*")
y elige el primero, o lo que sea. Prefiero el globpath
enfoque, con algunos conocimientos adicionales que describiré más adelante. Una vez que haya elegido la extensión de destino, forme la ruta de destino completa:
let target = root . "." . alternates[whicheverAlternateExtensionYouWant]
Ahora puede abrir el archivo alternativo en la ventana actual:
execute "edit " . target
O use winnr()
para obtener el número de "otra ventana" ( winnr("#")
es la ventana a la que <C-W>p
saltaría, o puede codificarlo si sabe que siempre será el mismo para su configuración) y hacer algo como:
let window = winnr("#")
execute window . "wincmd w"
execute "edit " . target
Esto le brinda una solución realmente básica para abrir archivos alternativos. Hay algunas deficiencias con el enfoque anterior, ya que lo escribí para ser sencillo y está un poco fuera de lugar. He escrito un complemento que alterna el cambio de archivos "de la manera que quería" (recorriendo todos los globpath()
resultados disponibles ). Aborda algunos de los problemas con la simplicidad de lo anterior, puede consultar su implementación si está interesado en explorar más.
Finalmente, el punto "restaurar la posición del cursor". Lo guardé para el final ya que es ortogonal a la cosa de cambio alternativo (mi plugin no lo maneja, por ejemplo), pero podría ponerlo en su función si va a rodar el suyo. :help line()
tiene un comando automático que es útil para restaurar la posición del cursor donde estaba cuando se abrió el archivo por última vez:
:au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif
Acabo de poner eso, o algo muy similar, en mi .vimrc
puesto que prefiero el comportamiento todo el tiempo. Sin embargo, podría simplemente poner el código en otro lugar.
:h line()
(solución genérica): "Este comando automático salta a la última posición conocida en un archivo justo después de abrirlo, si la marca '" está establecida:: au BufReadPost * if line ("' \ "")> 1 && line ("'\" ") <= line (" $ ") | exe "normal! g` \" "| endif