From fe4db25063224c51f9970f2f41d355f60d751b1b Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Thu, 23 Jul 2026 09:51:55 +0200 Subject: bootstrap: neovim-win.ps1 hinzugefuegt (natives PowerShell-Pendant) Reiner PowerShell-Weg statt Git-Bash/WSL, wie von Thomas gewuenscht. Installiert Formatter/Tools/LSP-Server per winget und npm; einzelne fehlschlagende Pakete werden als Warnung gemeldet statt das Skript abzubrechen (mehrere winget-IDs konnten in dieser Session nicht gegen eine Live-Quelle verifiziert werden, siehe Kopfkommentar im Skript). neovim-windows-setup.md: Abschnitt zu externen Abhaengigkeiten auf das neue Skript verweisen lassen statt einzelne Befehle aufzulisten. --- bootstrap/neovim-win.ps1 | 154 +++++++++++++++++++++++++++++++++++++++++++++++ neovim-windows-setup.md | 43 ++----------- 2 files changed, 158 insertions(+), 39 deletions(-) create mode 100644 bootstrap/neovim-win.ps1 diff --git a/bootstrap/neovim-win.ps1 b/bootstrap/neovim-win.ps1 new file mode 100644 index 0000000..60ed0ea --- /dev/null +++ b/bootstrap/neovim-win.ps1 @@ -0,0 +1,154 @@ +#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\neovim-win.ps1 + + Hinweis: Einzelne winget-Paket-IDs (v.a. GnuWin32.Gawk, GnuWin32.Libxml2, + google.yamlfmt, mvdan.shfmt, astral-sh.ruff, zig.zig) 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 "). +#> + +$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 Install-Prerequisites { + Install-WingetPackage -Binary "git" -Id "Git.Git" + Install-WingetPackage -Binary "node" -Id "OpenJS.NodeJS.LTS" +} + +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, damit nvim-treesitter Parser kompilieren kann. + Install-WingetPackage -Binary "zig" -Id "zig.zig" + + # 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, z.B.: + # setx PATH "%PATH%;%USERPROFILE%\dotfiles\windows\bin" + 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 diff --git a/neovim-windows-setup.md b/neovim-windows-setup.md index 7c8e7f3..555c273 100644 --- a/neovim-windows-setup.md +++ b/neovim-windows-setup.md @@ -26,54 +26,19 @@ Nach Änderungen im Repo `install-win.cmd` erneut ausführen, um die Kopien zu a ## 3. Externe Abhängigkeiten -`bootstrap/neovim.sh` bricht unter Windows sofort ab (`Nicht unterstütztes Betriebssystem`) – die Pakete müssen manuell installiert werden: +`bootstrap/neovim.sh` bricht unter Windows sofort ab (`Nicht unterstütztes Betriebssystem`). Stattdessen `bootstrap/neovim-win.ps1` ausführen (reines PowerShell, kein Git Bash/WSL nötig): -**Tools** ```powershell -winget install BurntSushi.ripgrep.MSVC -winget install sharkdp.fd -winget install tree-sitter.tree-sitter +.\bootstrap\neovim-win.ps1 ``` -**C-Compiler** (nötig, damit `nvim-treesitter` Parser kompilieren kann): -```powershell -winget install zig.zig -``` -(zig funktioniert als `cc`-Ersatz für Treesitter; alternativ MSVC Build Tools oder MinGW-w64) +Installiert per `winget`/`npm`: Git, Node, Formatter (jq, prettier, ruff, shfmt, stylua, yamlfmt, gawk, xmllint), Tools (ripgrep, fd, tree-sitter-cli, zig als C-Compiler für Treesitter, 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, zig.zig, sind ungeprüft). -**Make** (für `opt.makeprg = "gmake"`): -```powershell -winget install GnuWin32.Make -``` -Anschließend `windows\bin` (enthält `gmake.cmd`, einen Wrapper der an `make` durchreicht) einmalig zum PATH hinzufügen: +`windows\bin` (enthält `gmake.cmd`, Wrapper für `opt.makeprg = "gmake"`) danach einmalig zum PATH hinzufügen: ```powershell setx PATH "%PATH%;%USERPROFILE%\dotfiles\windows\bin" ``` -**Formatter** (conform.nvim): -```powershell -winget install jqlang.jq -npm install -g prettier -pip install ruff -winget install mvdan.shfmt -winget install JohnnyMorganz.StyLua -winget install google.yamlfmt -winget install GnuWin32.Gawk -``` -`xmllint` (für XML/XSD) ist in libxml2 enthalten – z. B. über `winget install GnuWin32.Libxml2` oder in Git for Windows bereits vorhanden. - -**LSP-Server**: -```powershell -npm install -g basedpyright -npm install -g bash-language-server -npm install -g vscode-langservers-extracted -npm install -g @prisma/language-server -npm install -g @vtsls/language-server -winget install LLVM.LLVM # clangd -winget install koalaman.shellcheck -winget install LuaLS.lua-language-server -``` - ## 4. Bekannte Stolpersteine - **`g.python3_host_prog`** in `nvim/lua/config/options.lua` ist hart auf einen Unix-Pfad (`$HOME/.local/venv/nvim/bin/python`) gesetzt. Unter Windows existiert weder dieses `HOME`-Layout noch `bin/python` (dort `Scripts\python.exe`). Aktuell nutzt kein installiertes Plugin die Python-Provider-API – daher unkritisch, kann ignoriert werden, solange `:python3`-Funktionen nicht gebraucht werden. (Erwägenswert: `g.loaded_python3_provider = 0` setzen, dann verschwindet das Problem ganz – separat besprochen, noch nicht umgesetzt.) -- cgit v1.3