Come posso modificare la finestra a cui salteranno ctrl + w, ctrl + p?
Quello che sto cercando è un modo programmatico per cambiare la finestra Ctrl+ w, Ctrl+ pa cui passare.
Il motivo per cui voglio farlo è che ho un autocmd
simile
autocmd BufEnter SpecialWindow call MyFunction()
dove
function! MyFunction()
let current_win_id = win_getid()
windo ...
call win_gotoid(current_win_id)
endfunction
quindi, non appena salto a SpecialWindow
da AnotherWindow
, il significato di Ctrl+ w, Ctrl+ pè tale che non salta a AnotherWindow
( comportamento desiderato ), ma salta alla finestra in basso a destra, l'ultima visitata da windo
.
Se sei interessato al motivo per cui sto facendo questa domanda, per favore guarda questo .
Risposte
Un'opzione è salvare ciò che era la finestra precedente prima del windo
comando. Quindi, in seguito, salta a quella finestra prima di saltare alla finestra di destinazione.
funzione! MyFunction () lascia previous_win_id = win_getid (winnr ('#')) lascia current_win_id = win_getid () windo ... chiama win_gotoid (previous_win_id) chiama win_gotoid (current_win_id) funzione finale
Una soluzione migliore, tuttavia, è utilizzare la win_execute()funzione invece del windo
comando. La win_execute()
funzione impedisce gli effetti collaterali di entrare in una finestra durante l'esecuzione di un comando in quella finestra, che include l'aggiornamento della finestra precedente (e anche della finestra corrente).
È necessario utilizzare un for
ciclo esplicito per eseguire il comando su ogni finestra. È possibile utilizzare gettabinfo()per trovare gli ID finestra delle finestre nella scheda corrente.
funzione! MyFunction () per winid in gettabinfo (tabpagenr ()) [0] ['windows'] chiama win_execute (winid, '...') endfor funzione finale
Se si desidera iterare su ogni finestra in ogni scheda, è possibile utilizzare gettabinfo()
senza argomenti (per ottenere informazioni per tutte le schede) e due for
cicli nidificati (uno per l'elenco delle schede, quindi un altro per le finestre in quella scheda. Oppure puoi usare getwininfo()
direttamente, che restituisce le informazioni per tutte le finestre in tutte le schede in un elenco appiattito, quindi hai bisogno di un singolo for
ciclo.
Se stai semplicemente cercando di impostare una variabile o un'opzione nelle altre finestre (es. Disabilita 'relativenumber'
), puoi usare setwinvar()per le finestre nella scheda corrente o settabwinvar()più in generale.
Ad esempio, per disabilitare 'relativenumber'
in tutte le finestre di tutte le schede:
funzione! MyFunction () per tabinfo in gettabinfo () let tabnr = tabinfo ["tabnr"] per winid in tabinfo ['windows'] chiama settabwinvar (tabnr, winid, '& relativenumber', 0) endfor endfor funzione finale