¿Cómo puedo alterar la ventana a la que saltará ctrl + w, ctrl + p?

Aug 15 2020

Lo que estoy buscando es una forma programática de cambiar a qué ventana Ctrl+ w, Ctrl+ psaltará.

La razón por la que quiero hacer esto es que tengo una autocmdcomo la siguiente

autocmd BufEnter  SpecialWindow call MyFunction()

dónde

function! MyFunction()
    let current_win_id = win_getid()
    windo ...
    call win_gotoid(current_win_id)
endfunction

por lo tanto, tan pronto como salto a SpecialWindowdesde AnotherWindow, el significado de Ctrl+ w, Ctrl+ pes tal que no salta a AnotherWindow( comportamiento deseado ), sino que salta a la ventana inferior derecha, la última visitada por windo.

Si está interesado en saber por qué hago esta pregunta, consulte esto .

Respuestas

1 filbranden Aug 15 2020 at 22:50

Una opción es que guarde lo que era la ventana anterior antes del windocomando. Luego, más tarde, salte a esa ventana antes de saltar a su ventana de destino.

¡función! MyFunction ()
   let previous_win_id = win_getid (winnr ('#'))
  deje current_win_id = win_getid ()
  ventana ...
  llamar win_gotoid (previous_win_id)
  llamar win_gotoid (current_win_id)
función final

Sin embargo, una mejor solución es usar la win_execute()función en lugar del windocomando. La win_execute()función evita los efectos secundarios de ingresar a una ventana mientras se ejecuta un comando en esa ventana, que incluye actualizar la ventana anterior (y también la ventana actual).

Debe utilizar un forbucle explícito para ejecutar el comando en cada ventana. Puede utilizar gettabinfo()para buscar los identificadores de ventana de las ventanas en la pestaña actual.

¡función! MiFunción ()
  para winid en gettabinfo (tabpagenr ()) [0] ['windows']
    llamar win_execute (winid, '...')
  fin de
función final

Si desea iterar sobre cada ventana en cada pestaña, puede usar gettabinfo()sin argumentos (para obtener información para todas las pestañas) y dos forbucles anidados (uno para la lista de pestañas, luego otro para las ventanas en esa pestaña. O puede usar getwininfo()directamente, que devuelve información para todas las ventanas en todas las pestañas en una lista aplanada, por lo que necesita un solo forbucle.

Si simplemente está intentando establecer una variable u opción en las otras ventanas (por ejemplo, deshabilitar 'relativenumber'), entonces puede usar setwinvar()para las ventanas en la pestaña actual, o de manera settabwinvar()más general.

Por ejemplo, para deshabilitar 'relativenumber'en todas las ventanas de todas las pestañas:

¡función! MiFunción ()
  para tabinfo en gettabinfo ()
    let tabnr = tabinfo ['tabnr']
    para winid en tabinfo ['windows']
      llamar settabwinvar (tabnr, winid, '& numero relativo', 0)
    fin de
  fin de
función final