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 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 241 insertions(+) create mode 100644 bootstrap-win/neovim-dict.ps1 create mode 100644 bootstrap-win/neovim.ps1 (limited to 'bootstrap-win') 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 -- cgit v1.3