From b04598d71f18227af87cb04890b4dee5d38bd753 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Thu, 23 Jul 2026 11:20:49 +0200 Subject: windows: Bootstrap-Skripte nach bootstrap-win/ verschoben, -win-Suffix entfernt bootstrap/neovim-win.ps1 -> bootstrap-win/neovim.ps1 bootstrap/neovim-dict-win.ps1 -> bootstrap-win/neovim-dict.ps1 Eigenes Verzeichnis statt Suffix pro Datei, analog zu windows/ fuer gmake.cmd. bootstrap/ (POSIX, macOS/FreeBSD) bleibt unveraendert. Referenzen in neovim-windows-setup.md aktualisiert. Nebenbei: eine unerklaerte, nicht selbst vorgenommene Aenderung an nvim/lua/config/treesitter.lua (fuegte 'powershell' zur Sprachliste hinzu) verworfen statt versehentlich mit einzuchecken. --- bootstrap-win/neovim.ps1 | 177 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 bootstrap-win/neovim.ps1 (limited to 'bootstrap-win/neovim.ps1') 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 @@ +#Requires -Version 5.1 +<# + Windows-natives Pendant zu bootstrap/neovim.sh (macOS/FreeBSD). + bootstrap/neovim.sh bleibt unveraendert - dieses Skript ist bewusst + eigenstaendig, da sich die Paketquellen (winget/npm statt brew/pkg) und + das Fehlerverhalten zu stark unterscheiden fuer ein gemeinsames Skript. + + Nutzt ausschliesslich native Windows-Werkzeuge (winget, npm, pwsh/ + powershell.exe) - keine Git-Bash- oder WSL-Abhaengigkeit. + + Aufruf (PowerShell, keine Admin-Rechte noetig): + .\bootstrap-win\neovim.ps1 + + Hinweis: Einzelne winget-Paket-IDs (v.a. GnuWin32.Gawk, GnuWin32.Libxml2, + google.yamlfmt, mvdan.shfmt, astral-sh.ruff) konnten in dieser Session + nicht gegen eine aktuelle winget-Quelle verifiziert werden. Schlaegt eine + Installation fehl, meldet das Skript das als Warnung (bricht nicht ab) + und nennt den Befehl zum manuellen Nachschlagen ("winget search "). + + C-Compiler fuer nvim-treesitter: kein winget-Paket enthalten, da MSVC auf + den Zielsystemen bereits vorhanden ist. Neovim muss dafuer aus einer + "Developer PowerShell for VS" gestartet werden (siehe Install-Tools). +#> + +$ErrorActionPreference = "Stop" +$script:Failures = @() + +function Write-Ok($msg) { + Write-Host "OK $msg" -ForegroundColor Green +} + +function Write-Step($msg) { + Write-Host "==> $msg" -ForegroundColor Cyan +} + +function Write-Skip($msg) { + Write-Host "- $msg bereits vorhanden" -ForegroundColor DarkGray +} + +function Write-Warn($msg) { + Write-Host "! $msg" -ForegroundColor Yellow + $script:Failures += $msg +} + +function Test-CommandExists([string]$Name) { + return [bool](Get-Command $Name -ErrorAction SilentlyContinue) +} + +function Install-WingetPackage([string]$Binary, [string]$Id) { + if (Test-CommandExists $Binary) { + Write-Skip $Binary + return + } + + Write-Step "winget install $Id" + winget install --id $Id -e --source winget --accept-package-agreements --accept-source-agreements --silent | Out-Null + + if ($LASTEXITCODE -ne 0) { + Write-Warn "winget install $Id fehlgeschlagen (Binary '$Binary' nicht gefunden). Pruefen mit: winget search $Id" + return + } + + Write-Ok $Id +} + +function Install-NpmPackage([string]$Binary, [string]$Package) { + if (Test-CommandExists $Binary) { + Write-Skip $Binary + return + } + + if (-not (Test-CommandExists "npm")) { + Write-Warn "npm wurde nicht gefunden - kann '$Package' nicht installieren." + return + } + + Write-Step "npm install -g $Package" + npm install -g $Package | Out-Null + + if ($LASTEXITCODE -ne 0) { + Write-Warn "npm install -g $Package fehlgeschlagen." + return + } + + Write-Ok $Package +} + +function Test-Prerequisites { + if (-not (Test-CommandExists "winget")) { + Write-Host "Fehler: winget wurde nicht gefunden. 'App Installer' aus dem Microsoft Store installieren." -ForegroundColor Red + exit 1 + } +} + +function Update-SessionPath { + # winget/npm-Installer tragen PATH-Aenderungen in die Registry (User- + # und/oder Machine-Scope) ein, aber der laufende PowerShell-Prozess + # bekommt das nicht automatisch mit. Ohne diesen Refresh wuerde z.B. + # "npm" gleich im Anschluss an die Node-Installation als "nicht + # gefunden" gemeldet, obwohl es gerade erst installiert wurde. + $machine = [Environment]::GetEnvironmentVariable("PATH", "Machine") + $user = [Environment]::GetEnvironmentVariable("PATH", "User") + $env:PATH = "$machine;$user" +} + +function Install-Prerequisites { + Install-WingetPackage -Binary "git" -Id "Git.Git" + Install-WingetPackage -Binary "node" -Id "OpenJS.NodeJS.LTS" + Update-SessionPath +} + +function Install-Formatters { + Install-WingetPackage -Binary "jq" -Id "jqlang.jq" + Install-NpmPackage -Binary "prettier" -Package "prettier" + Install-WingetPackage -Binary "ruff" -Id "astral-sh.ruff" + Install-WingetPackage -Binary "shfmt" -Id "mvdan.shfmt" + Install-WingetPackage -Binary "stylua" -Id "JohnnyMorganz.StyLua" + Install-WingetPackage -Binary "yamlfmt" -Id "google.yamlfmt" + Install-WingetPackage -Binary "gawk" -Id "GnuWin32.Gawk" + Install-WingetPackage -Binary "xmllint" -Id "GnuWin32.Libxml2" +} + +function Install-Tools { + Install-WingetPackage -Binary "rg" -Id "BurntSushi.ripgrep.MSVC" + Install-WingetPackage -Binary "fd" -Id "sharkdp.fd" + Install-NpmPackage -Binary "tree-sitter" -Package "tree-sitter-cli" + + # C-Compiler fuer nvim-treesitter: kein winget-Paket noetig, MSVC (cl.exe) + # ist auf diesen Systemen bereits vorhanden. nvim-treesitter findet cl.exe + # automatisch, ABER nur wenn INCLUDE/LIB gesetzt sind - das passiert nicht + # in einer normalen PowerShell, sondern nur in einer "Developer PowerShell + # for VS" bzw. "x64 Native Tools Command Prompt". Neovim also immer aus + # so einer Shell heraus starten, sonst schlaegt die Parser-Kompilierung + # mit "cannot find
.h" o.ae. fehl, obwohl cl.exe selbst gefunden wird. + + # opt.makeprg = "gmake" (nvim/lua/config/options.lua) - Alias liegt in + # windows/bin/gmake.cmd, reicht an "make" durch. Einmalig windows\bin + # zum PATH hinzufuegen (PowerShell, User-Scope, nicht setx mit %PATH% + # verwenden - das wuerde den gesamten 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") + Install-WingetPackage -Binary "make" -Id "GnuWin32.Make" +} + +function Install-Lsp { + Install-NpmPackage -Binary "basedpyright-langserver" -Package "basedpyright" + Install-NpmPackage -Binary "bash-language-server" -Package "bash-language-server" + Install-WingetPackage -Binary "clangd" -Id "LLVM.LLVM" + Install-WingetPackage -Binary "shellcheck" -Id "koalaman.shellcheck" + Install-NpmPackage -Binary "vscode-html-language-server" -Package "vscode-langservers-extracted" + Install-NpmPackage -Binary "vscode-json-language-server" -Package "vscode-langservers-extracted" + Install-WingetPackage -Binary "lua-language-server" -Id "LuaLS.lua-language-server" + Install-NpmPackage -Binary "prisma-language-server" -Package "@prisma/language-server" + Install-NpmPackage -Binary "vtsls" -Package "@vtsls/language-server" +} + +function Main { + Test-Prerequisites + + Install-Prerequisites + Install-Formatters + Install-Tools + Install-Lsp + + Write-Host "" + if ($script:Failures.Count -eq 0) { + Write-Host "Bootstrap abgeschlossen." -ForegroundColor Green + } else { + Write-Host "Bootstrap abgeschlossen, mit $($script:Failures.Count) Warnung(en):" -ForegroundColor Yellow + foreach ($f in $script:Failures) { + Write-Host " - $f" -ForegroundColor Yellow + } + } +} + +Main -- cgit v1.3 From 2b6a7ce27483b4f999c80b065c92c5e4566c90d8 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Fri, 24 Jul 2026 09:45:25 +0200 Subject: bootstrap-win: echte winget-Fehlermeldung anzeigen, make-ID getauscht Praxistest zeigte 4 Fehlschlaege (google.yamlfmt, GnuWin32.Gawk, GnuWin32.Libxml2, GnuWin32.Make). Install-WingetPackage verschluckte bisher die eigentliche winget-Fehlermeldung (Out-Null) - jetzt werden die letzten Zeilen der winget-Ausgabe in der Warnung mit ausgegeben, um die Ursache (falsche ID vs. anderer Installationsfehler) sichtbar zu machen. GnuWin32.Make (2006er-Softwarestand, Pflegezustand im winget-Repo unklar) durch ezwinports.make ersetzt, einen aktiver gepflegten GNU-Make-Port fuer Windows. --- bootstrap-win/neovim.ps1 | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'bootstrap-win/neovim.ps1') diff --git a/bootstrap-win/neovim.ps1 b/bootstrap-win/neovim.ps1 index 548583e..64de8a1 100644 --- a/bootstrap-win/neovim.ps1 +++ b/bootstrap-win/neovim.ps1 @@ -53,10 +53,11 @@ function Install-WingetPackage([string]$Binary, [string]$Id) { } Write-Step "winget install $Id" - winget install --id $Id -e --source winget --accept-package-agreements --accept-source-agreements --silent | Out-Null + $output = winget install --id $Id -e --source winget --accept-package-agreements --accept-source-agreements --silent 2>&1 if ($LASTEXITCODE -ne 0) { - Write-Warn "winget install $Id fehlgeschlagen (Binary '$Binary' nicht gefunden). Pruefen mit: winget search $Id" + $lastLine = ($output | Select-Object -Last 3) -join " / " + Write-Warn "winget install $Id fehlgeschlagen (Binary '$Binary' nicht gefunden): $lastLine -- Pruefen mit: winget search $Id" return } @@ -140,7 +141,10 @@ function Install-Tools { # dauerhaft in den User-PATH kopieren): # $userPath = [Environment]::GetEnvironmentVariable("PATH", "User") # [Environment]::SetEnvironmentVariable("PATH", "$userPath;$env:USERPROFILE\dotfiles\windows\bin", "User") - Install-WingetPackage -Binary "make" -Id "GnuWin32.Make" + # GnuWin32.Make ist im Praxistest fehlgeschlagen (Paket 2006er-Stand, + # unklar ob im winget-Repo ueberhaupt noch gepflegt). ezwinports.make + # ist ein aktiver gepflegter GNU-Make-Port fuer Windows. + Install-WingetPackage -Binary "make" -Id "ezwinports.make" } function Install-Lsp { -- cgit v1.3 From eb5a02ceb2008b7987e597e7d697fa81d0c5338b Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Fri, 24 Jul 2026 09:53:58 +0200 Subject: bootstrap-win: yamlfmt/gawk/xmllint entfernt, clangd/LLVM-Fall erkannt Praxistest (24.07.2026) bestaetigt: google.yamlfmt, GnuWin32.Gawk und GnuWin32.Libxml2 existieren nicht in der winget-Registry ('kein Paket gefunden, das den Eingabekriterien entspricht'). Kein verifizierter Ersatz gefunden, deshalb aus Install-Formatters entfernt statt weiter zu raten - Formatierung faellt fuer awk/xml/yaml auf LSP zurueck. LLVM.LLVM schlug ebenfalls fehl, aber aus anderem Grund: Paket bereits installiert, clangd nur nicht im PATH (winget meldet 'kein Upgrade verfuegbar', keine Neuinstallation noetig). Install-WingetPackage erkennt diesen Fall jetzt per Textmuster und gibt einen gezielten Hinweis statt der irrefuehrenden 'Paket nicht gefunden'-Meldung. neovim-windows-setup.md entsprechend aktualisiert (Abschnitte 0, 3, 4, 6). --- bootstrap-win/neovim.ps1 | 38 +++++++++++++++++++++++++++++--------- neovim-windows-setup.md | 8 +++++--- 2 files changed, 34 insertions(+), 12 deletions(-) (limited to 'bootstrap-win/neovim.ps1') diff --git a/bootstrap-win/neovim.ps1 b/bootstrap-win/neovim.ps1 index 64de8a1..467463b 100644 --- a/bootstrap-win/neovim.ps1 +++ b/bootstrap-win/neovim.ps1 @@ -11,11 +11,15 @@ Aufruf (PowerShell, keine Admin-Rechte noetig): .\bootstrap-win\neovim.ps1 - Hinweis: Einzelne winget-Paket-IDs (v.a. GnuWin32.Gawk, GnuWin32.Libxml2, - google.yamlfmt, mvdan.shfmt, astral-sh.ruff) konnten in dieser Session - nicht gegen eine aktuelle winget-Quelle verifiziert werden. Schlaegt eine - Installation fehl, meldet das Skript das als Warnung (bricht nicht ab) - und nennt den Befehl zum manuellen Nachschlagen ("winget search "). + Hinweis: yamlfmt, gawk und xmllint/libxml2 sind bewusst NICHT enthalten - + im Praxistest (24.07.2026) bestaetigt, dass es dafuer keine winget-Pakete + unter den urspruenglich vermuteten IDs gibt. Siehe Install-Formatters und + neovim-windows-setup.md fuer manuelle Alternativen. mvdan.shfmt und + astral-sh.ruff liefen im Test erfolgreich durch. + + Schlaegt eine winget-Installation trotzdem fehl, meldet das Skript das + als Warnung (bricht nicht ab) und zeigt die letzten Zeilen der winget- + Ausgabe zur Fehlersuche an. C-Compiler fuer nvim-treesitter: kein winget-Paket enthalten, da MSVC auf den Zielsystemen bereits vorhanden ist. Neovim muss dafuer aus einer @@ -56,8 +60,18 @@ function Install-WingetPackage([string]$Binary, [string]$Id) { $output = winget install --id $Id -e --source winget --accept-package-agreements --accept-source-agreements --silent 2>&1 if ($LASTEXITCODE -ne 0) { + $text = $output -join " " $lastLine = ($output | Select-Object -Last 3) -join " / " - Write-Warn "winget install $Id fehlgeschlagen (Binary '$Binary' nicht gefunden): $lastLine -- Pruefen mit: winget search $Id" + + if ($text -match "bereits ein vorhandenes Paket|already installed|No applicable update") { + # Paket ist laut winget installiert, aber die Binary steht trotzdem + # nicht im PATH - z.B. weil der Installer (im --silent-Modus) die + # PATH-Registrierung uebersprungen hat. winget search hilft hier + # nicht weiter, da das Paket ja gefunden wurde. + Write-Warn "$Id ist laut winget bereits installiert, aber '$Binary' wurde nicht gefunden. Vermutlich fehlt das Installationsverzeichnis im PATH - Installationsordner suchen (z.B. unter Program Files) und manuell zum PATH hinzufuegen." + } else { + Write-Warn "winget install $Id fehlgeschlagen (Binary '$Binary' nicht gefunden): $lastLine -- Pruefen mit: winget search $Id" + } return } @@ -116,9 +130,15 @@ function Install-Formatters { Install-WingetPackage -Binary "ruff" -Id "astral-sh.ruff" Install-WingetPackage -Binary "shfmt" -Id "mvdan.shfmt" Install-WingetPackage -Binary "stylua" -Id "JohnnyMorganz.StyLua" - Install-WingetPackage -Binary "yamlfmt" -Id "google.yamlfmt" - Install-WingetPackage -Binary "gawk" -Id "GnuWin32.Gawk" - Install-WingetPackage -Binary "xmllint" -Id "GnuWin32.Libxml2" + + # yamlfmt, gawk, xmllint: im Praxistest bestaetigt, dass es unter diesen + # IDs kein winget-Paket gibt ("Es wurde kein Paket gefunden, das den + # Eingabekriterien entspricht"). Kein verifizierter Ersatz gefunden, + # deshalb bewusst nicht automatisiert - siehe neovim-windows-setup.md + # fuer manuelle Alternativen. conform.nvim faellt bei fehlendem + # Formatter fuer die jeweilige Dateiart einfach auf LSP-Formatierung + # zurueck (default_format_opts.lsp_format = "fallback"), betrifft also + # nur awk/xml/xsd/yaml-Dateien. } function Install-Tools { diff --git a/neovim-windows-setup.md b/neovim-windows-setup.md index 24e5bc0..f237892 100644 --- a/neovim-windows-setup.md +++ b/neovim-windows-setup.md @@ -11,7 +11,8 @@ Alle Windows-Skripte in diesem Repo sind reines PowerShell (kein Git Bash, kein - **Neovim selbst installieren** (`winget install Neovim.Neovim`, Abschnitt 1) – kein Skript hier installiert Neovim, nur seine Config/Abhängigkeiten. - **`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). - **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**, 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`). +- **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) 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 nur die Formatierung von awk-, xml/xsd- und yaml-Dateien (`conform.nvim` fällt sonst auf LSP-Formatierung zurück). Bekannte Alternativen: yamlfmt via `go install github.com/google/yamlfmt/cmd/yamlfmt@latest` (falls Go installiert) oder Binary von den GitHub-Releases; für gawk/xmllint keine verifizierte Windows-native Quelle gefunden, ggf. `winget search gawk` / `winget search libxml2` selbst prüfen. - **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). - **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. @@ -50,7 +51,7 @@ Nach Änderungen im Repo `install-win.ps1` erneut ausführen, um die Kopien zu a .\bootstrap-win\neovim.ps1 ``` -Installiert 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). +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 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). @@ -67,6 +68,7 @@ $userPath = [Environment]::GetEnvironmentVariable("PATH", "User") - **`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. - **Clipboard** (`unnamedplus`): funktioniert nativ unter Windows-Neovim ohne Zusatztool – anders als unter WSL, wo `win32yank` nötig wäre. - **`opt.guifont`**: wirkt nur bei GUI-Frontends wie Neovide. Im Windows Terminal muss die Schriftart dort separat eingestellt werden. +- **`clangd` trotz installiertem `LLVM.LLVM` nicht gefunden**: im Praxistest beobachtet – winget meldet das Paket als bereits installiert, `clangd.exe` liegt aber nicht im PATH. `bootstrap-win/neovim.ps1` erkennt diesen Fall inzwischen und gibt einen gezielten Hinweis statt der generischen "Paket nicht gefunden"-Meldung. Abhilfe: Installationsordner suchen (typischerweise `C:\Program Files\LLVM\bin`) und manuell zum PATH hinzufügen. ## 5. Verifizieren @@ -100,7 +102,7 @@ winget upgrade LLVM.LLVM Zwei Besonderheiten gegenüber brew/pkg: -- Ä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. +- 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 ` (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: -- cgit v1.3 From f60d38e2ad0fdc5b0de7aea2d31ddaa0a3485c86 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Fri, 24 Jul 2026 10:06:52 +0200 Subject: bootstrap-win: PATH-Ergaenzung fuer bereits installierte, aber nicht gefundene Pakete automatisieren Neue Helper Find-BinaryDirectory (sucht .exe unter Program Files, Program Files (x86), %LOCALAPPDATA%\Programs) und Add-ToUserPath (dauerhaft + fuer die laufende Sitzung). Install-WingetPackage nutzt das jetzt automatisch im 'bereits installiert, aber nicht im PATH'-Fall (bisher nur als manueller Hinweis, z.B. clangd/LLVM.LLVM im Praxistest) statt den User manuell suchen zu lassen. --- bootstrap-win/neovim.ps1 | 51 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) (limited to 'bootstrap-win/neovim.ps1') diff --git a/bootstrap-win/neovim.ps1 b/bootstrap-win/neovim.ps1 index 467463b..cc598de 100644 --- a/bootstrap-win/neovim.ps1 +++ b/bootstrap-win/neovim.ps1 @@ -50,6 +50,40 @@ function Test-CommandExists([string]$Name) { return [bool](Get-Command $Name -ErrorAction SilentlyContinue) } +function Find-BinaryDirectory([string]$Binary) { + # Sucht nach ".exe" unter den ueblichen Installationswurzeln. + # Deckt den Fall ab, dass ein winget-Paket (v.a. im --silent-Modus) + # die PATH-Registrierung ausgelassen hat, obwohl es korrekt installiert + # wurde - beobachtet bei LLVM.LLVM/clangd. + $searchRoots = @( + $env:ProgramFiles, + ${env:ProgramFiles(x86)}, + (Join-Path $env:LOCALAPPDATA "Programs") + ) | Where-Object { $_ -and (Test-Path $_) } + + foreach ($root in $searchRoots) { + $found = Get-ChildItem -Path $root -Recurse -Depth 4 -Filter "$Binary.exe" -File -ErrorAction SilentlyContinue | Select-Object -First 1 + if ($found) { + return $found.DirectoryName + } + } + + return $null +} + +function Add-ToUserPath([string]$Dir) { + $userPath = [Environment]::GetEnvironmentVariable("PATH", "User") + $entries = $userPath -split ";" + + if ($entries -contains $Dir) { + return $false + } + + [Environment]::SetEnvironmentVariable("PATH", "$userPath;$Dir", "User") + $env:PATH = "$env:PATH;$Dir" + return $true +} + function Install-WingetPackage([string]$Binary, [string]$Id) { if (Test-CommandExists $Binary) { Write-Skip $Binary @@ -67,8 +101,21 @@ function Install-WingetPackage([string]$Binary, [string]$Id) { # Paket ist laut winget installiert, aber die Binary steht trotzdem # nicht im PATH - z.B. weil der Installer (im --silent-Modus) die # PATH-Registrierung uebersprungen hat. winget search hilft hier - # nicht weiter, da das Paket ja gefunden wurde. - Write-Warn "$Id ist laut winget bereits installiert, aber '$Binary' wurde nicht gefunden. Vermutlich fehlt das Installationsverzeichnis im PATH - Installationsordner suchen (z.B. unter Program Files) und manuell zum PATH hinzufuegen." + # nicht weiter, da das Paket ja gefunden wurde - stattdessen selbst + # danach suchen und den User-PATH ergaenzen (dauerhaft + fuer diese + # Sitzung). + $dir = Find-BinaryDirectory $Binary + + if ($dir) { + Add-ToUserPath $dir | Out-Null + if (Test-CommandExists $Binary) { + Write-Ok "$Id ('$Binary' in $dir gefunden, User-PATH ergaenzt)" + } else { + Write-Warn "$Id: $dir zum User-PATH hinzugefuegt, aber '$Binary' laesst sich immer noch nicht ausfuehren - manuell pruefen." + } + } else { + Write-Warn "$Id ist laut winget bereits installiert, aber '$Binary' wurde nicht gefunden und konnte auch nicht automatisch lokalisiert werden (durchsucht: Program Files, Program Files (x86), $env:LOCALAPPDATA\Programs). Installationsordner manuell suchen und zum PATH hinzufuegen." + } } else { Write-Warn "winget install $Id fehlgeschlagen (Binary '$Binary' nicht gefunden): $lastLine -- Pruefen mit: winget search $Id" } -- cgit v1.3 From c1e4fdb0b9eaf0a6ff2f73ae732970e9b956b05f Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Fri, 24 Jul 2026 10:23:34 +0200 Subject: bootstrap-win: Parser-Fehler durch $Id: in String behoben "$Id: ..." wird von PowerShell als Scope-Qualifizierer (wie $env:) fehlinterpretiert, wenn direkt ein Doppelpunkt folgt - Praxistest zeigte den Parser-Fehler 'Ungueltiger Variablenverweis'. Behoben mit ${Id}:. Restliche Datei auf dasselbe Muster geprueft, keine weiteren Treffer. --- bootstrap-win/neovim.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'bootstrap-win/neovim.ps1') diff --git a/bootstrap-win/neovim.ps1 b/bootstrap-win/neovim.ps1 index cc598de..77abf83 100644 --- a/bootstrap-win/neovim.ps1 +++ b/bootstrap-win/neovim.ps1 @@ -111,7 +111,7 @@ function Install-WingetPackage([string]$Binary, [string]$Id) { if (Test-CommandExists $Binary) { Write-Ok "$Id ('$Binary' in $dir gefunden, User-PATH ergaenzt)" } else { - Write-Warn "$Id: $dir zum User-PATH hinzugefuegt, aber '$Binary' laesst sich immer noch nicht ausfuehren - manuell pruefen." + Write-Warn "${Id}: $dir zum User-PATH hinzugefuegt, aber '$Binary' laesst sich immer noch nicht ausfuehren - manuell pruefen." } } else { Write-Warn "$Id ist laut winget bereits installiert, aber '$Binary' wurde nicht gefunden und konnte auch nicht automatisch lokalisiert werden (durchsucht: Program Files, Program Files (x86), $env:LOCALAPPDATA\Programs). Installationsordner manuell suchen und zum PATH hinzufuegen." -- cgit v1.3 From 7d29d60f7ca96cd0d76008345ec788671cfb7573 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Mon, 27 Jul 2026 08:26:18 +0200 Subject: windows: Kommentare in PowerShell-Skripten auf das Mindestmass reduziert --- bootstrap-win/neovim-dict.ps1 | 6 ---- bootstrap-win/neovim.ps1 | 75 ++++++++----------------------------------- install-win.ps1 | 21 +++--------- 3 files changed, 18 insertions(+), 84 deletions(-) (limited to 'bootstrap-win/neovim.ps1') diff --git a/bootstrap-win/neovim-dict.ps1 b/bootstrap-win/neovim-dict.ps1 index 7909ffa..5aeb117 100644 --- a/bootstrap-win/neovim-dict.ps1 +++ b/bootstrap-win/neovim-dict.ps1 @@ -2,13 +2,9 @@ <# Windows-natives Pendant zu bootstrap/neovim-dict.sh. Laedt die deutschen Rechtschreib-Woerterbuecher fuer Neovim herunter. - bootstrap/neovim-dict.sh bleibt unveraendert. Aufruf: .\bootstrap-win\neovim-dict.ps1 - - Falls die Ausfuehrung durch die Execution Policy blockiert wird: - powershell -ExecutionPolicy Bypass -File .\bootstrap-win\neovim-dict.ps1 #> $ErrorActionPreference = "Stop" @@ -25,8 +21,6 @@ function Write-SkipMsg($msg) { Write-Host "- $msg bereits vorhanden" -ForegroundColor DarkGray } -# Nativer Windows-Datenpfad von Neovim (kein XDG_DATA_HOME gesetzt): -# $env:LOCALAPPDATA\nvim-data\site\spell $SpellDir = Join-Path $env:LOCALAPPDATA "nvim-data\site\spell" $Urls = @( diff --git a/bootstrap-win/neovim.ps1 b/bootstrap-win/neovim.ps1 index 77abf83..32e2db7 100644 --- a/bootstrap-win/neovim.ps1 +++ b/bootstrap-win/neovim.ps1 @@ -1,29 +1,14 @@ #Requires -Version 5.1 <# - Windows-natives Pendant zu bootstrap/neovim.sh (macOS/FreeBSD). - bootstrap/neovim.sh bleibt unveraendert - dieses Skript ist bewusst - eigenstaendig, da sich die Paketquellen (winget/npm statt brew/pkg) und - das Fehlerverhalten zu stark unterscheiden fuer ein gemeinsames Skript. + Windows-natives Pendant zu bootstrap/neovim.sh - nutzt winget/npm statt + brew/pkg, daher eigenstaendiges Skript ohne Git-Bash-/WSL-Abhaengigkeit. - Nutzt ausschliesslich native Windows-Werkzeuge (winget, npm, pwsh/ - powershell.exe) - keine Git-Bash- oder WSL-Abhaengigkeit. - - Aufruf (PowerShell, keine Admin-Rechte noetig): + Aufruf (keine Admin-Rechte noetig): .\bootstrap-win\neovim.ps1 - Hinweis: yamlfmt, gawk und xmllint/libxml2 sind bewusst NICHT enthalten - - im Praxistest (24.07.2026) bestaetigt, dass es dafuer keine winget-Pakete - unter den urspruenglich vermuteten IDs gibt. Siehe Install-Formatters und - neovim-windows-setup.md fuer manuelle Alternativen. mvdan.shfmt und - astral-sh.ruff liefen im Test erfolgreich durch. - - Schlaegt eine winget-Installation trotzdem fehl, meldet das Skript das - als Warnung (bricht nicht ab) und zeigt die letzten Zeilen der winget- - Ausgabe zur Fehlersuche an. - - C-Compiler fuer nvim-treesitter: kein winget-Paket enthalten, da MSVC auf - den Zielsystemen bereits vorhanden ist. Neovim muss dafuer aus einer - "Developer PowerShell for VS" gestartet werden (siehe Install-Tools). + yamlfmt, gawk und xmllint sind bewusst nicht enthalten (siehe + neovim-windows-setup.md). Fehlgeschlagene Installationen werden als + Warnung gemeldet, das Skript bricht nicht ab. #> $ErrorActionPreference = "Stop" @@ -51,10 +36,8 @@ function Test-CommandExists([string]$Name) { } function Find-BinaryDirectory([string]$Binary) { - # Sucht nach ".exe" unter den ueblichen Installationswurzeln. - # Deckt den Fall ab, dass ein winget-Paket (v.a. im --silent-Modus) - # die PATH-Registrierung ausgelassen hat, obwohl es korrekt installiert - # wurde - beobachtet bei LLVM.LLVM/clangd. + # Deckt den Fall ab, dass winget (v.a. --silent) korrekt installiert, + # aber die PATH-Registrierung ausgelassen hat (beobachtet bei LLVM.LLVM). $searchRoots = @( $env:ProgramFiles, ${env:ProgramFiles(x86)}, @@ -98,12 +81,7 @@ function Install-WingetPackage([string]$Binary, [string]$Id) { $lastLine = ($output | Select-Object -Last 3) -join " / " if ($text -match "bereits ein vorhandenes Paket|already installed|No applicable update") { - # Paket ist laut winget installiert, aber die Binary steht trotzdem - # nicht im PATH - z.B. weil der Installer (im --silent-Modus) die - # PATH-Registrierung uebersprungen hat. winget search hilft hier - # nicht weiter, da das Paket ja gefunden wurde - stattdessen selbst - # danach suchen und den User-PATH ergaenzen (dauerhaft + fuer diese - # Sitzung). + # Installiert, aber nicht im PATH - Binary suchen und PATH ergaenzen. $dir = Find-BinaryDirectory $Binary if ($dir) { @@ -155,11 +133,7 @@ function Test-Prerequisites { } function Update-SessionPath { - # winget/npm-Installer tragen PATH-Aenderungen in die Registry (User- - # und/oder Machine-Scope) ein, aber der laufende PowerShell-Prozess - # bekommt das nicht automatisch mit. Ohne diesen Refresh wuerde z.B. - # "npm" gleich im Anschluss an die Node-Installation als "nicht - # gefunden" gemeldet, obwohl es gerade erst installiert wurde. + # Registry-PATH-Aenderungen durch winget/npm wirken erst nach diesem Refresh. $machine = [Environment]::GetEnvironmentVariable("PATH", "Machine") $user = [Environment]::GetEnvironmentVariable("PATH", "User") $env:PATH = "$machine;$user" @@ -178,14 +152,7 @@ function Install-Formatters { Install-WingetPackage -Binary "shfmt" -Id "mvdan.shfmt" Install-WingetPackage -Binary "stylua" -Id "JohnnyMorganz.StyLua" - # yamlfmt, gawk, xmllint: im Praxistest bestaetigt, dass es unter diesen - # IDs kein winget-Paket gibt ("Es wurde kein Paket gefunden, das den - # Eingabekriterien entspricht"). Kein verifizierter Ersatz gefunden, - # deshalb bewusst nicht automatisiert - siehe neovim-windows-setup.md - # fuer manuelle Alternativen. conform.nvim faellt bei fehlendem - # Formatter fuer die jeweilige Dateiart einfach auf LSP-Formatierung - # zurueck (default_format_opts.lsp_format = "fallback"), betrifft also - # nur awk/xml/xsd/yaml-Dateien. + # yamlfmt, gawk, xmllint: kein winget-Paket gefunden, siehe neovim-windows-setup.md. } function Install-Tools { @@ -193,24 +160,8 @@ function Install-Tools { Install-WingetPackage -Binary "fd" -Id "sharkdp.fd" Install-NpmPackage -Binary "tree-sitter" -Package "tree-sitter-cli" - # C-Compiler fuer nvim-treesitter: kein winget-Paket noetig, MSVC (cl.exe) - # ist auf diesen Systemen bereits vorhanden. nvim-treesitter findet cl.exe - # automatisch, ABER nur wenn INCLUDE/LIB gesetzt sind - das passiert nicht - # in einer normalen PowerShell, sondern nur in einer "Developer PowerShell - # for VS" bzw. "x64 Native Tools Command Prompt". Neovim also immer aus - # so einer Shell heraus starten, sonst schlaegt die Parser-Kompilierung - # mit "cannot find
.h" o.ae. fehl, obwohl cl.exe selbst gefunden wird. - - # opt.makeprg = "gmake" (nvim/lua/config/options.lua) - Alias liegt in - # windows/bin/gmake.cmd, reicht an "make" durch. Einmalig windows\bin - # zum PATH hinzufuegen (PowerShell, User-Scope, nicht setx mit %PATH% - # verwenden - das wuerde den gesamten 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") - # GnuWin32.Make ist im Praxistest fehlgeschlagen (Paket 2006er-Stand, - # unklar ob im winget-Repo ueberhaupt noch gepflegt). ezwinports.make - # ist ein aktiver gepflegter GNU-Make-Port fuer Windows. + # MSVC (cl.exe) ist bereits vorhanden, kein winget-Paket noetig - Neovim + # dafuer aber aus einer "Developer PowerShell for VS" starten. Install-WingetPackage -Binary "make" -Id "ezwinports.make" } diff --git a/install-win.ps1 b/install-win.ps1 index 15f39e4..aa77243 100644 --- a/install-win.ps1 +++ b/install-win.ps1 @@ -1,18 +1,11 @@ #Requires -Version 5.1 <# - Windows-natives Pendant zu install.sh (ersetzt install-win.cmd). - install.sh bleibt unveraendert - kopiert (statt zu verlinken) die + Windows-natives Pendant zu install.sh - kopiert (statt zu verlinken) die relevanten Konfigurationen an ihre nativen Windows-Zielorte. Keine Admin-Rechte noetig (keine Symlinks). Aufruf: .\install-win.ps1 - - Falls die Ausfuehrung durch die Execution Policy blockiert wird: - powershell -ExecutionPolicy Bypass -File .\install-win.ps1 - - Hinweis: Es wird KOPIERT, nicht verlinkt. Nach Aenderungen im Repo - dieses Skript erneut ausfuehren, um die Kopien zu aktualisieren. #> $ErrorActionPreference = "Stop" @@ -75,17 +68,13 @@ function Copy-Npmrc { return } - # npm/npmrc setzt "prefix=${HOME}/.local", damit globale npm-Installationen - # unter POSIX ohne sudo/root ins Home-Verzeichnis gehen. HOME ist unter - # Windows i.d.R. nicht gesetzt, ${HOME} wuerde also nicht expandieren. - # Der Grund fuer die Einstellung entfaellt unter Windows ohnehin (npm - # nutzt dort schon von Haus aus %APPDATA%\npm, automatisch im PATH) - - # die Zeile wird beim Kopieren einfach auskommentiert, statt eine zweite - # npmrc-Datei zu pflegen. + # HOME ist unter Windows i.d.R. nicht gesetzt, ${HOME} in npm/npmrc wuerde + # nicht expandieren - Zeile daher auskommentieren statt zweite npmrc-Datei + # zu pflegen. Write-Step "npm\npmrc -> $NpmrcDst (prefix-Zeile auskommentiert)" $lines = Get-Content -Path $NpmrcSrc | ForEach-Object { if ($_ -match "^\s*prefix\s*=") { - "; $_ (unter Windows auskommentiert, siehe install-win.ps1: Copy-Npmrc)" + "; $_ (unter Windows auskommentiert)" } else { $_ } -- cgit v1.3