Vim BufLeave Ereignis seltsames Verhalten mit <cw> <cf>

Oct 11 2020

Wie zu reproduzieren

  1. Führen Sie vim --cleaneine Datei aus, die einen anderen Dateinamen enthält.
  2. Führen Sie nun diese Befehle aus
:set number relativenumber
:autocmd BufLeave * set norelativenumber | echoerr "BufLeave triggered"
  1. Verwenden Sie nun <C-w><C-f>den Dateinamen, um ihn in einem neuen Fenster zu öffnen.

Erwartetes Verhalten

Ich erwarte, dass dieser Befehl set norelativenumberim ursprünglichen Puffer ausgeführt wird, wenn die andere Datei in einem anderen Fenster geöffnet wird. Genau wie es ist, wenn Sie sich in Ihren Fenstern bewegen, die verschiedene Puffer mit enthalten <C-w><C-w>.

Was geschieht

Das Ereignis wird ausgelöst, aber set norelativenumbernicht im linken Puffer ausgeführt.

Es sieht für mich wie ein Fehler aus, vermisse ich etwas?

Ich verwende übrigens Vim Version 8.2.1821.

Antworten

1 user938271 Oct 11 2020 at 04:24

'relativenumber'ist eine fensterlokale Option, keine pufferlokale, daher ist es sinnvoller, sie WinLeaveanstelle von zu verwenden BufLeave. Während meiner begrenzten Tests schien es Ihr Problem zu beheben. Das 'relativenumber'wurde zurückgesetzt, wenn ein Fenster nach dem Drücken <c-w><c-f>auf einen Dateipfad verlassen wurde:

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

Weitere Informationen finden Sie unter : help 'rnu' :

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