Ci sono tre passaggi principali per realizzare ciò che stai chiedendo:
- ottenere il nome del file alternativo
- aprendo quel file nella finestra corrente o in un'altra finestra come desiderato
- ripristinare la posizione del cursore all'interno di quel file
Per trovare il nome del file alternativo che si desidera suddividere il nome del file corrente in "root" e "estensione". Un modo semplice per farlo è:
let parts = split(expand("%:p"), "[.]");
let root = parts[0]
let extension = parts[1]
Se sai che stai sempre passando da .h
e a .cpp
file, puoi facilmente modificare l'estensione da uno all'altro:
if extension == "h"
let extension = "cpp"
else
let extension = "h"
endif
In alternativa, creare un dizionario che associa estensioni conosciute a estensioni alternative potenzialmente valide. Oppure usa globpath()
per ottenere tutte le alternative possibili per il file corrente:
let alternates = globpath(expand("%:h"), root . ".*")
e scegli il primo, o qualsiasi altra cosa. Preferisco l' globpath
approccio, con qualche intelligenza in più che descriverò più avanti. Dopo aver selezionato l'estensione di destinazione, formare il percorso target completo:
let target = root . "." . alternates[whicheverAlternateExtensionYouWant]
Ora puoi aprire il file alternativo nella finestra corrente:
execute "edit " . target
Oppure usa winnr()
per ottenere il numero "altra finestra" ( winnr("#")
è la finestra su cui <C-W>p
saltare, oppure puoi codificarlo se sai che sarà sempre lo stesso per la tua configurazione) e fare qualcosa del tipo:
let window = winnr("#")
execute window . "wincmd w"
execute "edit " . target
Questo ti offre una soluzione davvero basilare per l'apertura di file alternativi. Ci sono alcune carenze con l'approccio sopra, dal momento che l'ho scritto per essere semplice ed è un po 'fuori dal comune. Ho scritto un plug-in che alterna i file cambiando "come volevo" (scorrendo tutti i globpath()
risultati disponibili ). Risolve alcuni dei problemi con la semplicità di quanto sopra, puoi verificarne l'implementazione se sei interessato a esplorare di più.
Infine, il punto "ripristina posizione cursore". L'ho salvato per ultimo poiché è ortogonale alla cosa di commutazione alternativa (il mio plug-in non lo gestisce ad esempio), ma potresti metterlo nella tua funzione se vuoi lanciare il tuo. :help line()
ha un autocommand utile per ripristinare la posizione del cursore nella posizione in cui era stato aperto l'ultima volta il file:
:au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif
L'ho appena inserito, o qualcosa di molto simile, .vimrc
perché preferisco il comportamento in ogni momento. Tuttavia, potresti semplicemente inserire il codice altrove.
:h line()
(soluzione generica): "Questo comando automatico passa all'ultima posizione nota in un file subito dopo averlo aperto, se il segno" "è impostato:: au BufReadPost * if line (" ' \ "")> 1 && line ("'\" ") <= line (" $ ") | exe "normal! g` \" "| endif