Comment puis-je modifier la fenêtre vers laquelle ctrl + w, ctrl + p va sauter?
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 autocmd
comme le suivant
autocmd BufEnter SpecialWindow call MyFunction()
où
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 SpecialWindow
from 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
Une option consiste à enregistrer ce qu'était la fenêtre précédente avant la windo
commande. 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 windo
commande. 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 for
boucle 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 for
boucles 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 for
boucle.
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