Come posso modificare la finestra a cui salteranno ctrl + w, ctrl + p?

Aug 15 2020

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 autocmdsimile

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 SpecialWindowda 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

1 filbranden Aug 15 2020 at 22:50

Un'opzione è salvare ciò che era la finestra precedente prima del windocomando. 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 windocomando. 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 forciclo 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 forcicli 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 forciclo.

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