aboutsummaryrefslogtreecommitdiff
path: root/bootstrap-win
diff options
context:
space:
mode:
Diffstat (limited to 'bootstrap-win')
-rw-r--r--bootstrap-win/neovim.ps193
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
53function 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
74function 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
49function Install-WingetPackage([string]$Binary, [string]$Id) { 87function 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
123function Install-Tools { 191function 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
146function Install-Lsp { 217function Install-Lsp {