Comment puis-je modifier la fenêtre vers laquelle ctrl + w, ctrl + p va sauter?

Aug 15 2020

Ce que je recherche, c'est un moyen programmatique de changer la fenêtre Ctrl+ w, Ctrl+ pvers laquelle sautera.

La raison pour laquelle je veux faire cela est que j'ai un autocmdcomme le suivant

autocmd BufEnter  SpecialWindow call MyFunction()

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

par conséquent, dès que je passe au SpecialWindowfrom AnotherWindow, la signification de Ctrl+ w, Ctrl+ pest telle qu'elle ne saute pas à AnotherWindow( comportement souhaité ), mais elle saute à la fenêtre en bas à droite, la dernière visitée par windo.

Si vous souhaitez savoir pourquoi je pose cette question, veuillez consulter ceci .

Réponses

1 filbranden Aug 15 2020 at 22:50

Une option consiste à enregistrer ce qu'était la fenêtre précédente avant la windocommande. Ensuite, plus tard, passez à cette fenêtre avant de sauter à votre fenêtre cible.

fonction! MyFunction ()
   let previous_win_id = win_getid (winnr ('#'))
  laissez current_win_id = win_getid ()
  Windo ...
  appeler win_gotoid (previous_win_id)
  appeler win_gotoid (current_win_id)
fonction finale

Une meilleure solution, cependant, est d'utiliser la win_execute()fonction au lieu de la windocommande. La win_execute()fonction empêche les effets secondaires d'entrer dans une fenêtre lors de l'exécution d'une commande dans cette fenêtre, qui comprend la mise à jour de la fenêtre précédente (et de la fenêtre actuelle également.)

Vous devez utiliser une forboucle explicite pour exécuter la commande sur chaque fenêtre. Vous pouvez utiliser gettabinfo()pour trouver les identifiants de fenêtre des fenêtres dans l'onglet actuel.

fonction! MaFonction ()
  pour winid dans gettabinfo (tabpagenr ()) [0] ['windows']
    appeler win_execute (winid, '...')
  fin pour
fonction finale

Si vous souhaitez parcourir chaque fenêtre de chaque onglet, vous pouvez soit utiliser gettabinfo()sans argument (pour obtenir des informations pour tous les onglets) et deux forboucles imbriquées (une pour la liste des onglets, puis une autre pour les fenêtres de cet onglet. Ou vous pouvez utiliser getwininfo()directement, qui renvoie des informations pour toutes les fenêtres de tous les onglets d'une liste aplatie, vous avez donc besoin d'une seule forboucle.

Si vous essayez simplement de définir une variable ou une option dans les autres fenêtres (par exemple, désactiver 'relativenumber'), vous pouvez utiliser setwinvar()pour les fenêtres de l'onglet actuel, ou settabwinvar()plus généralement.

Par exemple, pour désactiver le 'relativenumber'dans toutes les fenêtres de tous les onglets:

fonction! MaFonction ()
  pour tabinfo dans gettabinfo ()
    let tabnr = tabinfo ['tabnr']
    pour winid dans tabinfo ['windows']
      appeler settabwinvar (tabnr, winid, '& relativenumber', 0)
    fin pour
  fin pour
fonction finale