aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bootstrap-win/neovim-dict.ps164
-rw-r--r--bootstrap-win/neovim.ps1177
-rw-r--r--install-win.ps1110
-rw-r--r--neovim-windows-setup.md112
-rw-r--r--windows/bin/gmake.cmd11
5 files changed, 474 insertions, 0 deletions
diff --git a/bootstrap-win/neovim-dict.ps1 b/bootstrap-win/neovim-dict.ps1
new file mode 100644
index 0000000..7909ffa
--- /dev/null
+++ b/bootstrap-win/neovim-dict.ps1
@@ -0,0 +1,64 @@
1#Requires -Version 5.1
2<#
3 Windows-natives Pendant zu bootstrap/neovim-dict.sh.
4 Laedt die deutschen Rechtschreib-Woerterbuecher fuer Neovim herunter.
5 bootstrap/neovim-dict.sh bleibt unveraendert.
6
7 Aufruf:
8 .\bootstrap-win\neovim-dict.ps1
9
10 Falls die Ausfuehrung durch die Execution Policy blockiert wird:
11 powershell -ExecutionPolicy Bypass -File .\bootstrap-win\neovim-dict.ps1
12#>
13
14$ErrorActionPreference = "Stop"
15
16function Write-Ok($msg) {
17 Write-Host "OK $msg" -ForegroundColor Green
18}
19
20function Write-Step($msg) {
21 Write-Host "==> $msg" -ForegroundColor Cyan
22}
23
24function Write-SkipMsg($msg) {
25 Write-Host "- $msg bereits vorhanden" -ForegroundColor DarkGray
26}
27
28# Nativer Windows-Datenpfad von Neovim (kein XDG_DATA_HOME gesetzt):
29# $env:LOCALAPPDATA\nvim-data\site\spell
30$SpellDir = Join-Path $env:LOCALAPPDATA "nvim-data\site\spell"
31
32$Urls = @(
33 "https://ftp.nluug.nl/pub/vim/runtime/spell/de.utf-8.spl",
34 "https://ftp.nluug.nl/pub/vim/runtime/spell/de.utf-8.sug"
35)
36
37function Get-SpellFile([string]$Url) {
38 $fileName = Split-Path -Leaf $Url
39 $dest = Join-Path $SpellDir $fileName
40
41 if (Test-Path $dest) {
42 Write-SkipMsg $fileName
43 return
44 }
45
46 Write-Step "Lade $fileName herunter"
47 Invoke-WebRequest -Uri $Url -OutFile $dest
48 Write-Ok $fileName
49}
50
51function Main {
52 if (-not (Test-Path $SpellDir)) {
53 New-Item -ItemType Directory -Path $SpellDir -Force | Out-Null
54 }
55
56 foreach ($url in $Urls) {
57 Get-SpellFile $url
58 }
59
60 Write-Host ""
61 Write-Host "Woerterbuecher fuer Neovim installiert!" -ForegroundColor Green
62}
63
64Main
diff --git a/bootstrap-win/neovim.ps1 b/bootstrap-win/neovim.ps1
new file mode 100644
index 0000000..548583e
--- /dev/null
+++ b/bootstrap-win/neovim.ps1
@@ -0,0 +1,177 @@
1#Requires -Version 5.1
2<#
3 Windows-natives Pendant zu bootstrap/neovim.sh (macOS/FreeBSD).
4 bootstrap/neovim.sh bleibt unveraendert - dieses Skript ist bewusst
5 eigenstaendig, da sich die Paketquellen (winget/npm statt brew/pkg) und
6 das Fehlerverhalten zu stark unterscheiden fuer ein gemeinsames Skript.
7
8 Nutzt ausschliesslich native Windows-Werkzeuge (winget, npm, pwsh/
9 powershell.exe) - keine Git-Bash- oder WSL-Abhaengigkeit.
10
11 Aufruf (PowerShell, keine Admin-Rechte noetig):
12 .\bootstrap-win\neovim.ps1
13
14 Hinweis: Einzelne winget-Paket-IDs (v.a. GnuWin32.Gawk, GnuWin32.Libxml2,
15 google.yamlfmt, mvdan.shfmt, astral-sh.ruff) konnten in dieser Session
16 nicht gegen eine aktuelle winget-Quelle verifiziert werden. Schlaegt eine
17 Installation fehl, meldet das Skript das als Warnung (bricht nicht ab)
18 und nennt den Befehl zum manuellen Nachschlagen ("winget search <name>").
19
20 C-Compiler fuer nvim-treesitter: kein winget-Paket enthalten, da MSVC auf
21 den Zielsystemen bereits vorhanden ist. Neovim muss dafuer aus einer
22 "Developer PowerShell for VS" gestartet werden (siehe Install-Tools).
23#>
24
25$ErrorActionPreference = "Stop"
26$script:Failures = @()
27
28function Write-Ok($msg) {
29 Write-Host "OK $msg" -ForegroundColor Green
30}
31
32function Write-Step($msg) {
33 Write-Host "==> $msg" -ForegroundColor Cyan
34}
35
36function Write-Skip($msg) {
37 Write-Host "- $msg bereits vorhanden" -ForegroundColor DarkGray
38}
39
40function Write-Warn($msg) {
41 Write-Host "! $msg" -ForegroundColor Yellow
42 $script:Failures += $msg
43}
44
45function Test-CommandExists([string]$Name) {
46 return [bool](Get-Command $Name -ErrorAction SilentlyContinue)
47}
48
49function Install-WingetPackage([string]$Binary, [string]$Id) {
50 if (Test-CommandExists $Binary) {
51 Write-Skip $Binary
52 return
53 }
54
55 Write-Step "winget install $Id"
56 winget install --id $Id -e --source winget --accept-package-agreements --accept-source-agreements --silent | Out-Null
57
58 if ($LASTEXITCODE -ne 0) {
59 Write-Warn "winget install $Id fehlgeschlagen (Binary '$Binary' nicht gefunden). Pruefen mit: winget search $Id"
60 return
61 }
62
63 Write-Ok $Id
64}
65
66function Install-NpmPackage([string]$Binary, [string]$Package) {
67 if (Test-CommandExists $Binary) {
68 Write-Skip $Binary
69 return
70 }
71
72 if (-not (Test-CommandExists "npm")) {
73 Write-Warn "npm wurde nicht gefunden - kann '$Package' nicht installieren."
74 return
75 }
76
77 Write-Step "npm install -g $Package"
78 npm install -g $Package | Out-Null
79
80 if ($LASTEXITCODE -ne 0) {
81 Write-Warn "npm install -g $Package fehlgeschlagen."
82 return
83 }
84
85 Write-Ok $Package
86}
87
88function Test-Prerequisites {
89 if (-not (Test-CommandExists "winget")) {
90 Write-Host "Fehler: winget wurde nicht gefunden. 'App Installer' aus dem Microsoft Store installieren." -ForegroundColor Red
91 exit 1
92 }
93}
94
95function Update-SessionPath {
96 # winget/npm-Installer tragen PATH-Aenderungen in die Registry (User-
97 # und/oder Machine-Scope) ein, aber der laufende PowerShell-Prozess
98 # bekommt das nicht automatisch mit. Ohne diesen Refresh wuerde z.B.
99 # "npm" gleich im Anschluss an die Node-Installation als "nicht
100 # gefunden" gemeldet, obwohl es gerade erst installiert wurde.
101 $machine = [Environment]::GetEnvironmentVariable("PATH", "Machine")
102 $user = [Environment]::GetEnvironmentVariable("PATH", "User")
103 $env:PATH = "$machine;$user"
104}
105
106function Install-Prerequisites {
107 Install-WingetPackage -Binary "git" -Id "Git.Git"
108 Install-WingetPackage -Binary "node" -Id "OpenJS.NodeJS.LTS"
109 Update-SessionPath
110}
111
112function Install-Formatters {
113 Install-WingetPackage -Binary "jq" -Id "jqlang.jq"
114 Install-NpmPackage -Binary "prettier" -Package "prettier"
115 Install-WingetPackage -Binary "ruff" -Id "astral-sh.ruff"
116 Install-WingetPackage -Binary "shfmt" -Id "mvdan.shfmt"
117 Install-WingetPackage -Binary "stylua" -Id "JohnnyMorganz.StyLua"
118 Install-WingetPackage -Binary "yamlfmt" -Id "google.yamlfmt"
119 Install-WingetPackage -Binary "gawk" -Id "GnuWin32.Gawk"
120 Install-WingetPackage -Binary "xmllint" -Id "GnuWin32.Libxml2"
121}
122
123function Install-Tools {
124 Install-WingetPackage -Binary "rg" -Id "BurntSushi.ripgrep.MSVC"
125 Install-WingetPackage -Binary "fd" -Id "sharkdp.fd"
126 Install-NpmPackage -Binary "tree-sitter" -Package "tree-sitter-cli"
127
128 # C-Compiler fuer nvim-treesitter: kein winget-Paket noetig, MSVC (cl.exe)
129 # ist auf diesen Systemen bereits vorhanden. nvim-treesitter findet cl.exe
130 # automatisch, ABER nur wenn INCLUDE/LIB gesetzt sind - das passiert nicht
131 # in einer normalen PowerShell, sondern nur in einer "Developer PowerShell
132 # for VS" bzw. "x64 Native Tools Command Prompt". Neovim also immer aus
133 # so einer Shell heraus starten, sonst schlaegt die Parser-Kompilierung
134 # mit "cannot find <header>.h" o.ae. fehl, obwohl cl.exe selbst gefunden wird.
135
136 # opt.makeprg = "gmake" (nvim/lua/config/options.lua) - Alias liegt in
137 # windows/bin/gmake.cmd, reicht an "make" durch. Einmalig windows\bin
138 # zum PATH hinzufuegen (PowerShell, User-Scope, nicht setx mit %PATH%
139 # verwenden - das wuerde den gesamten Prozess-PATH inkl. System-Anteil
140 # dauerhaft in den User-PATH kopieren):
141 # $userPath = [Environment]::GetEnvironmentVariable("PATH", "User")
142 # [Environment]::SetEnvironmentVariable("PATH", "$userPath;$env:USERPROFILE\dotfiles\windows\bin", "User")
143 Install-WingetPackage -Binary "make" -Id "GnuWin32.Make"
144}
145
146function Install-Lsp {
147 Install-NpmPackage -Binary "basedpyright-langserver" -Package "basedpyright"
148 Install-NpmPackage -Binary "bash-language-server" -Package "bash-language-server"
149 Install-WingetPackage -Binary "clangd" -Id "LLVM.LLVM"
150 Install-WingetPackage -Binary "shellcheck" -Id "koalaman.shellcheck"
151 Install-NpmPackage -Binary "vscode-html-language-server" -Package "vscode-langservers-extracted"
152 Install-NpmPackage -Binary "vscode-json-language-server" -Package "vscode-langservers-extracted"
153 Install-WingetPackage -Binary "lua-language-server" -Id "LuaLS.lua-language-server"
154 Install-NpmPackage -Binary "prisma-language-server" -Package "@prisma/language-server"
155 Install-NpmPackage -Binary "vtsls" -Package "@vtsls/language-server"
156}
157
158function Main {
159 Test-Prerequisites
160
161 Install-Prerequisites
162 Install-Formatters
163 Install-Tools
164 Install-Lsp
165
166 Write-Host ""
167 if ($script:Failures.Count -eq 0) {
168 Write-Host "Bootstrap abgeschlossen." -ForegroundColor Green
169 } else {
170 Write-Host "Bootstrap abgeschlossen, mit $($script:Failures.Count) Warnung(en):" -ForegroundColor Yellow
171 foreach ($f in $script:Failures) {
172 Write-Host " - $f" -ForegroundColor Yellow
173 }
174 }
175}
176
177Main
diff --git a/install-win.ps1 b/install-win.ps1
new file mode 100644
index 0000000..632c25e
--- /dev/null
+++ b/install-win.ps1
@@ -0,0 +1,110 @@
1#Requires -Version 5.1
2<#
3 Windows-natives Pendant zu install.sh (ersetzt install-win.cmd).
4 install.sh bleibt unveraendert - kopiert (statt zu verlinken) die
5 relevanten Konfigurationen an ihre nativen Windows-Zielorte. Keine
6 Admin-Rechte noetig (keine Symlinks).
7
8 Aufruf:
9 .\install-win.ps1
10
11 Falls die Ausfuehrung durch die Execution Policy blockiert wird:
12 powershell -ExecutionPolicy Bypass -File .\install-win.ps1
13
14 Hinweis: Es wird KOPIERT, nicht verlinkt. Nach Aenderungen im Repo
15 dieses Skript erneut ausfuehren, um die Kopien zu aktualisieren.
16#>
17
18$ErrorActionPreference = "Stop"
19
20function Write-Ok($msg) {
21 Write-Host "OK $msg" -ForegroundColor Green
22}
23
24function Write-Step($msg) {
25 Write-Host "==> $msg" -ForegroundColor Cyan
26}
27
28function Write-SkipMsg($msg) {
29 Write-Host "- $msg" -ForegroundColor DarkGray
30}
31
32$RepoRoot = $PSScriptRoot
33
34$NvimSrc = Join-Path $RepoRoot "nvim"
35$NvimDst = Join-Path $env:LOCALAPPDATA "nvim"
36
37$GitConfigSrc = Join-Path $RepoRoot "git\config"
38$GitConfigDst = Join-Path $env:USERPROFILE ".gitconfig"
39
40$GitUp2partsSrc = Join-Path $RepoRoot "git\config-up2parts"
41$GitXdgDir = Join-Path $env:USERPROFILE ".config\git"
42$GitUp2partsDst = Join-Path $GitXdgDir "config-up2parts"
43
44$NpmrcSrc = Join-Path $RepoRoot "npm\npmrc"
45$NpmrcDst = Join-Path $env:USERPROFILE ".npmrc"
46
47function Copy-NvimConfig {
48 Write-Step "nvim -> $NvimDst"
49
50 if (Test-Path $NvimDst) {
51 Remove-Item -Recurse -Force $NvimDst
52 }
53
54 Copy-Item -Recurse -Force $NvimSrc $NvimDst
55 Write-Ok $NvimDst
56}
57
58function Copy-GitConfig {
59 Write-Step "git\config -> $GitConfigDst"
60 Copy-Item -Force $GitConfigSrc $GitConfigDst
61 Write-Ok $GitConfigDst
62
63 if (-not (Test-Path $GitXdgDir)) {
64 New-Item -ItemType Directory -Path $GitXdgDir -Force | Out-Null
65 }
66
67 Write-Step "git\config-up2parts -> $GitUp2partsDst"
68 Copy-Item -Force $GitUp2partsSrc $GitUp2partsDst
69 Write-Ok "$GitUp2partsDst (wird per includeIf aus .gitconfig eingebunden)"
70}
71
72function Copy-Npmrc {
73 if (Test-Path $NpmrcDst) {
74 Write-SkipMsg "$NpmrcDst existiert bereits, uebersprungen"
75 return
76 }
77
78 Write-Step "npm\npmrc -> $NpmrcDst"
79 Copy-Item -Force $NpmrcSrc $NpmrcDst
80 Write-Ok $NpmrcDst
81}
82
83function Add-BinToUserPath {
84 $binDir = Join-Path $RepoRoot "windows\bin"
85 $userPath = [Environment]::GetEnvironmentVariable("PATH", "User")
86 $entries = $userPath -split ";"
87
88 if ($entries -contains $binDir) {
89 Write-SkipMsg "$binDir bereits im User-PATH"
90 return
91 }
92
93 Write-Step "$binDir zum User-PATH hinzufuegen (enthaelt gmake.cmd)"
94 [Environment]::SetEnvironmentVariable("PATH", "$userPath;$binDir", "User")
95 Write-Ok "$binDir (wirkt erst in neuen Terminal-Sitzungen)"
96}
97
98function Main {
99 Copy-NvimConfig
100 Copy-GitConfig
101 Copy-Npmrc
102 Add-BinToUserPath
103
104 Write-Host ""
105 Write-Host "Fertig. Dateien wurden KOPIERT, nicht verlinkt." -ForegroundColor Green
106 Write-Host "Nach Aenderungen im Repo dieses Skript erneut ausfuehren."
107 Write-Host "Neues Terminal oeffnen, damit PATH-Aenderungen wirksam werden." -ForegroundColor Yellow
108}
109
110Main
diff --git a/neovim-windows-setup.md b/neovim-windows-setup.md
new file mode 100644
index 0000000..24e5bc0
--- /dev/null
+++ b/neovim-windows-setup.md
@@ -0,0 +1,112 @@
1# Neovim-Setup unter Windows (nativ)
2
3Checkliste für die Übernahme der bestehenden `nvim/`-Config aus dem Dotfiles-Repo auf ein natives Windows-System (kein WSL). Repo selbst bleibt unverändert.
4
5Alle 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. Falls die Ausführung der `.ps1`-Skripte durch die Execution Policy blockiert wird, entweder pro Aufruf `powershell -ExecutionPolicy Bypass -File .\skript.ps1` verwenden, oder einmalig `Set-ExecutionPolicy -Scope CurrentUser RemoteSigned`.
6
7## 0. Von Hand zu erledigen (nicht durch Skripte abgedeckt)
8
9- **Execution Policy** setzen (siehe oben), sonst starten die `.ps1`-Skripte gar nicht.
10- **`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.
11- **Neovim selbst installieren** (`winget install Neovim.Neovim`, Abschnitt 1) – kein Skript hier installiert Neovim, nur seine Config/Abhängigkeiten.
12- **`delta` installieren** (`git/config` setzt `pager = delta` und `diffFilter = delta --color-only`). War auch unter macOS/FreeBSD nie Teil von `bootstrap/neovim.sh` – wurde dort offenbar immer manuell nachgezogen. Unter Windows z. B. `winget install dandavison.delta` (ID ungeprüft, ggf. `winget search delta` gegenchecken).
13- **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.
14- **PATH-Registrierung stichprobenartig prüfen**, vor allem bei den GnuWin32-Paketen (`jq`, `gawk`, `make`, `libxml2`/`xmllint`) – ältere/portable winget-Pakete tragen sich nicht immer automatisch in den PATH ein. Nach einem neuen Terminal kurz `Get-Command jq, gawk, make, xmllint` aufrufen; fehlt eins, dessen Installationsordner manuell zum User-PATH hinzufügen (gleiches Muster wie `Add-BinToUserPath` in `install-win.ps1`).
15- **Reihenfolge**: `install-win.ps1` und `bootstrap-win/neovim.ps1` sind unabhängig voneinander, `bootstrap-win/neovim-dict.ps1` ebenso. Empfehlenswert: erst Neovim/Git/Node (Abschnitt 1) installieren, dann beide 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).
16- **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.
17
18## 1. Grundwerkzeuge installieren
19
20```powershell
21winget install Neovim.Neovim
22winget install Git.Git
23winget install OpenJS.NodeJS.LTS
24```
25
26(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/4.)
27
28## 2. Konfiguration einrichten (Windows-nativer Weg)
29
30`install-win.ps1` im Repo-Root ausführen:
31
32```powershell
33.\install-win.ps1
34```
35
36Es kopiert (keine Symlinks, keine Admin-Rechte nötig):
37
38- `nvim/` → `%LOCALAPPDATA%\nvim`
39- `git/config` → `%USERPROFILE%\.gitconfig`
40- `git/config-up2parts` → `%USERPROFILE%\.config\git\config-up2parts` (Pfad ist im `includeIf` von `git/config` hartkodiert)
41- `npm/npmrc` → `%USERPROFILE%\.npmrc` (nur falls dort noch keine Datei existiert)
42
43Nach Änderungen im Repo `install-win.ps1` erneut ausführen, um die Kopien zu aktualisieren.
44
45## 3. Externe Abhängigkeiten
46
47`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):
48
49```powershell
50.\bootstrap-win\neovim.ps1
51```
52
53Installiert per `winget`/`npm`: Git, Node, Formatter (jq, prettier, ruff, shfmt, stylua, yamlfmt, gawk, xmllint), Tools (ripgrep, fd, tree-sitter-cli, make) und LSP-Server (basedpyright, bash-language-server, clangd, shellcheck, vscode-langservers-extracted, lua-language-server, prisma, vtsls). Einzelne Pakete, die fehlschlagen, werden als Warnung gemeldet statt das Skript abzubrechen – Details siehe Kopfkommentar im Skript (einige winget-IDs, v. a. GnuWin32.Gawk/Libxml2, google.yamlfmt, mvdan.shfmt, astral-sh.ruff, sind ungeprüft).
54
55Kein 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).
56
57`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):
58```powershell
59$userPath = [Environment]::GetEnvironmentVariable("PATH", "User")
60[Environment]::SetEnvironmentVariable("PATH", "$userPath;$env:USERPROFILE\dotfiles\windows\bin", "User")
61```
62
63## 4. Bekannte Stolpersteine
64
65- **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.
66- **Rechtschreibprüfung (Deutsch)**: `bootstrap-win/neovim-dict.ps1` ausführen – lädt `de.utf-8.spl`/`.sug` nach `%LOCALAPPDATA%\nvim-data\site\spell` (nativer Windows-Datenpfad von Neovim).
67- **`scripts/sonarqube.sh`** (`:SonarIssues`): reines POSIX-Shellskript, kein Windows-Pendant vorhanden. Läuft nur, wenn ein `sh` im PATH liegt (z. B. `sh.exe` aus Git for Windows im PATH verfügbar machen); ansonsten `:SonarIssues` auf Windows nicht nutzen.
68- **Clipboard** (`unnamedplus`): funktioniert nativ unter Windows-Neovim ohne Zusatztool – anders als unter WSL, wo `win32yank` nötig wäre.
69- **`opt.guifont`**: wirkt nur bei GUI-Frontends wie Neovide. Im Windows Terminal muss die Schriftart dort separat eingestellt werden.
70
71## 5. Verifizieren
72
73```
74nvim
75:checkhealth
76```
77
78`:checkhealth` zeigt fehlende Provider/Tools direkt an – guter letzter Schritt nach der Installation.
79
80## 6. Aktualisieren
81
82Pendant zu `brew update && brew upgrade` (macOS) bzw. `pkg update && pkg upgrade` (FreeBSD):
83
84```powershell
85winget source update # Paketquellen aktualisieren
86winget upgrade --all # alle winget-Pakete aktualisieren
87```
88
89Vorschau, was aktualisiert würde, ohne etwas zu ändern:
90
91```powershell
92winget list --upgrade-available
93```
94
95Einzelnes Paket gezielt aktualisieren (IDs siehe `bootstrap-win/neovim.ps1`):
96
97```powershell
98winget upgrade LLVM.LLVM
99```
100
101Zwei Besonderheiten gegenüber brew/pkg:
102
103- Ältere/portable Pakete (v. a. die GnuWin32-Reihe: `jq`, `gawk`, `make`, `libxml2`) melden nicht immer zuverlässig eine neue Version. `winget upgrade --all --include-unknown` bezieht auch diese mit ein, installiert dabei aber unter Umständen unnötig neu.
104- Ein Paket dauerhaft von `--all` ausnehmen: `winget pin add <id>` (Pendant zu `brew pin`).
105
106Die npm-Pakete (`prettier`, `basedpyright`, `bash-language-server`, `vtsls`, `@prisma/language-server`, `vscode-langservers-extracted`) laufen außerhalb von winget und werden separat aktualisiert:
107
108```powershell
109npm update -g
110```
111
112`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.
diff --git a/windows/bin/gmake.cmd b/windows/bin/gmake.cmd
new file mode 100644
index 0000000..89f3a29
--- /dev/null
+++ b/windows/bin/gmake.cmd
@@ -0,0 +1,11 @@
1@echo off
2rem Wrapper, damit opt.makeprg = "gmake" (aus nvim/lua/config/options.lua)
3rem unter Windows funktioniert, ohne die bestehende Config anzupassen.
4rem Reicht alle Argumente an das im PATH gefundene "make" weiter.
5rem
6rem Einmalig einrichten: dieses Verzeichnis (windows\bin) zum PATH
7rem hinzufuegen, z.B. ueber:
8rem setx PATH "%PATH%;%USERPROFILE%\dotfiles\windows\bin"
9
10make %*
11exit /b %ERRORLEVEL%