From 660a005fa15e99c4aa1cef3d844a488cfde65010 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Thu, 23 Jul 2026 07:30:36 +0200 Subject: windows: install-win.cmd, gmake.cmd und Windows-Setup-Anleitung hinzugefuegt Eigenstaendiger, Windows-nativer Installationsweg fuer nvim/git/npm-Config (Kopieren statt Symlinks, keine Admin-Rechte noetig). install.sh und die bestehenden bootstrap-Skripte bleiben unveraendert. --- install-win.cmd | 64 ++++++++++++++++++++++++++++++++++ neovim-windows-setup.md | 92 +++++++++++++++++++++++++++++++++++++++++++++++++ windows/bin/gmake.cmd | 11 ++++++ 3 files changed, 167 insertions(+) create mode 100644 install-win.cmd create mode 100644 neovim-windows-setup.md create mode 100644 windows/bin/gmake.cmd diff --git a/install-win.cmd b/install-win.cmd new file mode 100644 index 0000000..007516d --- /dev/null +++ b/install-win.cmd @@ -0,0 +1,64 @@ +@echo off +setlocal enabledelayedexpansion + +rem Windows-natives Pendant zu install.sh. +rem Kopiert (statt zu verlinken) die relevanten Konfigurationen an ihre +rem nativen Windows-Zielorte. install.sh bleibt unveraendert; dieses +rem Skript ist bewusst eigenstaendig, da FreeBSD/macOS und Windows zu +rem unterschiedlich sind fuer eine gemeinsame Installationsroutine. +rem +rem Hinweis: Nach Aenderungen an nvim/ oder git/ dieses Skript erneut +rem ausfuehren, um die Kopien zu aktualisieren (keine Symlinks). + +set "SCRIPT_DIR=%~dp0" + +set "NVIM_SRC=%SCRIPT_DIR%nvim" +set "NVIM_DST=%LOCALAPPDATA%\nvim" + +set "GIT_CONFIG_SRC=%SCRIPT_DIR%git\config" +set "GIT_CONFIG_DST=%USERPROFILE%\.gitconfig" + +set "GIT_UP2PARTS_SRC=%SCRIPT_DIR%git\config-up2parts" +set "GIT_XDG_DIR=%USERPROFILE%\.config\git" +set "GIT_UP2PARTS_DST=%GIT_XDG_DIR%\config-up2parts" + +set "NPMRC_SRC=%SCRIPT_DIR%npm\npmrc" +set "NPMRC_DST=%USERPROFILE%\.npmrc" + +echo === nvim === +robocopy "%NVIM_SRC%" "%NVIM_DST%" /MIR /NFL /NDL /NJH /NJS >nul +if %ERRORLEVEL% GEQ 8 ( + echo Fehler: nvim-Konfiguration konnte nicht nach "%NVIM_DST%" kopiert werden. + exit /b 1 +) +echo OK: %NVIM_DST% + +echo === git === +copy /Y "%GIT_CONFIG_SRC%" "%GIT_CONFIG_DST%" >nul +if errorlevel 1 ( + echo Fehler: git-Konfiguration konnte nicht nach "%GIT_CONFIG_DST%" kopiert werden. + exit /b 1 +) +echo OK: %GIT_CONFIG_DST% + +if not exist "%GIT_XDG_DIR%" mkdir "%GIT_XDG_DIR%" +copy /Y "%GIT_UP2PARTS_SRC%" "%GIT_UP2PARTS_DST%" >nul +if errorlevel 1 ( + echo Fehler: config-up2parts konnte nicht nach "%GIT_UP2PARTS_DST%" kopiert werden. + exit /b 1 +) +echo OK: %GIT_UP2PARTS_DST% ^(wird per includeIf aus .gitconfig eingebunden^) + +echo === npm === +if exist "%NPMRC_DST%" ( + echo Uebersprungen: %NPMRC_DST% existiert bereits. +) else ( + copy /Y "%NPMRC_SRC%" "%NPMRC_DST%" >nul + echo OK: %NPMRC_DST% +) + +echo. +echo Fertig. Dateien wurden KOPIERT, nicht verlinkt. +echo Nach Aenderungen im Repo dieses Skript erneut ausfuehren. + +endlocal diff --git a/neovim-windows-setup.md b/neovim-windows-setup.md new file mode 100644 index 0000000..7c8e7f3 --- /dev/null +++ b/neovim-windows-setup.md @@ -0,0 +1,92 @@ +# 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. + +## 1. Grundwerkzeuge installieren + +```powershell +winget install Neovim.Neovim +winget install Git.Git +winget install OpenJS.NodeJS.LTS +winget install Python.Python.3.12 +``` + +Git for Windows bringt Git Bash mit – eine POSIX-Shell, mit der `install.sh` und die `bootstrap/*.sh`-Skripte direkt lauffähig sind (kein Portieren nach PowerShell nötig). + +## 2. Konfiguration einrichten (Windows-nativer Weg) + +Statt `install.sh` samt XDG-Umgebungsvariablen zu verbiegen: `install-win.cmd` im Repo-Root ausführen. 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) + +Nach Änderungen im Repo `install-win.cmd` erneut ausführen, um die Kopien zu aktualisieren. + +## 3. Externe Abhängigkeiten + +`bootstrap/neovim.sh` bricht unter Windows sofort ab (`Nicht unterstütztes Betriebssystem`) – die Pakete müssen manuell installiert werden: + +**Tools** +```powershell +winget install BurntSushi.ripgrep.MSVC +winget install sharkdp.fd +winget install tree-sitter.tree-sitter +``` + +**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) + +**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: +```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.) +- **`scripts/sonarqube.sh`** (`:SonarIssues`): reines POSIX-Shellskript. Läuft nur, wenn ein `sh` im PATH liegt (z. B. `sh.exe` aus Git for Windows im PATH verfügbar machen). +- **`bootstrap/neovim-dict.sh`** (deutsche Rechtschreibprüfung): unter Git Bash direkt ausführbar. Lädt die Dateien nach `~/.local/share/nvim/site/spell`; unter nativem Windows-Neovim stattdessen manuell nach `%LOCALAPPDATA%\nvim-data\site\spell` legen. +- **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. + +## 5. Verifizieren + +``` +nvim +:checkhealth +``` + +`:checkhealth` zeigt fehlende Provider/Tools direkt an – guter letzter Schritt nach der Installation. 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 @@ +@echo off +rem Wrapper, damit opt.makeprg = "gmake" (aus nvim/lua/config/options.lua) +rem unter Windows funktioniert, ohne die bestehende Config anzupassen. +rem Reicht alle Argumente an das im PATH gefundene "make" weiter. +rem +rem Einmalig einrichten: dieses Verzeichnis (windows\bin) zum PATH +rem hinzufuegen, z.B. ueber: +rem setx PATH "%PATH%;%USERPROFILE%\dotfiles\windows\bin" + +make %* +exit /b %ERRORLEVEL% -- cgit v1.3 From 1b2066ee60e9fc629941db716d8a7ac6d81dbca6 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Thu, 23 Jul 2026 07:42:59 +0200 Subject: neovim: Python- und Node-Provider deaktiviert, bootstrap bereinigt Alle Plugins sind reines Lua, ein Provider wird nicht benoetigt. g.python3_host_prog entfernt (zeigte auf unix-spezifischen venv-Pfad), stattdessen g.loaded_python3_provider = 0 und g.loaded_node_provider = 0. bootstrap/neovim.sh: setup_python_provider() (venv + pynvim) und install_npm neovim-node-host entfernt, python3 als Systemvoraussetzung gestrichen. node bleibt (wird fuer npm-Installationen benoetigt). --- bootstrap/neovim.sh | 42 ------------------------------------------ nvim/lua/config/options.lua | 5 +++-- 2 files changed, 3 insertions(+), 44 deletions(-) diff --git a/bootstrap/neovim.sh b/bootstrap/neovim.sh index d601dbd..6ffefaf 100755 --- a/bootstrap/neovim.sh +++ b/bootstrap/neovim.sh @@ -78,51 +78,10 @@ install_npm() { npm install -g "$package" } -install_pip() { - python="$1" - package="$2" - - if "$python" -c "import $package" >/dev/null 2>&1; then - printf "✓ %-32s vorhanden\n" "$package" - return - fi - - printf "→ Installiere Python-Paket %s\n" "$package" - env \ - -u C_INCLUDE_PATH \ - -u CPLUS_INCLUDE_PATH \ - -u LIBRARY_PATH \ - "$python" -m pip install --no-cache-dir "$package" -} - -setup_python_provider() { - VENV="$HOME/.local/venv/nvim" - PYTHON="${PYTHON:-python3}" - - if ! have "$PYTHON"; then - die "Python wurde nicht gefunden." - fi - - if [ ! -x "$VENV/bin/python" ]; then - printf "→ Erzeuge Python-Venv %s\n" "$VENV" - - mkdir -p "$(dirname "$VENV")" - "$PYTHON" -m venv "$VENV" - fi - - install_pip "$VENV/bin/python" pynvim -} - install_prerequisites() { install_pkg curl curl install_pkg git git install_pkg node node - install_pkg python3 python -} - -install_providers() { - install_npm neovim-node-host neovim - setup_python_provider } install_formatters() { @@ -187,7 +146,6 @@ main() { setup_homebrew_env install_prerequisites - install_providers install_formatters install_tools install_lsp diff --git a/nvim/lua/config/options.lua b/nvim/lua/config/options.lua index abd5ed9..409c620 100644 --- a/nvim/lua/config/options.lua +++ b/nvim/lua/config/options.lua @@ -92,11 +92,12 @@ opt.clipboard = "unnamedplus" opt.updatetime = 250 opt.timeoutlen = 300 --- Provider deaktivieren +-- Provider deaktivieren (alle Plugins sind reines Lua, kein Provider noetig) g.loaded_ruby_provider = 0 g.loaded_perl_provider = 0 g.loaded_luarocks_provider = 0 -g.python3_host_prog = os.getenv("HOME") .. "/.local/venv/nvim/bin/python" +g.loaded_python3_provider = 0 +g.loaded_node_provider = 0 -- netrw deaktivieren g.loaded_netrw = 1 -- cgit v1.3 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 From b504e16f941470d46c0f8495f7ea4368e5d14871 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Thu, 23 Jul 2026 10:00:34 +0200 Subject: windows: install-win.cmd durch install-win.ps1 ersetzt, neovim-dict-win.ps1 ergaenzt install-win.cmd entfernt, install-win.ps1 (reines PowerShell) uebernimmt dieselbe Aufgabe (Config-Kopie nach %LOCALAPPDATA%\nvim, .gitconfig, config-up2parts, npmrc). Ausserdem bootstrap/neovim-dict-win.ps1 als PowerShell-Pendant zu bootstrap/neovim-dict.sh: laedt die deutschen Rechtschreib-Woerterbuecher nach %LOCALAPPDATA%\nvim-data\site\spell. neovim-windows-setup.md aktualisiert: verweist jetzt durchgehend auf die .ps1-Skripte statt .cmd/Git-Bash, Python-Installationsschritt entfernt (Provider ist deaktiviert), Stolperstein-Liste bereinigt. --- bootstrap/neovim-dict-win.ps1 | 64 +++++++++++++++++++++++++++++ install-win.cmd | 64 ----------------------------- install-win.ps1 | 93 +++++++++++++++++++++++++++++++++++++++++++ neovim-windows-setup.md | 20 ++++++---- 4 files changed, 170 insertions(+), 71 deletions(-) create mode 100644 bootstrap/neovim-dict-win.ps1 delete mode 100644 install-win.cmd create mode 100644 install-win.ps1 diff --git a/bootstrap/neovim-dict-win.ps1 b/bootstrap/neovim-dict-win.ps1 new file mode 100644 index 0000000..6c0c710 --- /dev/null +++ b/bootstrap/neovim-dict-win.ps1 @@ -0,0 +1,64 @@ +#Requires -Version 5.1 +<# + Windows-natives Pendant zu bootstrap/neovim-dict.sh. + Laedt die deutschen Rechtschreib-Woerterbuecher fuer Neovim herunter. + bootstrap/neovim-dict.sh bleibt unveraendert. + + Aufruf: + .\bootstrap\neovim-dict-win.ps1 + + Falls die Ausfuehrung durch die Execution Policy blockiert wird: + powershell -ExecutionPolicy Bypass -File .\bootstrap\neovim-dict-win.ps1 +#> + +$ErrorActionPreference = "Stop" + +function Write-Ok($msg) { + Write-Host "OK $msg" -ForegroundColor Green +} + +function Write-Step($msg) { + Write-Host "==> $msg" -ForegroundColor Cyan +} + +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 = @( + "https://ftp.nluug.nl/pub/vim/runtime/spell/de.utf-8.spl", + "https://ftp.nluug.nl/pub/vim/runtime/spell/de.utf-8.sug" +) + +function Get-SpellFile([string]$Url) { + $fileName = Split-Path -Leaf $Url + $dest = Join-Path $SpellDir $fileName + + if (Test-Path $dest) { + Write-SkipMsg $fileName + return + } + + Write-Step "Lade $fileName herunter" + Invoke-WebRequest -Uri $Url -OutFile $dest + Write-Ok $fileName +} + +function Main { + if (-not (Test-Path $SpellDir)) { + New-Item -ItemType Directory -Path $SpellDir -Force | Out-Null + } + + foreach ($url in $Urls) { + Get-SpellFile $url + } + + Write-Host "" + Write-Host "Woerterbuecher fuer Neovim installiert!" -ForegroundColor Green +} + +Main diff --git a/install-win.cmd b/install-win.cmd deleted file mode 100644 index 007516d..0000000 --- a/install-win.cmd +++ /dev/null @@ -1,64 +0,0 @@ -@echo off -setlocal enabledelayedexpansion - -rem Windows-natives Pendant zu install.sh. -rem Kopiert (statt zu verlinken) die relevanten Konfigurationen an ihre -rem nativen Windows-Zielorte. install.sh bleibt unveraendert; dieses -rem Skript ist bewusst eigenstaendig, da FreeBSD/macOS und Windows zu -rem unterschiedlich sind fuer eine gemeinsame Installationsroutine. -rem -rem Hinweis: Nach Aenderungen an nvim/ oder git/ dieses Skript erneut -rem ausfuehren, um die Kopien zu aktualisieren (keine Symlinks). - -set "SCRIPT_DIR=%~dp0" - -set "NVIM_SRC=%SCRIPT_DIR%nvim" -set "NVIM_DST=%LOCALAPPDATA%\nvim" - -set "GIT_CONFIG_SRC=%SCRIPT_DIR%git\config" -set "GIT_CONFIG_DST=%USERPROFILE%\.gitconfig" - -set "GIT_UP2PARTS_SRC=%SCRIPT_DIR%git\config-up2parts" -set "GIT_XDG_DIR=%USERPROFILE%\.config\git" -set "GIT_UP2PARTS_DST=%GIT_XDG_DIR%\config-up2parts" - -set "NPMRC_SRC=%SCRIPT_DIR%npm\npmrc" -set "NPMRC_DST=%USERPROFILE%\.npmrc" - -echo === nvim === -robocopy "%NVIM_SRC%" "%NVIM_DST%" /MIR /NFL /NDL /NJH /NJS >nul -if %ERRORLEVEL% GEQ 8 ( - echo Fehler: nvim-Konfiguration konnte nicht nach "%NVIM_DST%" kopiert werden. - exit /b 1 -) -echo OK: %NVIM_DST% - -echo === git === -copy /Y "%GIT_CONFIG_SRC%" "%GIT_CONFIG_DST%" >nul -if errorlevel 1 ( - echo Fehler: git-Konfiguration konnte nicht nach "%GIT_CONFIG_DST%" kopiert werden. - exit /b 1 -) -echo OK: %GIT_CONFIG_DST% - -if not exist "%GIT_XDG_DIR%" mkdir "%GIT_XDG_DIR%" -copy /Y "%GIT_UP2PARTS_SRC%" "%GIT_UP2PARTS_DST%" >nul -if errorlevel 1 ( - echo Fehler: config-up2parts konnte nicht nach "%GIT_UP2PARTS_DST%" kopiert werden. - exit /b 1 -) -echo OK: %GIT_UP2PARTS_DST% ^(wird per includeIf aus .gitconfig eingebunden^) - -echo === npm === -if exist "%NPMRC_DST%" ( - echo Uebersprungen: %NPMRC_DST% existiert bereits. -) else ( - copy /Y "%NPMRC_SRC%" "%NPMRC_DST%" >nul - echo OK: %NPMRC_DST% -) - -echo. -echo Fertig. Dateien wurden KOPIERT, nicht verlinkt. -echo Nach Aenderungen im Repo dieses Skript erneut ausfuehren. - -endlocal diff --git a/install-win.ps1 b/install-win.ps1 new file mode 100644 index 0000000..41b3b51 --- /dev/null +++ b/install-win.ps1 @@ -0,0 +1,93 @@ +#Requires -Version 5.1 +<# + Windows-natives Pendant zu install.sh (ersetzt install-win.cmd). + install.sh bleibt unveraendert - 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" + +function Write-Ok($msg) { + Write-Host "OK $msg" -ForegroundColor Green +} + +function Write-Step($msg) { + Write-Host "==> $msg" -ForegroundColor Cyan +} + +function Write-SkipMsg($msg) { + Write-Host "- $msg" -ForegroundColor DarkGray +} + +$RepoRoot = $PSScriptRoot + +$NvimSrc = Join-Path $RepoRoot "nvim" +$NvimDst = Join-Path $env:LOCALAPPDATA "nvim" + +$GitConfigSrc = Join-Path $RepoRoot "git\config" +$GitConfigDst = Join-Path $env:USERPROFILE ".gitconfig" + +$GitUp2partsSrc = Join-Path $RepoRoot "git\config-up2parts" +$GitXdgDir = Join-Path $env:USERPROFILE ".config\git" +$GitUp2partsDst = Join-Path $GitXdgDir "config-up2parts" + +$NpmrcSrc = Join-Path $RepoRoot "npm\npmrc" +$NpmrcDst = Join-Path $env:USERPROFILE ".npmrc" + +function Copy-NvimConfig { + Write-Step "nvim -> $NvimDst" + + if (Test-Path $NvimDst) { + Remove-Item -Recurse -Force $NvimDst + } + + Copy-Item -Recurse -Force $NvimSrc $NvimDst + Write-Ok $NvimDst +} + +function Copy-GitConfig { + Write-Step "git\config -> $GitConfigDst" + Copy-Item -Force $GitConfigSrc $GitConfigDst + Write-Ok $GitConfigDst + + if (-not (Test-Path $GitXdgDir)) { + New-Item -ItemType Directory -Path $GitXdgDir -Force | Out-Null + } + + Write-Step "git\config-up2parts -> $GitUp2partsDst" + Copy-Item -Force $GitUp2partsSrc $GitUp2partsDst + Write-Ok "$GitUp2partsDst (wird per includeIf aus .gitconfig eingebunden)" +} + +function Copy-Npmrc { + if (Test-Path $NpmrcDst) { + Write-SkipMsg "$NpmrcDst existiert bereits, uebersprungen" + return + } + + Write-Step "npm\npmrc -> $NpmrcDst" + Copy-Item -Force $NpmrcSrc $NpmrcDst + Write-Ok $NpmrcDst +} + +function Main { + Copy-NvimConfig + Copy-GitConfig + Copy-Npmrc + + Write-Host "" + Write-Host "Fertig. Dateien wurden KOPIERT, nicht verlinkt." -ForegroundColor Green + Write-Host "Nach Aenderungen im Repo dieses Skript erneut ausfuehren." +} + +Main diff --git a/neovim-windows-setup.md b/neovim-windows-setup.md index 555c273..bc27f4a 100644 --- a/neovim-windows-setup.md +++ b/neovim-windows-setup.md @@ -2,27 +2,34 @@ 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). Falls die Ausführung durch die Execution Policy blockiert wird, entweder pro Aufruf `powershell -ExecutionPolicy Bypass -File .\skript.ps1` verwenden, oder einmalig `Set-ExecutionPolicy -Scope CurrentUser RemoteSigned`. + ## 1. Grundwerkzeuge installieren ```powershell winget install Neovim.Neovim winget install Git.Git winget install OpenJS.NodeJS.LTS -winget install Python.Python.3.12 ``` -Git for Windows bringt Git Bash mit – eine POSIX-Shell, mit der `install.sh` und die `bootstrap/*.sh`-Skripte direkt lauffähig sind (kein Portieren nach PowerShell nötig). +(Kein Python nötig – der Python-Provider ist in `options.lua` deaktiviert, siehe Abschnitt 4.) ## 2. Konfiguration einrichten (Windows-nativer Weg) -Statt `install.sh` samt XDG-Umgebungsvariablen zu verbiegen: `install-win.cmd` im Repo-Root ausführen. Es kopiert (keine Symlinks, keine Admin-Rechte nötig): +`install-win.ps1` im Repo-Root ausführen: + +```powershell +.\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) -Nach Änderungen im Repo `install-win.cmd` erneut ausführen, um die Kopien zu aktualisieren. +Nach Änderungen im Repo `install-win.ps1` erneut ausführen, um die Kopien zu aktualisieren. ## 3. Externe Abhängigkeiten @@ -41,9 +48,8 @@ setx PATH "%PATH%;%USERPROFILE%\dotfiles\windows\bin" ## 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.) -- **`scripts/sonarqube.sh`** (`:SonarIssues`): reines POSIX-Shellskript. Läuft nur, wenn ein `sh` im PATH liegt (z. B. `sh.exe` aus Git for Windows im PATH verfügbar machen). -- **`bootstrap/neovim-dict.sh`** (deutsche Rechtschreibprüfung): unter Git Bash direkt ausführbar. Lädt die Dateien nach `~/.local/share/nvim/site/spell`; unter nativem Windows-Neovim stattdessen manuell nach `%LOCALAPPDATA%\nvim-data\site\spell` legen. +- **Rechtschreibprüfung (Deutsch)**: `bootstrap/neovim-dict-win.ps1` ausführen – lädt `de.utf-8.spl`/`.sug` nach `%LOCALAPPDATA%\nvim-data\site\spell` (nativer Windows-Datenpfad von Neovim). +- **`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. -- cgit v1.3 From bb70769ffdc3b93329f364f47c49148658a03d44 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Thu, 23 Jul 2026 10:16:22 +0200 Subject: windows: cmd-Style %VAR%-Syntax in PowerShell-Kontexten korrigiert setx PATH "%PATH%;..." funktioniert in PowerShell nicht wie in cmd.exe (kein automatisches Expandieren von %VAR%) und haette zusaetzlich den kompletten Prozess-PATH inkl. System-Anteil dauerhaft in den User-PATH kopiert. Ersetzt durch [Environment]::GetEnvironmentVariable/SetEnviron- mentVariable("PATH", ..., "User") in bootstrap/neovim-win.ps1 und neovim-windows-setup.md. Ausserdem klargestellt, dass windows/bin/gmake.cmd bewusst die einzige Nicht-PowerShell-Datei im Windows-Zweig bleibt. --- bootstrap/neovim-win.ps1 | 7 +++++-- neovim-windows-setup.md | 7 ++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/bootstrap/neovim-win.ps1 b/bootstrap/neovim-win.ps1 index 60ed0ea..a2e755b 100644 --- a/bootstrap/neovim-win.ps1 +++ b/bootstrap/neovim-win.ps1 @@ -115,8 +115,11 @@ function Install-Tools { # 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" + # 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" } diff --git a/neovim-windows-setup.md b/neovim-windows-setup.md index bc27f4a..61c4b08 100644 --- a/neovim-windows-setup.md +++ b/neovim-windows-setup.md @@ -2,7 +2,7 @@ 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). Falls die Ausführung durch die Execution Policy blockiert wird, entweder pro Aufruf `powershell -ExecutionPolicy Bypass -File .\skript.ps1` verwenden, oder einmalig `Set-ExecutionPolicy -Scope CurrentUser RemoteSigned`. +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. 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`. ## 1. Grundwerkzeuge installieren @@ -41,9 +41,10 @@ Nach Änderungen im Repo `install-win.ps1` erneut ausführen, um die Kopien zu a 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). -`windows\bin` (enthält `gmake.cmd`, Wrapper für `opt.makeprg = "gmake"`) danach einmalig zum PATH hinzufügen: +`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): ```powershell -setx PATH "%PATH%;%USERPROFILE%\dotfiles\windows\bin" +$userPath = [Environment]::GetEnvironmentVariable("PATH", "User") +[Environment]::SetEnvironmentVariable("PATH", "$userPath;$env:USERPROFILE\dotfiles\windows\bin", "User") ``` ## 4. Bekannte Stolpersteine -- cgit v1.3 From c196e9a59a47bcaceab93342af5cf7a2f6ddd853 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Thu, 23 Jul 2026 10:20:06 +0200 Subject: windows: manuelle Schritte reduzieren (PATH-Refresh, windows/bin automatisch im PATH) bootstrap/neovim-win.ps1: Update-SessionPath liest PATH nach der Git/Node-Installation aus der Registry neu ein, damit die folgenden npm-Installationen (Formatters/LSP) im selben Lauf nicht faelschlich 'npm nicht gefunden' melden. install-win.ps1: haengt windows/bin (gmake.cmd) automatisch und idempotent an den User-PATH an, statt das manuell per Anleitung zu verlangen. --- bootstrap/neovim-win.ps1 | 12 ++++++++++++ install-win.ps1 | 17 +++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/bootstrap/neovim-win.ps1 b/bootstrap/neovim-win.ps1 index a2e755b..1ea3b3c 100644 --- a/bootstrap/neovim-win.ps1 +++ b/bootstrap/neovim-win.ps1 @@ -89,9 +89,21 @@ 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. + $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 { diff --git a/install-win.ps1 b/install-win.ps1 index 41b3b51..632c25e 100644 --- a/install-win.ps1 +++ b/install-win.ps1 @@ -80,14 +80,31 @@ function Copy-Npmrc { Write-Ok $NpmrcDst } +function Add-BinToUserPath { + $binDir = Join-Path $RepoRoot "windows\bin" + $userPath = [Environment]::GetEnvironmentVariable("PATH", "User") + $entries = $userPath -split ";" + + if ($entries -contains $binDir) { + Write-SkipMsg "$binDir bereits im User-PATH" + return + } + + Write-Step "$binDir zum User-PATH hinzufuegen (enthaelt gmake.cmd)" + [Environment]::SetEnvironmentVariable("PATH", "$userPath;$binDir", "User") + Write-Ok "$binDir (wirkt erst in neuen Terminal-Sitzungen)" +} + function Main { Copy-NvimConfig Copy-GitConfig Copy-Npmrc + Add-BinToUserPath Write-Host "" Write-Host "Fertig. Dateien wurden KOPIERT, nicht verlinkt." -ForegroundColor Green Write-Host "Nach Aenderungen im Repo dieses Skript erneut ausfuehren." + Write-Host "Neues Terminal oeffnen, damit PATH-Aenderungen wirksam werden." -ForegroundColor Yellow } Main -- cgit v1.3 From f21cb20d527cb7065d3f343c87aee3dff78c6d98 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Thu, 23 Jul 2026 10:20:42 +0200 Subject: windows-setup.md: Abschnitt fuer manuelle Voraussetzungen ergaenzt Fasst zusammen, was keines der Skripte automatisiert: Execution Policy, winget/App-Installer selbst, Neovim-Installation, delta (git pager, war auch unter macOS/FreeBSD nie Teil von bootstrap/neovim.sh), neues Terminal nach PATH-Aenderungen, Stichprobenpruefung der GnuWin32-Pakete, empfohlene Reihenfolge der Skripte. --- neovim-windows-setup.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/neovim-windows-setup.md b/neovim-windows-setup.md index 61c4b08..935bb68 100644 --- a/neovim-windows-setup.md +++ b/neovim-windows-setup.md @@ -4,6 +4,16 @@ Checkliste für die Übernahme der bestehenden `nvim/`-Config aus dem Dotfiles-R 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. 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`. +## 0. Von Hand zu erledigen (nicht durch Skripte abgedeckt) + +- **Execution Policy** setzen (siehe oben), sonst starten die `.ps1`-Skripte gar nicht. +- **`winget` selbst muss vorhanden sein** ("App Installer" aus dem Microsoft Store) – `bootstrap/neovim-win.ps1` prüft das und bricht mit klarer Meldung ab, kann `winget` aber nicht selbst nachinstallieren. +- **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`). +- **Reihenfolge**: `install-win.ps1` und `bootstrap/neovim-win.ps1` sind unabhängig voneinander, `bootstrap/neovim-dict-win.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). + ## 1. Grundwerkzeuge installieren ```powershell -- cgit v1.3 From 41ebdaff90a0b23262bf89c08444de20469c2232 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Thu, 23 Jul 2026 10:55:57 +0200 Subject: windows: zig durch vorhandenes MSVC ersetzt Auf den Ziel-Windows-Systemen ist bereits ein aktuelles MSVC installiert, daher entfaellt die zig.zig-Installation in bootstrap/neovim-win.ps1 komplett (auch aus dem Kopfkommentar/der Liste ungeprueft er IDs entfernt). Stattdessen dokumentiert (Skript-Kommentar + neovim-windows-setup.md, Abschnitte 1/3/4): cl.exe braucht INCLUDE/LIB aus vcvarsall.bat, die nur in einer 'Developer PowerShell for VS' gesetzt sind - Neovim muss dort gestartet werden, sonst schlaegt die Treesitter-Parser-Kompilierung fehl. --- bootstrap/neovim-win.ps1 | 22 +++++++++++++++------- neovim-windows-setup.md | 8 ++++++-- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/bootstrap/neovim-win.ps1 b/bootstrap/neovim-win.ps1 index 1ea3b3c..8af6140 100644 --- a/bootstrap/neovim-win.ps1 +++ b/bootstrap/neovim-win.ps1 @@ -12,11 +12,14 @@ .\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 "). + 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" @@ -122,8 +125,13 @@ function Install-Tools { 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" + # 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 diff --git a/neovim-windows-setup.md b/neovim-windows-setup.md index 935bb68..4faecd8 100644 --- a/neovim-windows-setup.md +++ b/neovim-windows-setup.md @@ -13,6 +13,7 @@ Alle Windows-Skripte in diesem Repo sind reines PowerShell (kein Git Bash, kein - **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`). - **Reihenfolge**: `install-win.ps1` und `bootstrap/neovim-win.ps1` sind unabhängig voneinander, `bootstrap/neovim-dict-win.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. ## 1. Grundwerkzeuge installieren @@ -22,7 +23,7 @@ winget install Git.Git winget install OpenJS.NodeJS.LTS ``` -(Kein Python nötig – der Python-Provider ist in `options.lua` deaktiviert, siehe Abschnitt 4.) +(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.) ## 2. Konfiguration einrichten (Windows-nativer Weg) @@ -49,7 +50,9 @@ Nach Änderungen im Repo `install-win.ps1` erneut ausführen, um die Kopien zu a .\bootstrap\neovim-win.ps1 ``` -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). +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). + +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): ```powershell @@ -59,6 +62,7 @@ $userPath = [Environment]::GetEnvironmentVariable("PATH", "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 `
`.h" fehl, obwohl `cl.exe` selbst gefunden wird. Neovim also immer aus dieser Developer-Shell heraus starten. - **Rechtschreibprüfung (Deutsch)**: `bootstrap/neovim-dict-win.ps1` ausführen – lädt `de.utf-8.spl`/`.sug` nach `%LOCALAPPDATA%\nvim-data\site\spell` (nativer Windows-Datenpfad von Neovim). - **`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. -- cgit v1.3 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-dict.ps1 | 64 +++++++++++++++ bootstrap-win/neovim.ps1 | 177 ++++++++++++++++++++++++++++++++++++++++++ bootstrap/neovim-dict-win.ps1 | 64 --------------- bootstrap/neovim-win.ps1 | 177 ------------------------------------------ neovim-windows-setup.md | 10 +-- 5 files changed, 246 insertions(+), 246 deletions(-) create mode 100644 bootstrap-win/neovim-dict.ps1 create mode 100644 bootstrap-win/neovim.ps1 delete mode 100644 bootstrap/neovim-dict-win.ps1 delete mode 100644 bootstrap/neovim-win.ps1 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 @@ +#Requires -Version 5.1 +<# + 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" + +function Write-Ok($msg) { + Write-Host "OK $msg" -ForegroundColor Green +} + +function Write-Step($msg) { + Write-Host "==> $msg" -ForegroundColor Cyan +} + +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 = @( + "https://ftp.nluug.nl/pub/vim/runtime/spell/de.utf-8.spl", + "https://ftp.nluug.nl/pub/vim/runtime/spell/de.utf-8.sug" +) + +function Get-SpellFile([string]$Url) { + $fileName = Split-Path -Leaf $Url + $dest = Join-Path $SpellDir $fileName + + if (Test-Path $dest) { + Write-SkipMsg $fileName + return + } + + Write-Step "Lade $fileName herunter" + Invoke-WebRequest -Uri $Url -OutFile $dest + Write-Ok $fileName +} + +function Main { + if (-not (Test-Path $SpellDir)) { + New-Item -ItemType Directory -Path $SpellDir -Force | Out-Null + } + + foreach ($url in $Urls) { + Get-SpellFile $url + } + + Write-Host "" + Write-Host "Woerterbuecher fuer Neovim installiert!" -ForegroundColor Green +} + +Main 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 diff --git a/bootstrap/neovim-dict-win.ps1 b/bootstrap/neovim-dict-win.ps1 deleted file mode 100644 index 6c0c710..0000000 --- a/bootstrap/neovim-dict-win.ps1 +++ /dev/null @@ -1,64 +0,0 @@ -#Requires -Version 5.1 -<# - Windows-natives Pendant zu bootstrap/neovim-dict.sh. - Laedt die deutschen Rechtschreib-Woerterbuecher fuer Neovim herunter. - bootstrap/neovim-dict.sh bleibt unveraendert. - - Aufruf: - .\bootstrap\neovim-dict-win.ps1 - - Falls die Ausfuehrung durch die Execution Policy blockiert wird: - powershell -ExecutionPolicy Bypass -File .\bootstrap\neovim-dict-win.ps1 -#> - -$ErrorActionPreference = "Stop" - -function Write-Ok($msg) { - Write-Host "OK $msg" -ForegroundColor Green -} - -function Write-Step($msg) { - Write-Host "==> $msg" -ForegroundColor Cyan -} - -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 = @( - "https://ftp.nluug.nl/pub/vim/runtime/spell/de.utf-8.spl", - "https://ftp.nluug.nl/pub/vim/runtime/spell/de.utf-8.sug" -) - -function Get-SpellFile([string]$Url) { - $fileName = Split-Path -Leaf $Url - $dest = Join-Path $SpellDir $fileName - - if (Test-Path $dest) { - Write-SkipMsg $fileName - return - } - - Write-Step "Lade $fileName herunter" - Invoke-WebRequest -Uri $Url -OutFile $dest - Write-Ok $fileName -} - -function Main { - if (-not (Test-Path $SpellDir)) { - New-Item -ItemType Directory -Path $SpellDir -Force | Out-Null - } - - foreach ($url in $Urls) { - Get-SpellFile $url - } - - Write-Host "" - Write-Host "Woerterbuecher fuer Neovim installiert!" -ForegroundColor Green -} - -Main diff --git a/bootstrap/neovim-win.ps1 b/bootstrap/neovim-win.ps1 deleted file mode 100644 index 8af6140..0000000 --- a/bootstrap/neovim-win.ps1 +++ /dev/null @@ -1,177 +0,0 @@ -#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) 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 diff --git a/neovim-windows-setup.md b/neovim-windows-setup.md index 4faecd8..00d41e1 100644 --- a/neovim-windows-setup.md +++ b/neovim-windows-setup.md @@ -7,12 +7,12 @@ Alle Windows-Skripte in diesem Repo sind reines PowerShell (kein Git Bash, kein ## 0. Von Hand zu erledigen (nicht durch Skripte abgedeckt) - **Execution Policy** setzen (siehe oben), sonst starten die `.ps1`-Skripte gar nicht. -- **`winget` selbst muss vorhanden sein** ("App Installer" aus dem Microsoft Store) – `bootstrap/neovim-win.ps1` prüft das und bricht mit klarer Meldung ab, kann `winget` aber nicht selbst nachinstallieren. +- **`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. - **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`). -- **Reihenfolge**: `install-win.ps1` und `bootstrap/neovim-win.ps1` sind unabhängig voneinander, `bootstrap/neovim-dict-win.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). +- **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. ## 1. Grundwerkzeuge installieren @@ -44,10 +44,10 @@ Nach Änderungen im Repo `install-win.ps1` erneut ausführen, um die Kopien zu a ## 3. Externe Abhängigkeiten -`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): +`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): ```powershell -.\bootstrap\neovim-win.ps1 +.\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). @@ -63,7 +63,7 @@ $userPath = [Environment]::GetEnvironmentVariable("PATH", "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 `
`.h" fehl, obwohl `cl.exe` selbst gefunden wird. Neovim also immer aus dieser Developer-Shell heraus starten. -- **Rechtschreibprüfung (Deutsch)**: `bootstrap/neovim-dict-win.ps1` ausführen – lädt `de.utf-8.spl`/`.sug` nach `%LOCALAPPDATA%\nvim-data\site\spell` (nativer Windows-Datenpfad von Neovim). +- **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). - **`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. -- cgit v1.3 From eb7f91dc5f94b2e8d0c49364fc3c32c864a09ba0 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Thu, 23 Jul 2026 11:27:22 +0200 Subject: windows-setup.md: Abschnitt zum Aktualisieren ergaenzt Pendant zu 'brew update && brew upgrade' / 'pkg update && pkg upgrade': winget source update + winget upgrade --all, Vorschau per winget list --upgrade-available, einzelne Pakete/Pins, npm update -g fuer die npm-basierten LSP-Server/Formatter. Klargestellt, dass ein erneuter Lauf von bootstrap-win/neovim.ps1 keine Updates durchfuehrt (Install-* Funktionen ueberspringen bereits vorhandene Binaries). --- neovim-windows-setup.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/neovim-windows-setup.md b/neovim-windows-setup.md index 00d41e1..24e5bc0 100644 --- a/neovim-windows-setup.md +++ b/neovim-windows-setup.md @@ -76,3 +76,37 @@ nvim ``` `: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): + +```powershell +winget source update # Paketquellen aktualisieren +winget upgrade --all # alle winget-Pakete aktualisieren +``` + +Vorschau, was aktualisiert würde, ohne etwas zu ändern: + +```powershell +winget list --upgrade-available +``` + +Einzelnes Paket gezielt aktualisieren (IDs siehe `bootstrap-win/neovim.ps1`): + +```powershell +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. +- 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: + +```powershell +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. -- cgit v1.3 From 8036b894c4c8c9a24fe66a50570c09d91c11b349 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Fri, 24 Jul 2026 08:12:37 +0200 Subject: bootstrap: sonar-scanner fuer macOS ergaenzt Wird direkt von nvim/lua/config/usercmds.lua (:SonarScan) und nvim/scripts/sonarqube.sh (:SonarIssues) genutzt - anders als delta oder Neovim selbst ist das keine lose Zusatzsoftware, sondern eine von der Config vorausgesetzte Abhaengigkeit, analog zu clangd/ripgrep. Nur unter Darwin (beruflicher Einsatz), kein FreeBSD-Zweig. --- bootstrap/neovim.sh | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/bootstrap/neovim.sh b/bootstrap/neovim.sh index 6ffefaf..94bf82b 100755 --- a/bootstrap/neovim.sh +++ b/bootstrap/neovim.sh @@ -141,6 +141,17 @@ install_lsp() { install_npm vtsls @vtsls/language-server } +install_analysis() { + # sonar-scanner wird direkt von nvim/lua/config/usercmds.lua (:SonarScan) + # und nvim/scripts/sonarqube.sh (:SonarIssues) genutzt. Nur beruflich + # unter macOS im Einsatz, deshalb kein FreeBSD-Zweig. + case "$OS" in + Darwin) + install_pkg sonar-scanner sonar-scanner + ;; + esac +} + main() { check_prerequisites setup_homebrew_env @@ -149,6 +160,7 @@ main() { install_formatters install_tools install_lsp + install_analysis printf "\nBootstrap abgeschlossen.\n" } -- 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(-) 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(-) 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(-) 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 3c5212f19dbbacb831a73e2f3b5efa8e8f70fc8e Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Fri, 24 Jul 2026 10:17:43 +0200 Subject: windows-setup.md: dandavison.delta als bestaetigt markiert Im Praxistest erfolgreich installiert, keine ID-Unsicherheit mehr. --- neovim-windows-setup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neovim-windows-setup.md b/neovim-windows-setup.md index f237892..f7dd1c8 100644 --- a/neovim-windows-setup.md +++ b/neovim-windows-setup.md @@ -9,7 +9,7 @@ Alle Windows-Skripte in diesem Repo sind reines PowerShell (kein Git Bash, kein - **Execution Policy** setzen (siehe oben), sonst starten die `.ps1`-Skripte gar nicht. - **`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. - **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). +- **`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: `winget install dandavison.delta` (im Praxistest bestätigt). - **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) 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. -- 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(-) 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 b91319846c364030074726fba73e76f19713e69d Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Fri, 24 Jul 2026 10:32:42 +0200 Subject: windows: eigene npmrc-Variante ohne ${HOME} (npm/npmrc-win) npm/npmrc setzt prefix=${HOME}/.local, damit globale npm-Installationen ohne sudo/root ins Home-Verzeichnis gehen. HOME ist unter Windows i.d.R. nicht gesetzt, ${HOME} wuerde also nicht expandieren. npm/npmrc-win laesst prefix komplett weg - npm nutzt unter Windows ohnehin schon %APPDATA%\npm als Praefix, von Node's eigenem Installer automatisch zum PATH hinzugefuegt, kein Workaround noetig. install-win.ps1 und neovim-windows-setup.md entsprechend angepasst. npm/npmrc (POSIX) bleibt unveraendert. --- install-win.ps1 | 4 ++-- neovim-windows-setup.md | 2 +- npm/npmrc-win | 26 ++++++++++++++++++++++++++ 3 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 npm/npmrc-win diff --git a/install-win.ps1 b/install-win.ps1 index 632c25e..e52c0cb 100644 --- a/install-win.ps1 +++ b/install-win.ps1 @@ -41,7 +41,7 @@ $GitUp2partsSrc = Join-Path $RepoRoot "git\config-up2parts" $GitXdgDir = Join-Path $env:USERPROFILE ".config\git" $GitUp2partsDst = Join-Path $GitXdgDir "config-up2parts" -$NpmrcSrc = Join-Path $RepoRoot "npm\npmrc" +$NpmrcSrc = Join-Path $RepoRoot "npm\npmrc-win" $NpmrcDst = Join-Path $env:USERPROFILE ".npmrc" function Copy-NvimConfig { @@ -75,7 +75,7 @@ function Copy-Npmrc { return } - Write-Step "npm\npmrc -> $NpmrcDst" + Write-Step "npm\npmrc-win -> $NpmrcDst" Copy-Item -Force $NpmrcSrc $NpmrcDst Write-Ok $NpmrcDst } diff --git a/neovim-windows-setup.md b/neovim-windows-setup.md index f7dd1c8..c5fc3fc 100644 --- a/neovim-windows-setup.md +++ b/neovim-windows-setup.md @@ -39,7 +39,7 @@ 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) +- `npm/npmrc-win` → `%USERPROFILE%\.npmrc` (nur falls dort noch keine Datei existiert) – eigene Windows-Variante ohne `prefix=${HOME}/.local`: `HOME` ist unter Windows i. d. R. nicht gesetzt, npm nutzt dort ohnehin schon von Haus aus `%APPDATA%\npm` als Praefix Nach Änderungen im Repo `install-win.ps1` erneut ausführen, um die Kopien zu aktualisieren. diff --git a/npm/npmrc-win b/npm/npmrc-win new file mode 100644 index 0000000..3803390 --- /dev/null +++ b/npm/npmrc-win @@ -0,0 +1,26 @@ +; %USERPROFILE%\.npmrc (Windows) +; +; Kein "prefix" gesetzt, anders als in npm/npmrc (POSIX): dort dient +; prefix=${HOME}/.local dazu, globale Installationen ohne sudo/root ins +; Home-Verzeichnis zu legen. Unter Windows loest npm dieses Problem +; bereits selbst - der Standard-Praefix liegt ohnehin im Benutzerprofil +; (%APPDATA%\npm), von Node's eigenem Installer automatisch zum PATH +; hinzugefuegt. ${HOME} ist unter Windows i.d.R. nicht gesetzt und wuerde +; hier nicht expandieren. + +; default registry +registry=https://registry.npmjs.org/ + +; disable fund-spam +fund=false + +; suppresses notifications about new npm versions +update-notifier=false + +; reduce the attack surface for supply chain attacks +min-release-age=3 + +; disable pre- und post-scripts +ignore-scripts=true + +; vim: ft=dosini -- cgit v1.3 From 7dc291df70e115bf021240d0ea2616dffe28d9c8 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Fri, 24 Jul 2026 10:36:44 +0200 Subject: windows: npmrc-win wieder entfernt, prefix beim Kopieren auskommentieren statt zweite Datei zu pflegen Copy-Npmrc liest npm/npmrc jetzt zeilenweise und kommentiert die prefix=${HOME}/.local-Zeile beim Schreiben nach %USERPROFILE%\.npmrc aus, statt eine separate npm/npmrc-win zu unterhalten. Nur eine npmrc-Datei zu pflegen war der ausdrueckliche Wunsch. --- install-win.ps1 | 20 +++++++++++++++++--- neovim-windows-setup.md | 2 +- npm/npmrc-win | 26 -------------------------- 3 files changed, 18 insertions(+), 30 deletions(-) delete mode 100644 npm/npmrc-win diff --git a/install-win.ps1 b/install-win.ps1 index e52c0cb..15f39e4 100644 --- a/install-win.ps1 +++ b/install-win.ps1 @@ -41,7 +41,7 @@ $GitUp2partsSrc = Join-Path $RepoRoot "git\config-up2parts" $GitXdgDir = Join-Path $env:USERPROFILE ".config\git" $GitUp2partsDst = Join-Path $GitXdgDir "config-up2parts" -$NpmrcSrc = Join-Path $RepoRoot "npm\npmrc-win" +$NpmrcSrc = Join-Path $RepoRoot "npm\npmrc" $NpmrcDst = Join-Path $env:USERPROFILE ".npmrc" function Copy-NvimConfig { @@ -75,8 +75,22 @@ function Copy-Npmrc { return } - Write-Step "npm\npmrc-win -> $NpmrcDst" - Copy-Item -Force $NpmrcSrc $NpmrcDst + # 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. + 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)" + } else { + $_ + } + } + Set-Content -Path $NpmrcDst -Value $lines Write-Ok $NpmrcDst } diff --git a/neovim-windows-setup.md b/neovim-windows-setup.md index c5fc3fc..568638c 100644 --- a/neovim-windows-setup.md +++ b/neovim-windows-setup.md @@ -39,7 +39,7 @@ 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-win` → `%USERPROFILE%\.npmrc` (nur falls dort noch keine Datei existiert) – eigene Windows-Variante ohne `prefix=${HOME}/.local`: `HOME` ist unter Windows i. d. R. nicht gesetzt, npm nutzt dort ohnehin schon von Haus aus `%APPDATA%\npm` als Praefix +- `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. diff --git a/npm/npmrc-win b/npm/npmrc-win deleted file mode 100644 index 3803390..0000000 --- a/npm/npmrc-win +++ /dev/null @@ -1,26 +0,0 @@ -; %USERPROFILE%\.npmrc (Windows) -; -; Kein "prefix" gesetzt, anders als in npm/npmrc (POSIX): dort dient -; prefix=${HOME}/.local dazu, globale Installationen ohne sudo/root ins -; Home-Verzeichnis zu legen. Unter Windows loest npm dieses Problem -; bereits selbst - der Standard-Praefix liegt ohnehin im Benutzerprofil -; (%APPDATA%\npm), von Node's eigenem Installer automatisch zum PATH -; hinzugefuegt. ${HOME} ist unter Windows i.d.R. nicht gesetzt und wuerde -; hier nicht expandieren. - -; default registry -registry=https://registry.npmjs.org/ - -; disable fund-spam -fund=false - -; suppresses notifications about new npm versions -update-notifier=false - -; reduce the attack surface for supply chain attacks -min-release-age=3 - -; disable pre- und post-scripts -ignore-scripts=true - -; vim: ft=dosini -- cgit v1.3 From d0456680793b6ed85c3de16ff22c4e7bb80ec341 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Fri, 24 Jul 2026 10:42:48 +0200 Subject: neovim: /dev/null in statusline.lua bricht unter Windows update_git_branch() nutzte '2>/dev/null', um Fehlerausgaben von 'git rev-parse' zu unterdruecken. /dev/null existiert unter Windows nicht - cmd.exe interpretiert es als Dateipfad und meldet 'Das System kann den angegebenen Pfad nicht finden', sichtbar in der Statuszeile. devnull wird jetzt je nach vim.fn.has('win32') auf 'NUL' bzw. '/dev/null' gesetzt. Zusaetzlich ein trailing \r vom systemlist()- Ergebnis entfernt (zeigte sich als ^M in der Statuszeile). --- nvim/lua/config/statusline.lua | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/nvim/lua/config/statusline.lua b/nvim/lua/config/statusline.lua index 0ec6579..8a9c75a 100644 --- a/nvim/lua/config/statusline.lua +++ b/nvim/lua/config/statusline.lua @@ -20,6 +20,10 @@ end -- Git branch (buffer-lokal, gecached, kein redraw-spam) ---------------------------------------------------------------------- +-- /dev/null gibt es unter Windows nicht (cmd.exe versteht das nicht als +-- Pfad und meldet "Das System kann den angegebenen Pfad nicht finden"). +local devnull = vim.fn.has("win32") == 1 and "NUL" or "/dev/null" + local function update_git_branch(bufnr) bufnr = bufnr or 0 @@ -35,7 +39,12 @@ local function update_git_branch(bufnr) return end - local branch = vim.fn.systemlist("git rev-parse --abbrev-ref HEAD 2>/dev/null")[1] + local branch = vim.fn.systemlist("git rev-parse --abbrev-ref HEAD 2>" .. devnull)[1] + if branch then + -- unter Windows bleibt an systemlist()-Zeilen mitunter ein + -- trailing \r haengen (^M in der Statuszeile sichtbar) + branch = branch:gsub("\r$", "") + end if branch and branch ~= "" then vim.b[bufnr].git_branch = "  " .. branch .. " " -- cgit v1.3 From 9a71c3040986aa0fb4d72c54626f58ae25b8a8f7 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Fri, 24 Jul 2026 10:50:24 +0200 Subject: readme: Windows-Setup ergaenzt Neuer Abschnitt 'Windows' unter Setup, analog zu macOS/FreeBSD: install-win.ps1, bootstrap-win/neovim.ps1, bootstrap-win/neovim-dict.ps1. Verweist fuer Details/Voraussetzungen/Stolpersteine auf neovim-windows-setup.md statt alles im knappen Readme zu duplizieren. --- readme.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 465afef..4b168d3 100644 --- a/readme.md +++ b/readme.md @@ -1,9 +1,11 @@ # Dotfiles -My personal dotfiles for macOS and FreeBSD. +My personal dotfiles for macOS, FreeBSD and Windows (Beta). ## Setup +### macOS / FreeBSD + Create the symbolic links: ```sh @@ -17,6 +19,18 @@ Bootstrap the Neovim environment: ./bootstrap/neovim-dict.sh ``` +### Windows + +Native PowerShell, no WSL/Git Bash required: + +```powershell +.\install-win.ps1 +.\bootstrap-win\neovim.ps1 +.\bootstrap-win\neovim-dict.ps1 +``` + +See [neovim-windows-setup.md](neovim-windows-setup.md) for prerequisites (execution policy, MSVC Developer PowerShell for `nvim-treesitter`, ...) and known caveats. + ## Included configuration - [abook] -- cgit v1.3 From 38f60a80eaafe470dfcb7ede4ba74ddf60f056d2 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Fri, 24 Jul 2026 10:58:51 +0200 Subject: windows-setup.md: Renderfehler bei discount/cgit behoben MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Zwei Ursachen identifiziert ueber die vom User verlinkte cgit-Vorschau: 1. 'Abschnitt 3/4' wurde typografisch zu 'Abschnitt ¾' umgewandelt - zu '3 bzw. 4' umformuliert. 2. Der Codeblock mit [Environment]::...-Aufrufen hatte keine Leerzeile vor dem oeffnenden ```powershell-Fence. discount erkennt den Block dadurch nicht als Code, verarbeitet den Inhalt als Fließtext, und [Environment] wird als (kaputter) Markdown-Link interpretiert. Leerzeile ergaenzt; restliche Datei auf dasselbe Muster geprueft, keine weiteren Treffer. --- neovim-windows-setup.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/neovim-windows-setup.md b/neovim-windows-setup.md index 568638c..9da053b 100644 --- a/neovim-windows-setup.md +++ b/neovim-windows-setup.md @@ -24,7 +24,7 @@ winget install Git.Git winget install OpenJS.NodeJS.LTS ``` -(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.) +(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.) ## 2. Konfiguration einrichten (Windows-nativer Weg) @@ -56,6 +56,7 @@ Installiert per `winget`/`npm`: Git, Node, Formatter (jq, prettier, ruff, shfmt, 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): + ```powershell $userPath = [Environment]::GetEnvironmentVariable("PATH", "User") [Environment]::SetEnvironmentVariable("PATH", "$userPath;$env:USERPROFILE\dotfiles\windows\bin", "User") -- cgit v1.3 From 93005dcad88624cb76931fcb2da5ea55ef980902 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Fri, 24 Jul 2026 11:10:51 +0200 Subject: windows-setup.md: Neovim/delta von Abschnitt 0 nach Abschnitt 1 verschoben Die 'von Hand'-Hinweise fuer Neovim und delta waren redundant zu Abschnitt 1 (Neovim) bzw. gehoeren inhaltlich dorthin (delta). delta jetzt Teil des winget-Blocks in 'Grundwerkzeuge installieren', mit kurzer Begruendung darunter statt als eigener Punkt in Abschnitt 0. --- neovim-windows-setup.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/neovim-windows-setup.md b/neovim-windows-setup.md index 9da053b..8847b5a 100644 --- a/neovim-windows-setup.md +++ b/neovim-windows-setup.md @@ -8,8 +8,6 @@ Alle Windows-Skripte in diesem Repo sind reines PowerShell (kein Git Bash, kein - **Execution Policy** setzen (siehe oben), sonst starten die `.ps1`-Skripte gar nicht. - **`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. -- **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: `winget install dandavison.delta` (im Praxistest bestätigt). - **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) 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. @@ -22,8 +20,11 @@ Alle Windows-Skripte in diesem Repo sind reines PowerShell (kein Git Bash, kein winget install Neovim.Neovim winget install Git.Git winget install OpenJS.NodeJS.LTS +winget install dandavison.delta ``` +`delta` wird von `git/config` als Pager vorausgesetzt (`pager = delta`, `diffFilter = delta --color-only`). War auch unter macOS/FreeBSD nie Teil von `bootstrap/neovim.sh` – wurde dort offenbar immer manuell installiert. + (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.) ## 2. Konfiguration einrichten (Windows-nativer Weg) -- cgit v1.3 From c17f0a5f60485b671e10cf8aed39c0bfa69f133e Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Fri, 24 Jul 2026 11:16:47 +0200 Subject: windows-setup.md: Bekannte Stolpersteine auf zwei echte Punkte gekuerzt Entfernt: Rechtschreibpruefung (beschreibt nur bootstrap-win/neovim-dict.ps1, kein Stolperstein), Clipboard (Entwarnung statt Problem), opt.guifont (Einstellung existiert nicht mehr in options.lua), clangd/LLVM.LLVM (seit f60d38e automatisiert, kein manueller Eingriff mehr noetig). Verbleiben: MSVC/Developer PowerShell (echte, nicht automatisierbare Voraussetzung) und scripts/sonarqube.sh (bleibende POSIX-only-Einschraenkung). --- neovim-windows-setup.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/neovim-windows-setup.md b/neovim-windows-setup.md index 8847b5a..6791f3d 100644 --- a/neovim-windows-setup.md +++ b/neovim-windows-setup.md @@ -66,11 +66,7 @@ $userPath = [Environment]::GetEnvironmentVariable("PATH", "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 `
`.h" fehl, obwohl `cl.exe` selbst gefunden wird. Neovim also immer aus dieser Developer-Shell heraus starten. -- **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). - **`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 -- cgit v1.3 From c76dc6075beb1bbbc55231df7d5aa50b5f70ba2c Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Fri, 24 Jul 2026 11:20:14 +0200 Subject: neovim: SonarScan/SonarIssues nur unter POSIX registrieren sonar-scanner und scripts/sonarqube.sh haben kein Windows-Pendant. Statt die Kommandos unter Windows existieren zu lassen und dort mit Fehlern (fehlendes sh, /dev/null-artige Probleme) fehlzuschlagen, werden SonarScan/SonarIssues jetzt nur registriert, wenn vim.fn.has('win32') == 0 - unter Windows existieren die Kommandos schlicht nicht. LspOff/LspOffBuffer/LspOn bleiben unveraendert, betreffen keine Plattform-Abhaengigkeit. neovim-windows-setup.md: den damit erledigten sonarqube.sh-Stolperstein aus Abschnitt 4 entfernt, MSVC/Developer PowerShell bleibt als einziger verbleibender Punkt. --- neovim-windows-setup.md | 1 - nvim/lua/config/usercmds.lua | 10 ++++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/neovim-windows-setup.md b/neovim-windows-setup.md index 6791f3d..8227995 100644 --- a/neovim-windows-setup.md +++ b/neovim-windows-setup.md @@ -66,7 +66,6 @@ $userPath = [Environment]::GetEnvironmentVariable("PATH", "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 `
`.h" fehl, obwohl `cl.exe` selbst gefunden wird. Neovim also immer aus dieser Developer-Shell heraus starten. -- **`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. ## 5. Verifizieren diff --git a/nvim/lua/config/usercmds.lua b/nvim/lua/config/usercmds.lua index 9abc50f..db02497 100644 --- a/nvim/lua/config/usercmds.lua +++ b/nvim/lua/config/usercmds.lua @@ -66,8 +66,14 @@ local function enable_lsp() vim.cmd("edit") -- triggert Reattach bei vielen Setups end -vim.api.nvim_create_user_command("SonarScan", run_sonar, {}) -vim.api.nvim_create_user_command("SonarIssues", load_sonar_issues, {}) +-- sonar-scanner/scripts/sonarqube.sh sind POSIX-only (kein Windows-Pendant), +-- deshalb Kommandos unter Windows gar nicht erst registrieren statt sie +-- dort fehlschlagen zu lassen. +if vim.fn.has("win32") == 0 then + vim.api.nvim_create_user_command("SonarScan", run_sonar, {}) + vim.api.nvim_create_user_command("SonarIssues", load_sonar_issues, {}) +end + vim.api.nvim_create_user_command("LspOff", disable_lsp, {}) vim.api.nvim_create_user_command("LspOffBuffer", disable_lsp_buffer, {}) vim.api.nvim_create_user_command("LspOn", enable_lsp, {}) -- cgit v1.3 From e786fedb6f680e84a9bca37cfad7342a06e05a51 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Fri, 24 Jul 2026 11:21:33 +0200 Subject: neovim: is_windows-Variable statt has('win32') == 0 Lua-Falle vermieden: 0 ist in Lua truthy, ein direktes 'not vim.fn.has("win32")' waere falsch gewesen. Stattdessen is_windows = vim.fn.has("win32") == 1 (liefert echtes bool), dann 'if not is_windows then' - lesbarer als '== 0'. --- nvim/lua/config/usercmds.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/nvim/lua/config/usercmds.lua b/nvim/lua/config/usercmds.lua index db02497..529b370 100644 --- a/nvim/lua/config/usercmds.lua +++ b/nvim/lua/config/usercmds.lua @@ -69,7 +69,9 @@ end -- sonar-scanner/scripts/sonarqube.sh sind POSIX-only (kein Windows-Pendant), -- deshalb Kommandos unter Windows gar nicht erst registrieren statt sie -- dort fehlschlagen zu lassen. -if vim.fn.has("win32") == 0 then +local is_windows = vim.fn.has("win32") == 1 + +if not is_windows then vim.api.nvim_create_user_command("SonarScan", run_sonar, {}) vim.api.nvim_create_user_command("SonarIssues", load_sonar_issues, {}) end -- cgit v1.3 From 430d0d108c086977b9f99040706fe0c0ebe3e2e2 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Fri, 24 Jul 2026 11:28:28 +0200 Subject: windows-setup.md: Execution Policy in Abschnitt 1 (Grundwerkzeuge) verschoben Set-ExecutionPolicy -Scope CurrentUser RemoteSigned jetzt Teil des winget-Blocks in 'Grundwerkzeuge installieren' statt separat erklaert in der Einleitung und als eigener Punkt in Abschnitt 0 (beides entfernt). Hinweis: RemoteSigned als Policy-Wert beibehalten (via Bypass pro Aufruf bleibt als Alternative erwaehnt) - ein Set-ExecutionPolicy-Aufruf ohne Policy-Wert wuerde PowerShell interaktiv danach fragen. --- neovim-windows-setup.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/neovim-windows-setup.md b/neovim-windows-setup.md index 8227995..c925f59 100644 --- a/neovim-windows-setup.md +++ b/neovim-windows-setup.md @@ -2,11 +2,10 @@ 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. 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`. +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) -- **Execution Policy** setzen (siehe oben), sonst starten die `.ps1`-Skripte gar nicht. - **`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`). @@ -16,7 +15,10 @@ Alle Windows-Skripte in diesem Repo sind reines PowerShell (kein Git Bash, kein ## 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`): + ```powershell +Set-ExecutionPolicy -Scope CurrentUser RemoteSigned winget install Neovim.Neovim winget install Git.Git winget install OpenJS.NodeJS.LTS -- cgit v1.3 From 3fa23845d9bb80162922e74c57e2f97849670da0 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Mon, 27 Jul 2026 07:55:23 +0200 Subject: windows: nvim-update.cmd hinzugefuegt (Pendant zum zsh-Alias) Entspricht 1:1 dem zsh-Alias 'nvim-update' (zsh/zshrc:79): nvim --headless "+Lazy! sync" "+qa". Liegt in windows/bin, das install-win.ps1 bereits automatisch zum User-PATH hinzufuegt - kein weiterer Schritt noetig. CRLF-Zeilenenden zur Konsistenz mit gmake.cmd angeglichen. --- windows/bin/nvim-update.cmd | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 windows/bin/nvim-update.cmd diff --git a/windows/bin/nvim-update.cmd b/windows/bin/nvim-update.cmd new file mode 100644 index 0000000..7e8260e --- /dev/null +++ b/windows/bin/nvim-update.cmd @@ -0,0 +1,2 @@ +@echo off +nvim --headless "+Lazy! sync" "+qa" -- 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(-) 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