Neovim-Setup unter Windows (nativ)
Checkliste für die Übernahme der bestehenden nvim/-Config aus dem Dotfiles-Repo auf ein natives Windows-System (kein WSL). Repo selbst bleibt unverändert.
Alle Windows-Skripte in diesem Repo sind reines PowerShell (kein Git Bash, kein WSL) – mit einer Ausnahme: windows\bin\gmake.cmd ist ein trivialer Ein-Zeiler-Wrapper, für den sich eine .ps1-Datei nicht lohnt.
0. Von Hand zu erledigen (nicht durch Skripte abgedeckt)
wingetselbst muss vorhanden sein (“App Installer” aus dem Microsoft Store) –bootstrap-win/neovim.ps1prüft das und bricht mit klarer Meldung ab, kannwingetaber nicht selbst nachinstallieren.- Nach jedem Skript-Lauf ein neues Terminal öffnen, bevor
nvimdas erste Mal gestartet wird. PATH-Änderungen (durch winget/npm-Installer oderinstall-win.ps1) landen in der Registry, aber die aktuell offene Shell bekommt das nicht automatisch mit. - PATH-Registrierung stichprobenartig prüfen – manche winget-Pakete tragen sich nicht automatisch in den PATH ein (im Praxistest z. B.
LLVM.LLVM: bereits installiert, aberclangdnicht im PATH, vermutlich weil der--silent-Installer die PATH-Registrierung überspringt). Nach einem neuen Terminal kurzGet-Command clangd, jq, makeaufrufen; fehlt eins, dessen Installationsordner (bei LLVM z. B.C:\Program Files\LLVM\bin) manuell zum User-PATH hinzufügen (gleiches Muster wieAdd-BinToUserPathininstall-win.ps1). - yamlfmt, gawk, xmllint (libxml2), djlint, yamllint manuell installieren, falls benötigt – im Praxistest bestätigt, dass es dafür keine winget-Pakete gibt (“Es wurde kein Paket gefunden, das den Eingabekriterien entspricht”), deshalb absichtlich nicht in
bootstrap-win/neovim.ps1enthalten. Betrifft die Formatierung von awk-, xml/xsd-, yaml- und jinja-Dateien (conform.nvimfällt sonst auf LSP-Formatierung zurück, fürjinjagibt es aktuell keinen LSP-Fallback). Bekannte Alternativen: yamlfmt viago install github.com/google/yamlfmt/cmd/yamlfmt@latest(falls Go installiert) oder Binary von den GitHub-Releases; djlint und yamllint sind reine Python-Pakete, daherpip install djlint yamllintbzw.pipx install djlintundpipx install yamllint(Python muss dafür separat installiert sein, siehe Abschnitt 1) – ohne yamllint lintednvim-lintYAML-Dateien unter Windows einfach nicht; für gawk/xmllint keine verifizierte Windows-native Quelle gefunden, ggf.winget search gawk/winget search libxml2selbst prüfen. - Reihenfolge:
install-win.ps1,bootstrap-win/git.ps1,bootstrap-win/neovim.ps1undbootstrap-win/neovim-dict.ps1sind unabhängig voneinander. Empfehlenswert: erst Neovim/Node (Abschnitt 1) installieren, dann alle Bootstrap-Skripte laufen lassen, dann neues Terminal öffnen, dannnvimstarten (lädt beim ersten Start automatisch alle Lua-Plugins vialazy.nvim– Internetverbindung nötig). - Neovim immer aus einer “Developer PowerShell for VS” starten (Startmenü-Eintrag, den Visual Studio/die Build Tools mitbringen), nicht aus normalem Windows Terminal/PowerShell.
cl.exe(MSVC) braucht dieINCLUDE/LIB-Umgebungsvariablen ausvcvarsall.bat, die nur in dieser Developer-Shell gesetzt sind – siehe Abschnitt 4.
1. Grundwerkzeuge installieren
Execution Policy einmalig setzen, sonst starten die .ps1-Skripte in diesem Repo gar nicht (Alternative pro Aufruf: powershell -ExecutionPolicy Bypass -File .\skript.ps1):
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
winget install Neovim.Neovim
winget install OpenJS.NodeJS.LTS
Git und delta (Pager, von git/config vorausgesetzt: pager = delta, diffFilter = delta --color-only) installiert bootstrap-win/git.ps1:
.\bootstrap-win\git.ps1
(Kein Python nötig – der Python-Provider ist in options.lua deaktiviert. Auch kein separater C-Compiler nötig – MSVC ist auf den Zielsystemen bereits vorhanden, siehe Abschnitt 3 bzw. 4. Nur für djlint als Jinja-Formatter wird optional ein eigenes Python benötigt, siehe Abschnitt 0.)
2. Konfiguration einrichten (Windows-nativer Weg)
install-win.ps1 im Repo-Root ausführen:
.\install-win.ps1
Es kopiert (keine Symlinks, keine Admin-Rechte nötig):
nvim/→%LOCALAPPDATA%\nvimgit/config→%USERPROFILE%\.gitconfiggit/config-up2parts→%USERPROFILE%\.config\git\config-up2parts(Pfad ist imincludeIfvongit/confighartkodiert)npm/npmrc→%USERPROFILE%\.npmrc(nur falls dort noch keine Datei existiert) – die Zeileprefix=${HOME}/.localwird dabei auskommentiert:HOMEist unter Windows i. d. R. nicht gesetzt, npm nutzt dort ohnehin schon von Haus aus%APPDATA%\npmals Präfix
Nach Änderungen im Repo install-win.ps1 erneut ausführen, um die Kopien zu aktualisieren.
3. Externe Abhängigkeiten
bootstrap/neovim.sh bricht unter Windows sofort ab (Nicht unterstütztes Betriebssystem). Stattdessen bootstrap-win/neovim.ps1 ausführen (reines PowerShell, kein Git Bash/WSL nötig):
.\bootstrap-win\neovim.ps1
Installiert per winget/npm: Git, Node, Formatter (jq, prettier, ruff, shfmt, stylua), Tools (ripgrep, fd, tree-sitter-cli, make über ezwinports.make) und LSP-Server (basedpyright, bash-language-server, clangd, shellcheck, vscode-langservers-extracted, lua-language-server, prisma, vtsls). Im Praxistest (24.07.2026) erfolgreich; yamlfmt/gawk/xmllint/djlint/yamllint bewusst nicht enthalten (siehe Abschnitt 0). Einzelne Pakete, die trotzdem fehlschlagen, werden als Warnung gemeldet statt das Skript abzubrechen, inklusive der letzten Zeilen der winget-Fehlermeldung.
Kein C-Compiler-Paket enthalten: MSVC ist auf den Zielsystemen bereits vorhanden, nvim-treesitter nutzt cl.exe. Dafür muss Neovim aber aus einer “Developer PowerShell for VS” gestartet werden (siehe Abschnitt 4).
windows\bin (enthält gmake.cmd, Wrapper für opt.makeprg = "gmake") danach einmalig zum PATH hinzufügen (PowerShell, User-Scope – nicht setx PATH "%PATH%;..." verwenden, das würde den kompletten Prozess-PATH inkl. System-Anteil dauerhaft in den User-PATH kopieren):
$userPath = [Environment]::GetEnvironmentVariable("PATH", "User")
[Environment]::SetEnvironmentVariable("PATH", "$userPath;$env:USERPROFILE\dotfiles\windows\bin", "User")
4. Bekannte Stolpersteine
- C-Compiler für
nvim-treesitter(MSVC):cl.exefindetnvim-treesitterautomatisch, aber nur wennINCLUDE/LIBgesetzt sind – das passiert ausschließlich in einer “Developer PowerShell for VS” bzw. “x64 Native Tools Command Prompt”, nicht in einer normalen PowerShell/Windows Terminal-Sitzung. Ohne das schlägt die Parser-Kompilierung mit einer Meldung wie “cannot find<header>.h” fehl, obwohlcl.exeselbst gefunden wird. Neovim also immer aus dieser Developer-Shell heraus starten. - clangd bei MSVC-Projekten (z. B. mit
compile_commands.jsonaus einemmsbuild-Rebuild): gleicher Grund wie oben. Eine generiertecompile_commands.jsonenthält nur die projektspezifischen/I-Pfade (vcpkg, NuGet-SDKs), nicht die MSVC-STL-/Windows-SDK-Header – die beziehtclang-cl(wiecl.exe) überINCLUDE/LIB. Ohne Developer-Shell meldet clangd<string>/<windows.h>etc. als nicht gefunden, obwohl die Projekt-Header aufgelöst werden.
5. Verifizieren
nvim
:checkhealth
:checkhealth zeigt fehlende Provider/Tools direkt an – guter letzter Schritt nach der Installation.
6. Aktualisieren
Pendant zu brew update && brew upgrade (macOS) bzw. pkg update && pkg upgrade (FreeBSD):
winget source update # Paketquellen aktualisieren
winget upgrade --all # alle winget-Pakete aktualisieren
Vorschau, was aktualisiert würde, ohne etwas zu ändern:
winget list --upgrade-available
Einzelnes Paket gezielt aktualisieren (IDs siehe bootstrap-win/neovim.ps1):
winget upgrade LLVM.LLVM
Zwei Besonderheiten gegenüber brew/pkg:
- Manche Pakete melden nicht immer zuverlässig eine neue Version (z. B. ältere/portable Pakete).
winget upgrade --all --include-unknownbezieht auch diese mit ein, installiert dabei aber unter Umständen unnötig neu. - Ein Paket dauerhaft von
--allausnehmen:winget pin add <id>(Pendant zubrew pin).
Die npm-Pakete (prettier, basedpyright, bash-language-server, vtsls, @prisma/language-server, vscode-langservers-extracted) laufen außerhalb von winget und werden separat aktualisiert:
npm update -g
bootstrap-win/neovim.ps1 erneut auszuführen aktualisiert nichts – Install-WingetPackage/Install-NpmPackage überspringen ein Paket, sobald das Binary gefunden wird (siehe Write-Skip). Für Updates immer die Befehle oben verwenden.
