Winterputz

Ein knappes halbes Jahr nach der Veröffentlichung von Vim 9.0 widme ich mich endlich dem Upgrade von .vimrc auf Vim9 Script. Auf den ersten Blick sind das neue Kommentarzeichen, die geänderte Variablendeklaration und die vereinfachte Funktionssyntax keine großen Herausforderungen, aber der Teufel steckt im Detail. Die Angabe von ranges für Kommandos erfordert nun ein Präfix (:), und in many places ist Weißraum obligatorisch (während er beim Setzen von Optionen – set formatoptions+=n – nach wie vor untersagt ist).

Ich nutze die Gelegenheit, um meine überbordende .vimrc mit Hilfe von filetype plugins etwas zu verschlanken und bei dieser Gelegenheit die unterschiedlichen Mappings für Markup-Sprachen zu vereinheitlichen:

# ~/.vim/ftplugins/markdown.vim vnoremap <buffer> <silent> ,b <Esc>`>a**<Esc>`<i**<Esc> vnoremap <buffer> <silent> ,a <Esc>`>a]()<Esc>P`<i[<Esc> # ~/.vim/ftplugins/html.vim vnoremap <buffer> ,a <Esc>`>a</a><Esc>`<i<a href="<Esc>pa"><Esc> vnoremap <buffer> ,b <Esc>`>a</strong><Esc>`<i<strong><Esc>

Besonders tückisch ist, dass html.vim auch für Markdown-Buffer geladen wird (mit sehr verwirrenden Konsequenzen), wenn man nicht frühzeitig eingreift:

# ~/.vim/ftplugins/html.vim if &ft == "markdown" finish endif

Ebenfalls nicht trivial ist die Handhabung des substitute-Kommandos im virtual mode. Einfache Funktionen könnten im Prinzip unmittelbar als Mapping realisiert werden:

def g:AddLinebreaks() silent s/.\zs\n\ze./\<br \/\>\r/ge nohl enddef vnoremap <f3> :call AddLinebreaks()<CR>

Interessant wird es, wenn ein Kommando innerhalb der Funktion die Markierung als Ganze behandeln soll, während das substitute-Kommando auf jeder Zeile operieren muss:

def g:EncloseParagraphs() execute "normal `>a</p>\<Esc>`<i<p>\<Esc>" silent :%s/\%V\n\{2,}\%V/<\/p>\r\r<p>/ge nohl enddef vnoremap <buffer> <silent> ,p :<C-U>call EncloseParagraphs()<CR>

Mittels <C-U> wird verhindert, dass die gesamte Funktion (einschließlich des execute-Kommandos) für jede Zeile innerhalb der Markierung ausgeführt wird. Das substitute-Präfix :% verschafft diesem Kommando dann eine maximale Reichweite (alle Zeilen des Buffers), die schließlich durch das Musteratom \%V wieder auf die ursprüngliche Markierung begrenzt wird.

Diep Pham bringt es auf den Punkt:

Q: Is it worth converting all my vim scripts to Vim9 script?
A: IMO, no. The syntax looks a little better to read and write, but not by a huge margin. But if you have some free time, why not?