Vim BufLeave événement étrange comportement avec <cw> <cf>

Oct 11 2020

Comment reproduire

  1. Exécuter vim --cleansur un fichier contenant un autre nom de fichier.
  2. Maintenant, exécutez ces commandes
:set number relativenumber
:autocmd BufLeave * set norelativenumber | echoerr "BufLeave triggered"
  1. Maintenant, utilisez <C-w><C-f>le nom de fichier pour l'ouvrir dans une nouvelle fenêtre.

Comportement attendu

Je m'attends à ce que cette commande fasse set norelativenumbersur le tampon d'origine lors de l'ouverture de l'autre fichier sur une autre fenêtre. Tout comme c'est le cas lorsque vous vous déplacez simplement dans vos fenêtres contenant différents tampons avec <C-w><C-w>.

Ce qui se produit

L'événement est déclenché, mais set norelativenumbern'est pas exécuté sur le tampon gauche.

Cela me semble être un bug, est-ce que je manque quelque chose?

J'utilise la version 8.2.1821 de Vim au fait.

Réponses

1 user938271 Oct 11 2020 at 04:24

'relativenumber'est une option locale à la fenêtre, pas une option locale à la mémoire tampon, il est donc plus logique de l'utiliser à la WinLeaveplace de BufLeave. Au cours de mes tests limités, cela a semblé résoudre votre problème. Cela a 'relativenumber'été réinitialisé en quittant une fenêtre après avoir appuyé <c-w><c-f>sur un chemin de fichier:

vim9script
set number relativenumber
autocmd WinLeave * set norelativenumber
mkdir('/tmp/test_nornu', 'p')
writefile(['hello, I am file1'], '/tmp/test_nornu/file1')
var lines =<< trim END
    some text line
    /tmp/test_nornu/file1
    another text line
END
writefile(lines, '/tmp/test_nornu/file2')
e /tmp/test_nornu/file2
norm! 2G
winnr()->getwinvar('&rnu', -1)->assert_equal(1)
exe "wincmd \<c-f>"
winnr('#')->getwinvar('&rnu', -1)->assert_equal(0)
echom v:errors

Pour plus d'informations, voir : help 'rnu' :

'relativenumber' 'rnu'  boolean (default off)
                        local to window