diff options
Diffstat (limited to 'bootstrap-win/neovim.ps1')
| -rw-r--r-- | bootstrap-win/neovim.ps1 | 93 |
1 files changed, 82 insertions, 11 deletions
diff --git a/bootstrap-win/neovim.ps1 b/bootstrap-win/neovim.ps1 index 548583e..77abf83 100644 --- a/bootstrap-win/neovim.ps1 +++ b/bootstrap-win/neovim.ps1 | |||
| @@ -11,11 +11,15 @@ | |||
| 11 | Aufruf (PowerShell, keine Admin-Rechte noetig): | 11 | Aufruf (PowerShell, keine Admin-Rechte noetig): |
| 12 | .\bootstrap-win\neovim.ps1 | 12 | .\bootstrap-win\neovim.ps1 |
| 13 | 13 | ||
| 14 | Hinweis: Einzelne winget-Paket-IDs (v.a. GnuWin32.Gawk, GnuWin32.Libxml2, | 14 | Hinweis: yamlfmt, gawk und xmllint/libxml2 sind bewusst NICHT enthalten - |
| 15 | google.yamlfmt, mvdan.shfmt, astral-sh.ruff) konnten in dieser Session | 15 | im Praxistest (24.07.2026) bestaetigt, dass es dafuer keine winget-Pakete |
| 16 | nicht gegen eine aktuelle winget-Quelle verifiziert werden. Schlaegt eine | 16 | unter den urspruenglich vermuteten IDs gibt. Siehe Install-Formatters und |
| 17 | Installation fehl, meldet das Skript das als Warnung (bricht nicht ab) | 17 | neovim-windows-setup.md fuer manuelle Alternativen. mvdan.shfmt und |
| 18 | und nennt den Befehl zum manuellen Nachschlagen ("winget search <name>"). | 18 | astral-sh.ruff liefen im Test erfolgreich durch. |
| 19 | |||
| 20 | Schlaegt eine winget-Installation trotzdem fehl, meldet das Skript das | ||
| 21 | als Warnung (bricht nicht ab) und zeigt die letzten Zeilen der winget- | ||
| 22 | Ausgabe zur Fehlersuche an. | ||
| 19 | 23 | ||
| 20 | C-Compiler fuer nvim-treesitter: kein winget-Paket enthalten, da MSVC auf | 24 | C-Compiler fuer nvim-treesitter: kein winget-Paket enthalten, da MSVC auf |
| 21 | den Zielsystemen bereits vorhanden ist. Neovim muss dafuer aus einer | 25 | den Zielsystemen bereits vorhanden ist. Neovim muss dafuer aus einer |
| @@ -46,6 +50,40 @@ function Test-CommandExists([string]$Name) { | |||
| 46 | return [bool](Get-Command $Name -ErrorAction SilentlyContinue) | 50 | return [bool](Get-Command $Name -ErrorAction SilentlyContinue) |
| 47 | } | 51 | } |
| 48 | 52 | ||
| 53 | function Find-BinaryDirectory([string]$Binary) { | ||
| 54 | # Sucht nach "<Binary>.exe" unter den ueblichen Installationswurzeln. | ||
| 55 | # Deckt den Fall ab, dass ein winget-Paket (v.a. im --silent-Modus) | ||
| 56 | # die PATH-Registrierung ausgelassen hat, obwohl es korrekt installiert | ||
| 57 | # wurde - beobachtet bei LLVM.LLVM/clangd. | ||
| 58 | $searchRoots = @( | ||
| 59 | $env:ProgramFiles, | ||
| 60 | ${env:ProgramFiles(x86)}, | ||
| 61 | (Join-Path $env:LOCALAPPDATA "Programs") | ||
| 62 | ) | Where-Object { $_ -and (Test-Path $_) } | ||
| 63 | |||
| 64 | foreach ($root in $searchRoots) { | ||
| 65 | $found = Get-ChildItem -Path $root -Recurse -Depth 4 -Filter "$Binary.exe" -File -ErrorAction SilentlyContinue | Select-Object -First 1 | ||
| 66 | if ($found) { | ||
| 67 | return $found.DirectoryName | ||
| 68 | } | ||
| 69 | } | ||
| 70 | |||
| 71 | return $null | ||
| 72 | } | ||
| 73 | |||
| 74 | function Add-ToUserPath([string]$Dir) { | ||
| 75 | $userPath = [Environment]::GetEnvironmentVariable("PATH", "User") | ||
| 76 | $entries = $userPath -split ";" | ||
| 77 | |||
| 78 | if ($entries -contains $Dir) { | ||
| 79 | return $false | ||
| 80 | } | ||
| 81 | |||
| 82 | [Environment]::SetEnvironmentVariable("PATH", "$userPath;$Dir", "User") | ||
| 83 | $env:PATH = "$env:PATH;$Dir" | ||
| 84 | return $true | ||
| 85 | } | ||
| 86 | |||
| 49 | function Install-WingetPackage([string]$Binary, [string]$Id) { | 87 | function Install-WingetPackage([string]$Binary, [string]$Id) { |
| 50 | if (Test-CommandExists $Binary) { | 88 | if (Test-CommandExists $Binary) { |
| 51 | Write-Skip $Binary | 89 | Write-Skip $Binary |
| @@ -53,10 +91,34 @@ function Install-WingetPackage([string]$Binary, [string]$Id) { | |||
| 53 | } | 91 | } |
| 54 | 92 | ||
| 55 | Write-Step "winget install $Id" | 93 | Write-Step "winget install $Id" |
| 56 | winget install --id $Id -e --source winget --accept-package-agreements --accept-source-agreements --silent | Out-Null | 94 | $output = winget install --id $Id -e --source winget --accept-package-agreements --accept-source-agreements --silent 2>&1 |
| 57 | 95 | ||
| 58 | if ($LASTEXITCODE -ne 0) { | 96 | if ($LASTEXITCODE -ne 0) { |
| 59 | Write-Warn "winget install $Id fehlgeschlagen (Binary '$Binary' nicht gefunden). Pruefen mit: winget search $Id" | 97 | $text = $output -join " " |
| 98 | $lastLine = ($output | Select-Object -Last 3) -join " / " | ||
| 99 | |||
| 100 | if ($text -match "bereits ein vorhandenes Paket|already installed|No applicable update") { | ||
| 101 | # Paket ist laut winget installiert, aber die Binary steht trotzdem | ||
| 102 | # nicht im PATH - z.B. weil der Installer (im --silent-Modus) die | ||
| 103 | # PATH-Registrierung uebersprungen hat. winget search hilft hier | ||
| 104 | # nicht weiter, da das Paket ja gefunden wurde - stattdessen selbst | ||
| 105 | # danach suchen und den User-PATH ergaenzen (dauerhaft + fuer diese | ||
| 106 | # Sitzung). | ||
| 107 | $dir = Find-BinaryDirectory $Binary | ||
| 108 | |||
| 109 | if ($dir) { | ||
| 110 | Add-ToUserPath $dir | Out-Null | ||
| 111 | if (Test-CommandExists $Binary) { | ||
| 112 | Write-Ok "$Id ('$Binary' in $dir gefunden, User-PATH ergaenzt)" | ||
| 113 | } else { | ||
| 114 | Write-Warn "${Id}: $dir zum User-PATH hinzugefuegt, aber '$Binary' laesst sich immer noch nicht ausfuehren - manuell pruefen." | ||
| 115 | } | ||
| 116 | } else { | ||
| 117 | 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." | ||
| 118 | } | ||
| 119 | } else { | ||
| 120 | Write-Warn "winget install $Id fehlgeschlagen (Binary '$Binary' nicht gefunden): $lastLine -- Pruefen mit: winget search $Id" | ||
| 121 | } | ||
| 60 | return | 122 | return |
| 61 | } | 123 | } |
| 62 | 124 | ||
| @@ -115,9 +177,15 @@ function Install-Formatters { | |||
| 115 | Install-WingetPackage -Binary "ruff" -Id "astral-sh.ruff" | 177 | Install-WingetPackage -Binary "ruff" -Id "astral-sh.ruff" |
| 116 | Install-WingetPackage -Binary "shfmt" -Id "mvdan.shfmt" | 178 | Install-WingetPackage -Binary "shfmt" -Id "mvdan.shfmt" |
| 117 | Install-WingetPackage -Binary "stylua" -Id "JohnnyMorganz.StyLua" | 179 | Install-WingetPackage -Binary "stylua" -Id "JohnnyMorganz.StyLua" |
| 118 | Install-WingetPackage -Binary "yamlfmt" -Id "google.yamlfmt" | 180 | |
| 119 | Install-WingetPackage -Binary "gawk" -Id "GnuWin32.Gawk" | 181 | # yamlfmt, gawk, xmllint: im Praxistest bestaetigt, dass es unter diesen |
| 120 | Install-WingetPackage -Binary "xmllint" -Id "GnuWin32.Libxml2" | 182 | # IDs kein winget-Paket gibt ("Es wurde kein Paket gefunden, das den |
| 183 | # Eingabekriterien entspricht"). Kein verifizierter Ersatz gefunden, | ||
| 184 | # deshalb bewusst nicht automatisiert - siehe neovim-windows-setup.md | ||
| 185 | # fuer manuelle Alternativen. conform.nvim faellt bei fehlendem | ||
| 186 | # Formatter fuer die jeweilige Dateiart einfach auf LSP-Formatierung | ||
| 187 | # zurueck (default_format_opts.lsp_format = "fallback"), betrifft also | ||
| 188 | # nur awk/xml/xsd/yaml-Dateien. | ||
| 121 | } | 189 | } |
| 122 | 190 | ||
| 123 | function Install-Tools { | 191 | function Install-Tools { |
| @@ -140,7 +208,10 @@ function Install-Tools { | |||
| 140 | # dauerhaft in den User-PATH kopieren): | 208 | # dauerhaft in den User-PATH kopieren): |
| 141 | # $userPath = [Environment]::GetEnvironmentVariable("PATH", "User") | 209 | # $userPath = [Environment]::GetEnvironmentVariable("PATH", "User") |
| 142 | # [Environment]::SetEnvironmentVariable("PATH", "$userPath;$env:USERPROFILE\dotfiles\windows\bin", "User") | 210 | # [Environment]::SetEnvironmentVariable("PATH", "$userPath;$env:USERPROFILE\dotfiles\windows\bin", "User") |
| 143 | Install-WingetPackage -Binary "make" -Id "GnuWin32.Make" | 211 | # GnuWin32.Make ist im Praxistest fehlgeschlagen (Paket 2006er-Stand, |
| 212 | # unklar ob im winget-Repo ueberhaupt noch gepflegt). ezwinports.make | ||
| 213 | # ist ein aktiver gepflegter GNU-Make-Port fuer Windows. | ||
| 214 | Install-WingetPackage -Binary "make" -Id "ezwinports.make" | ||
| 144 | } | 215 | } |
| 145 | 216 | ||
| 146 | function Install-Lsp { | 217 | function Install-Lsp { |
