aboutsummaryrefslogtreecommitdiff

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)

  • winget selbst muss vorhanden sein (“App Installer” aus dem Microsoft Store) – bootstrap-win/neovim.ps1 prüft das und bricht mit klarer Meldung ab, kann winget aber nicht selbst nachinstallieren.
  • Nach jedem Skript-Lauf ein neues Terminal öffnen, bevor nvim das erste Mal gestartet wird. PATH-Änderungen (durch winget/npm-Installer oder install-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, aber clangd nicht im PATH, vermutlich weil der --silent-Installer die PATH-Registrierung überspringt). Nach einem neuen Terminal kurz Get-Command clangd, jq, make aufrufen; fehlt eins, dessen Installationsordner (bei LLVM z. B. C:\Program Files\LLVM\bin) manuell zum User-PATH hinzufügen (gleiches Muster wie Add-BinToUserPath in install-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.ps1 enthalten. Betrifft die Formatierung von awk-, xml/xsd-, yaml- und jinja-Dateien (conform.nvim fällt sonst auf LSP-Formatierung zurück, für jinja gibt es aktuell keinen LSP-Fallback). Bekannte Alternativen: yamlfmt via go install github.com/google/yamlfmt/cmd/yamlfmt@latest (falls Go installiert) oder Binary von den GitHub-Releases; djlint und yamllint sind reine Python-Pakete, daher pip install djlint yamllint bzw. pipx install djlint und pipx install yamllint (Python muss dafür separat installiert sein, siehe Abschnitt 1) – ohne yamllint linted nvim-lint YAML-Dateien unter Windows einfach nicht; für gawk/xmllint keine verifizierte Windows-native Quelle gefunden, ggf. winget search gawk / winget search libxml2 selbst prüfen.
  • Reihenfolge: install-win.ps1, bootstrap-win/git.ps1, bootstrap-win/neovim.ps1 und bootstrap-win/neovim-dict.ps1 sind unabhängig voneinander. Empfehlenswert: erst Neovim/Node (Abschnitt 1) installieren, dann alle Bootstrap-Skripte laufen lassen, dann neues Terminal öffnen, dann nvim starten (lädt beim ersten Start automatisch alle Lua-Plugins via lazy.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 die INCLUDE/LIB-Umgebungsvariablen aus vcvarsall.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%\nvim
  • git/config%USERPROFILE%\.gitconfig
  • git/config-up2parts%USERPROFILE%\.config\git\config-up2parts (Pfad ist im includeIf von git/config hartkodiert)
  • npm/npmrc%USERPROFILE%\.npmrc (nur falls dort noch keine Datei existiert) – die Zeile prefix=${HOME}/.local wird dabei auskommentiert: HOME ist unter Windows i. d. R. nicht gesetzt, npm nutzt dort ohnehin schon von Haus aus %APPDATA%\npm als 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.exe findet nvim-treesitter automatisch, aber nur wenn INCLUDE/LIB gesetzt 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, obwohl cl.exe selbst gefunden wird. Neovim also immer aus dieser Developer-Shell heraus starten.
  • clangd bei MSVC-Projekten (z. B. mit compile_commands.json aus einem msbuild-Rebuild): gleicher Grund wie oben. Eine generierte compile_commands.json enthält nur die projektspezifischen /I-Pfade (vcpkg, NuGet-SDKs), nicht die MSVC-STL-/Windows-SDK-Header – die bezieht clang-cl (wie cl.exe) über INCLUDE/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-unknown bezieht auch diese mit ein, installiert dabei aber unter Umständen unnötig neu.
  • Ein Paket dauerhaft von --all ausnehmen: winget pin add <id> (Pendant zu brew 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.