diff options
| -rw-r--r-- | bootstrap-win/neovim-dict.ps1 | 64 | ||||
| -rw-r--r-- | bootstrap-win/neovim.ps1 | 177 | ||||
| -rw-r--r-- | install-win.ps1 | 110 | ||||
| -rw-r--r-- | neovim-windows-setup.md | 112 | ||||
| -rw-r--r-- | windows/bin/gmake.cmd | 11 |
5 files changed, 474 insertions, 0 deletions
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 @@ | |||
| 1 | #Requires -Version 5.1 | ||
| 2 | <# | ||
| 3 | Windows-natives Pendant zu bootstrap/neovim-dict.sh. | ||
| 4 | Laedt die deutschen Rechtschreib-Woerterbuecher fuer Neovim herunter. | ||
| 5 | bootstrap/neovim-dict.sh bleibt unveraendert. | ||
| 6 | |||
| 7 | Aufruf: | ||
| 8 | .\bootstrap-win\neovim-dict.ps1 | ||
| 9 | |||
| 10 | Falls die Ausfuehrung durch die Execution Policy blockiert wird: | ||
| 11 | powershell -ExecutionPolicy Bypass -File .\bootstrap-win\neovim-dict.ps1 | ||
| 12 | #> | ||
| 13 | |||
| 14 | $ErrorActionPreference = "Stop" | ||
| 15 | |||
| 16 | function Write-Ok($msg) { | ||
| 17 | Write-Host "OK $msg" -ForegroundColor Green | ||
| 18 | } | ||
| 19 | |||
| 20 | function Write-Step($msg) { | ||
| 21 | Write-Host "==> $msg" -ForegroundColor Cyan | ||
| 22 | } | ||
| 23 | |||
| 24 | function Write-SkipMsg($msg) { | ||
| 25 | Write-Host "- $msg bereits vorhanden" -ForegroundColor DarkGray | ||
| 26 | } | ||
| 27 | |||
| 28 | # Nativer Windows-Datenpfad von Neovim (kein XDG_DATA_HOME gesetzt): | ||
| 29 | # $env:LOCALAPPDATA\nvim-data\site\spell | ||
| 30 | $SpellDir = Join-Path $env:LOCALAPPDATA "nvim-data\site\spell" | ||
| 31 | |||
| 32 | $Urls = @( | ||
| 33 | "https://ftp.nluug.nl/pub/vim/runtime/spell/de.utf-8.spl", | ||
| 34 | "https://ftp.nluug.nl/pub/vim/runtime/spell/de.utf-8.sug" | ||
| 35 | ) | ||
| 36 | |||
| 37 | function Get-SpellFile([string]$Url) { | ||
| 38 | $fileName = Split-Path -Leaf $Url | ||
| 39 | $dest = Join-Path $SpellDir $fileName | ||
| 40 | |||
| 41 | if (Test-Path $dest) { | ||
| 42 | Write-SkipMsg $fileName | ||
| 43 | return | ||
| 44 | } | ||
| 45 | |||
| 46 | Write-Step "Lade $fileName herunter" | ||
| 47 | Invoke-WebRequest -Uri $Url -OutFile $dest | ||
| 48 | Write-Ok $fileName | ||
| 49 | } | ||
| 50 | |||
| 51 | function Main { | ||
| 52 | if (-not (Test-Path $SpellDir)) { | ||
| 53 | New-Item -ItemType Directory -Path $SpellDir -Force | Out-Null | ||
| 54 | } | ||
| 55 | |||
| 56 | foreach ($url in $Urls) { | ||
| 57 | Get-SpellFile $url | ||
| 58 | } | ||
| 59 | |||
| 60 | Write-Host "" | ||
| 61 | Write-Host "Woerterbuecher fuer Neovim installiert!" -ForegroundColor Green | ||
| 62 | } | ||
| 63 | |||
| 64 | 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 @@ | |||
| 1 | #Requires -Version 5.1 | ||
| 2 | <# | ||
| 3 | Windows-natives Pendant zu bootstrap/neovim.sh (macOS/FreeBSD). | ||
| 4 | bootstrap/neovim.sh bleibt unveraendert - dieses Skript ist bewusst | ||
| 5 | eigenstaendig, da sich die Paketquellen (winget/npm statt brew/pkg) und | ||
| 6 | das Fehlerverhalten zu stark unterscheiden fuer ein gemeinsames Skript. | ||
| 7 | |||
| 8 | Nutzt ausschliesslich native Windows-Werkzeuge (winget, npm, pwsh/ | ||
| 9 | powershell.exe) - keine Git-Bash- oder WSL-Abhaengigkeit. | ||
| 10 | |||
| 11 | Aufruf (PowerShell, keine Admin-Rechte noetig): | ||
| 12 | .\bootstrap-win\neovim.ps1 | ||
| 13 | |||
| 14 | Hinweis: Einzelne winget-Paket-IDs (v.a. GnuWin32.Gawk, GnuWin32.Libxml2, | ||
| 15 | google.yamlfmt, mvdan.shfmt, astral-sh.ruff) konnten in dieser Session | ||
| 16 | nicht gegen eine aktuelle winget-Quelle verifiziert werden. Schlaegt eine | ||
| 17 | Installation fehl, meldet das Skript das als Warnung (bricht nicht ab) | ||
| 18 | und nennt den Befehl zum manuellen Nachschlagen ("winget search <name>"). | ||
| 19 | |||
| 20 | C-Compiler fuer nvim-treesitter: kein winget-Paket enthalten, da MSVC auf | ||
| 21 | den Zielsystemen bereits vorhanden ist. Neovim muss dafuer aus einer | ||
| 22 | "Developer PowerShell for VS" gestartet werden (siehe Install-Tools). | ||
| 23 | #> | ||
| 24 | |||
| 25 | $ErrorActionPreference = "Stop" | ||
| 26 | $script:Failures = @() | ||
| 27 | |||
| 28 | function Write-Ok($msg) { | ||
| 29 | Write-Host "OK $msg" -ForegroundColor Green | ||
| 30 | } | ||
| 31 | |||
| 32 | function Write-Step($msg) { | ||
| 33 | Write-Host "==> $msg" -ForegroundColor Cyan | ||
| 34 | } | ||
| 35 | |||
| 36 | function Write-Skip($msg) { | ||
| 37 | Write-Host "- $msg bereits vorhanden" -ForegroundColor DarkGray | ||
| 38 | } | ||
| 39 | |||
| 40 | function Write-Warn($msg) { | ||
| 41 | Write-Host "! $msg" -ForegroundColor Yellow | ||
| 42 | $script:Failures += $msg | ||
| 43 | } | ||
| 44 | |||
| 45 | function Test-CommandExists([string]$Name) { | ||
| 46 | return [bool](Get-Command $Name -ErrorAction SilentlyContinue) | ||
| 47 | } | ||
| 48 | |||
| 49 | function Install-WingetPackage([string]$Binary, [string]$Id) { | ||
| 50 | if (Test-CommandExists $Binary) { | ||
| 51 | Write-Skip $Binary | ||
| 52 | return | ||
| 53 | } | ||
| 54 | |||
| 55 | Write-Step "winget install $Id" | ||
| 56 | winget install --id $Id -e --source winget --accept-package-agreements --accept-source-agreements --silent | Out-Null | ||
| 57 | |||
| 58 | if ($LASTEXITCODE -ne 0) { | ||
| 59 | Write-Warn "winget install $Id fehlgeschlagen (Binary '$Binary' nicht gefunden). Pruefen mit: winget search $Id" | ||
| 60 | return | ||
| 61 | } | ||
| 62 | |||
| 63 | Write-Ok $Id | ||
| 64 | } | ||
| 65 | |||
| 66 | function Install-NpmPackage([string]$Binary, [string]$Package) { | ||
| 67 | if (Test-CommandExists $Binary) { | ||
| 68 | Write-Skip $Binary | ||
| 69 | return | ||
| 70 | } | ||
| 71 | |||
| 72 | if (-not (Test-CommandExists "npm")) { | ||
| 73 | Write-Warn "npm wurde nicht gefunden - kann '$Package' nicht installieren." | ||
| 74 | return | ||
| 75 | } | ||
| 76 | |||
| 77 | Write-Step "npm install -g $Package" | ||
| 78 | npm install -g $Package | Out-Null | ||
| 79 | |||
| 80 | if ($LASTEXITCODE -ne 0) { | ||
| 81 | Write-Warn "npm install -g $Package fehlgeschlagen." | ||
| 82 | return | ||
| 83 | } | ||
| 84 | |||
| 85 | Write-Ok $Package | ||
| 86 | } | ||
| 87 | |||
| 88 | function Test-Prerequisites { | ||
| 89 | if (-not (Test-CommandExists "winget")) { | ||
| 90 | Write-Host "Fehler: winget wurde nicht gefunden. 'App Installer' aus dem Microsoft Store installieren." -ForegroundColor Red | ||
| 91 | exit 1 | ||
| 92 | } | ||
| 93 | } | ||
| 94 | |||
| 95 | function Update-SessionPath { | ||
| 96 | # winget/npm-Installer tragen PATH-Aenderungen in die Registry (User- | ||
| 97 | # und/oder Machine-Scope) ein, aber der laufende PowerShell-Prozess | ||
| 98 | # bekommt das nicht automatisch mit. Ohne diesen Refresh wuerde z.B. | ||
| 99 | # "npm" gleich im Anschluss an die Node-Installation als "nicht | ||
| 100 | # gefunden" gemeldet, obwohl es gerade erst installiert wurde. | ||
| 101 | $machine = [Environment]::GetEnvironmentVariable("PATH", "Machine") | ||
| 102 | $user = [Environment]::GetEnvironmentVariable("PATH", "User") | ||
| 103 | $env:PATH = "$machine;$user" | ||
| 104 | } | ||
| 105 | |||
| 106 | function Install-Prerequisites { | ||
| 107 | Install-WingetPackage -Binary "git" -Id "Git.Git" | ||
| 108 | Install-WingetPackage -Binary "node" -Id "OpenJS.NodeJS.LTS" | ||
| 109 | Update-SessionPath | ||
| 110 | } | ||
| 111 | |||
| 112 | function Install-Formatters { | ||
| 113 | Install-WingetPackage -Binary "jq" -Id "jqlang.jq" | ||
| 114 | Install-NpmPackage -Binary "prettier" -Package "prettier" | ||
| 115 | Install-WingetPackage -Binary "ruff" -Id "astral-sh.ruff" | ||
| 116 | Install-WingetPackage -Binary "shfmt" -Id "mvdan.shfmt" | ||
| 117 | Install-WingetPackage -Binary "stylua" -Id "JohnnyMorganz.StyLua" | ||
| 118 | Install-WingetPackage -Binary "yamlfmt" -Id "google.yamlfmt" | ||
| 119 | Install-WingetPackage -Binary "gawk" -Id "GnuWin32.Gawk" | ||
| 120 | Install-WingetPackage -Binary "xmllint" -Id "GnuWin32.Libxml2" | ||
| 121 | } | ||
| 122 | |||
| 123 | function Install-Tools { | ||
| 124 | Install-WingetPackage -Binary "rg" -Id "BurntSushi.ripgrep.MSVC" | ||
| 125 | Install-WingetPackage -Binary "fd" -Id "sharkdp.fd" | ||
| 126 | Install-NpmPackage -Binary "tree-sitter" -Package "tree-sitter-cli" | ||
| 127 | |||
| 128 | # C-Compiler fuer nvim-treesitter: kein winget-Paket noetig, MSVC (cl.exe) | ||
| 129 | # ist auf diesen Systemen bereits vorhanden. nvim-treesitter findet cl.exe | ||
| 130 | # automatisch, ABER nur wenn INCLUDE/LIB gesetzt sind - das passiert nicht | ||
| 131 | # in einer normalen PowerShell, sondern nur in einer "Developer PowerShell | ||
| 132 | # for VS" bzw. "x64 Native Tools Command Prompt". Neovim also immer aus | ||
| 133 | # so einer Shell heraus starten, sonst schlaegt die Parser-Kompilierung | ||
| 134 | # mit "cannot find <header>.h" o.ae. fehl, obwohl cl.exe selbst gefunden wird. | ||
| 135 | |||
| 136 | # opt.makeprg = "gmake" (nvim/lua/config/options.lua) - Alias liegt in | ||
| 137 | # windows/bin/gmake.cmd, reicht an "make" durch. Einmalig windows\bin | ||
| 138 | # zum PATH hinzufuegen (PowerShell, User-Scope, nicht setx mit %PATH% | ||
| 139 | # verwenden - das wuerde den gesamten Prozess-PATH inkl. System-Anteil | ||
| 140 | # dauerhaft in den User-PATH kopieren): | ||
| 141 | # $userPath = [Environment]::GetEnvironmentVariable("PATH", "User") | ||
| 142 | # [Environment]::SetEnvironmentVariable("PATH", "$userPath;$env:USERPROFILE\dotfiles\windows\bin", "User") | ||
| 143 | Install-WingetPackage -Binary "make" -Id "GnuWin32.Make" | ||
| 144 | } | ||
| 145 | |||
| 146 | function Install-Lsp { | ||
| 147 | Install-NpmPackage -Binary "basedpyright-langserver" -Package "basedpyright" | ||
| 148 | Install-NpmPackage -Binary "bash-language-server" -Package "bash-language-server" | ||
| 149 | Install-WingetPackage -Binary "clangd" -Id "LLVM.LLVM" | ||
| 150 | Install-WingetPackage -Binary "shellcheck" -Id "koalaman.shellcheck" | ||
| 151 | Install-NpmPackage -Binary "vscode-html-language-server" -Package "vscode-langservers-extracted" | ||
| 152 | Install-NpmPackage -Binary "vscode-json-language-server" -Package "vscode-langservers-extracted" | ||
| 153 | Install-WingetPackage -Binary "lua-language-server" -Id "LuaLS.lua-language-server" | ||
| 154 | Install-NpmPackage -Binary "prisma-language-server" -Package "@prisma/language-server" | ||
| 155 | Install-NpmPackage -Binary "vtsls" -Package "@vtsls/language-server" | ||
| 156 | } | ||
| 157 | |||
| 158 | function Main { | ||
| 159 | Test-Prerequisites | ||
| 160 | |||
| 161 | Install-Prerequisites | ||
| 162 | Install-Formatters | ||
| 163 | Install-Tools | ||
| 164 | Install-Lsp | ||
| 165 | |||
| 166 | Write-Host "" | ||
| 167 | if ($script:Failures.Count -eq 0) { | ||
| 168 | Write-Host "Bootstrap abgeschlossen." -ForegroundColor Green | ||
| 169 | } else { | ||
| 170 | Write-Host "Bootstrap abgeschlossen, mit $($script:Failures.Count) Warnung(en):" -ForegroundColor Yellow | ||
| 171 | foreach ($f in $script:Failures) { | ||
| 172 | Write-Host " - $f" -ForegroundColor Yellow | ||
| 173 | } | ||
| 174 | } | ||
| 175 | } | ||
| 176 | |||
| 177 | Main | ||
diff --git a/install-win.ps1 b/install-win.ps1 new file mode 100644 index 0000000..632c25e --- /dev/null +++ b/install-win.ps1 | |||
| @@ -0,0 +1,110 @@ | |||
| 1 | #Requires -Version 5.1 | ||
| 2 | <# | ||
| 3 | Windows-natives Pendant zu install.sh (ersetzt install-win.cmd). | ||
| 4 | install.sh bleibt unveraendert - kopiert (statt zu verlinken) die | ||
| 5 | relevanten Konfigurationen an ihre nativen Windows-Zielorte. Keine | ||
| 6 | Admin-Rechte noetig (keine Symlinks). | ||
| 7 | |||
| 8 | Aufruf: | ||
| 9 | .\install-win.ps1 | ||
| 10 | |||
| 11 | Falls die Ausfuehrung durch die Execution Policy blockiert wird: | ||
| 12 | powershell -ExecutionPolicy Bypass -File .\install-win.ps1 | ||
| 13 | |||
| 14 | Hinweis: Es wird KOPIERT, nicht verlinkt. Nach Aenderungen im Repo | ||
| 15 | dieses Skript erneut ausfuehren, um die Kopien zu aktualisieren. | ||
| 16 | #> | ||
| 17 | |||
| 18 | $ErrorActionPreference = "Stop" | ||
| 19 | |||
| 20 | function Write-Ok($msg) { | ||
| 21 | Write-Host "OK $msg" -ForegroundColor Green | ||
| 22 | } | ||
| 23 | |||
| 24 | function Write-Step($msg) { | ||
| 25 | Write-Host "==> $msg" -ForegroundColor Cyan | ||
| 26 | } | ||
| 27 | |||
| 28 | function Write-SkipMsg($msg) { | ||
| 29 | Write-Host "- $msg" -ForegroundColor DarkGray | ||
| 30 | } | ||
| 31 | |||
| 32 | $RepoRoot = $PSScriptRoot | ||
| 33 | |||
| 34 | $NvimSrc = Join-Path $RepoRoot "nvim" | ||
| 35 | $NvimDst = Join-Path $env:LOCALAPPDATA "nvim" | ||
| 36 | |||
| 37 | $GitConfigSrc = Join-Path $RepoRoot "git\config" | ||
| 38 | $GitConfigDst = Join-Path $env:USERPROFILE ".gitconfig" | ||
| 39 | |||
| 40 | $GitUp2partsSrc = Join-Path $RepoRoot "git\config-up2parts" | ||
| 41 | $GitXdgDir = Join-Path $env:USERPROFILE ".config\git" | ||
| 42 | $GitUp2partsDst = Join-Path $GitXdgDir "config-up2parts" | ||
| 43 | |||
| 44 | $NpmrcSrc = Join-Path $RepoRoot "npm\npmrc" | ||
| 45 | $NpmrcDst = Join-Path $env:USERPROFILE ".npmrc" | ||
| 46 | |||
| 47 | function Copy-NvimConfig { | ||
| 48 | Write-Step "nvim -> $NvimDst" | ||
| 49 | |||
| 50 | if (Test-Path $NvimDst) { | ||
| 51 | Remove-Item -Recurse -Force $NvimDst | ||
| 52 | } | ||
| 53 | |||
| 54 | Copy-Item -Recurse -Force $NvimSrc $NvimDst | ||
| 55 | Write-Ok $NvimDst | ||
| 56 | } | ||
| 57 | |||
| 58 | function Copy-GitConfig { | ||
| 59 | Write-Step "git\config -> $GitConfigDst" | ||
| 60 | Copy-Item -Force $GitConfigSrc $GitConfigDst | ||
| 61 | Write-Ok $GitConfigDst | ||
| 62 | |||
| 63 | if (-not (Test-Path $GitXdgDir)) { | ||
| 64 | New-Item -ItemType Directory -Path $GitXdgDir -Force | Out-Null | ||
| 65 | } | ||
| 66 | |||
| 67 | Write-Step "git\config-up2parts -> $GitUp2partsDst" | ||
| 68 | Copy-Item -Force $GitUp2partsSrc $GitUp2partsDst | ||
| 69 | Write-Ok "$GitUp2partsDst (wird per includeIf aus .gitconfig eingebunden)" | ||
| 70 | } | ||
| 71 | |||
| 72 | function Copy-Npmrc { | ||
| 73 | if (Test-Path $NpmrcDst) { | ||
| 74 | Write-SkipMsg "$NpmrcDst existiert bereits, uebersprungen" | ||
| 75 | return | ||
| 76 | } | ||
| 77 | |||
| 78 | Write-Step "npm\npmrc -> $NpmrcDst" | ||
| 79 | Copy-Item -Force $NpmrcSrc $NpmrcDst | ||
| 80 | Write-Ok $NpmrcDst | ||
| 81 | } | ||
| 82 | |||
| 83 | function Add-BinToUserPath { | ||
| 84 | $binDir = Join-Path $RepoRoot "windows\bin" | ||
| 85 | $userPath = [Environment]::GetEnvironmentVariable("PATH", "User") | ||
| 86 | $entries = $userPath -split ";" | ||
| 87 | |||
| 88 | if ($entries -contains $binDir) { | ||
| 89 | Write-SkipMsg "$binDir bereits im User-PATH" | ||
| 90 | return | ||
| 91 | } | ||
| 92 | |||
| 93 | Write-Step "$binDir zum User-PATH hinzufuegen (enthaelt gmake.cmd)" | ||
| 94 | [Environment]::SetEnvironmentVariable("PATH", "$userPath;$binDir", "User") | ||
| 95 | Write-Ok "$binDir (wirkt erst in neuen Terminal-Sitzungen)" | ||
| 96 | } | ||
| 97 | |||
| 98 | function Main { | ||
| 99 | Copy-NvimConfig | ||
| 100 | Copy-GitConfig | ||
| 101 | Copy-Npmrc | ||
| 102 | Add-BinToUserPath | ||
| 103 | |||
| 104 | Write-Host "" | ||
| 105 | Write-Host "Fertig. Dateien wurden KOPIERT, nicht verlinkt." -ForegroundColor Green | ||
| 106 | Write-Host "Nach Aenderungen im Repo dieses Skript erneut ausfuehren." | ||
| 107 | Write-Host "Neues Terminal oeffnen, damit PATH-Aenderungen wirksam werden." -ForegroundColor Yellow | ||
| 108 | } | ||
| 109 | |||
| 110 | Main | ||
diff --git a/neovim-windows-setup.md b/neovim-windows-setup.md new file mode 100644 index 0000000..24e5bc0 --- /dev/null +++ b/neovim-windows-setup.md | |||
| @@ -0,0 +1,112 @@ | |||
| 1 | # Neovim-Setup unter Windows (nativ) | ||
| 2 | |||
| 3 | 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. | ||
| 4 | |||
| 5 | 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`. | ||
| 6 | |||
| 7 | ## 0. Von Hand zu erledigen (nicht durch Skripte abgedeckt) | ||
| 8 | |||
| 9 | - **Execution Policy** setzen (siehe oben), sonst starten die `.ps1`-Skripte gar nicht. | ||
| 10 | - **`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. | ||
| 11 | - **Neovim selbst installieren** (`winget install Neovim.Neovim`, Abschnitt 1) – kein Skript hier installiert Neovim, nur seine Config/Abhängigkeiten. | ||
| 12 | - **`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). | ||
| 13 | - **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. | ||
| 14 | - **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`). | ||
| 15 | - **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). | ||
| 16 | - **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. | ||
| 17 | |||
| 18 | ## 1. Grundwerkzeuge installieren | ||
| 19 | |||
| 20 | ```powershell | ||
| 21 | winget install Neovim.Neovim | ||
| 22 | winget install Git.Git | ||
| 23 | winget install OpenJS.NodeJS.LTS | ||
| 24 | ``` | ||
| 25 | |||
| 26 | (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.) | ||
| 27 | |||
| 28 | ## 2. Konfiguration einrichten (Windows-nativer Weg) | ||
| 29 | |||
| 30 | `install-win.ps1` im Repo-Root ausführen: | ||
| 31 | |||
| 32 | ```powershell | ||
| 33 | .\install-win.ps1 | ||
| 34 | ``` | ||
| 35 | |||
| 36 | Es kopiert (keine Symlinks, keine Admin-Rechte nötig): | ||
| 37 | |||
| 38 | - `nvim/` → `%LOCALAPPDATA%\nvim` | ||
| 39 | - `git/config` → `%USERPROFILE%\.gitconfig` | ||
| 40 | - `git/config-up2parts` → `%USERPROFILE%\.config\git\config-up2parts` (Pfad ist im `includeIf` von `git/config` hartkodiert) | ||
| 41 | - `npm/npmrc` → `%USERPROFILE%\.npmrc` (nur falls dort noch keine Datei existiert) | ||
| 42 | |||
| 43 | Nach Änderungen im Repo `install-win.ps1` erneut ausführen, um die Kopien zu aktualisieren. | ||
| 44 | |||
| 45 | ## 3. Externe Abhängigkeiten | ||
| 46 | |||
| 47 | `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): | ||
| 48 | |||
| 49 | ```powershell | ||
| 50 | .\bootstrap-win\neovim.ps1 | ||
| 51 | ``` | ||
| 52 | |||
| 53 | 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). | ||
| 54 | |||
| 55 | 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). | ||
| 56 | |||
| 57 | `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): | ||
| 58 | ```powershell | ||
| 59 | $userPath = [Environment]::GetEnvironmentVariable("PATH", "User") | ||
| 60 | [Environment]::SetEnvironmentVariable("PATH", "$userPath;$env:USERPROFILE\dotfiles\windows\bin", "User") | ||
| 61 | ``` | ||
| 62 | |||
| 63 | ## 4. Bekannte Stolpersteine | ||
| 64 | |||
| 65 | - **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 `<header>`.h" fehl, obwohl `cl.exe` selbst gefunden wird. Neovim also immer aus dieser Developer-Shell heraus starten. | ||
| 66 | - **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). | ||
| 67 | - **`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. | ||
| 68 | - **Clipboard** (`unnamedplus`): funktioniert nativ unter Windows-Neovim ohne Zusatztool – anders als unter WSL, wo `win32yank` nötig wäre. | ||
| 69 | - **`opt.guifont`**: wirkt nur bei GUI-Frontends wie Neovide. Im Windows Terminal muss die Schriftart dort separat eingestellt werden. | ||
| 70 | |||
| 71 | ## 5. Verifizieren | ||
| 72 | |||
| 73 | ``` | ||
| 74 | nvim | ||
| 75 | :checkhealth | ||
| 76 | ``` | ||
| 77 | |||
| 78 | `:checkhealth` zeigt fehlende Provider/Tools direkt an – guter letzter Schritt nach der Installation. | ||
| 79 | |||
| 80 | ## 6. Aktualisieren | ||
| 81 | |||
| 82 | Pendant zu `brew update && brew upgrade` (macOS) bzw. `pkg update && pkg upgrade` (FreeBSD): | ||
| 83 | |||
| 84 | ```powershell | ||
| 85 | winget source update # Paketquellen aktualisieren | ||
| 86 | winget upgrade --all # alle winget-Pakete aktualisieren | ||
| 87 | ``` | ||
| 88 | |||
| 89 | Vorschau, was aktualisiert würde, ohne etwas zu ändern: | ||
| 90 | |||
| 91 | ```powershell | ||
| 92 | winget list --upgrade-available | ||
| 93 | ``` | ||
| 94 | |||
| 95 | Einzelnes Paket gezielt aktualisieren (IDs siehe `bootstrap-win/neovim.ps1`): | ||
| 96 | |||
| 97 | ```powershell | ||
| 98 | winget upgrade LLVM.LLVM | ||
| 99 | ``` | ||
| 100 | |||
| 101 | Zwei Besonderheiten gegenüber brew/pkg: | ||
| 102 | |||
| 103 | - Ä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. | ||
| 104 | - Ein Paket dauerhaft von `--all` ausnehmen: `winget pin add <id>` (Pendant zu `brew pin`). | ||
| 105 | |||
| 106 | Die npm-Pakete (`prettier`, `basedpyright`, `bash-language-server`, `vtsls`, `@prisma/language-server`, `vscode-langservers-extracted`) laufen außerhalb von winget und werden separat aktualisiert: | ||
| 107 | |||
| 108 | ```powershell | ||
| 109 | npm update -g | ||
| 110 | ``` | ||
| 111 | |||
| 112 | `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. | ||
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 @@ | |||
| 1 | @echo off | ||
| 2 | rem Wrapper, damit opt.makeprg = "gmake" (aus nvim/lua/config/options.lua) | ||
| 3 | rem unter Windows funktioniert, ohne die bestehende Config anzupassen. | ||
| 4 | rem Reicht alle Argumente an das im PATH gefundene "make" weiter. | ||
| 5 | rem | ||
| 6 | rem Einmalig einrichten: dieses Verzeichnis (windows\bin) zum PATH | ||
| 7 | rem hinzufuegen, z.B. ueber: | ||
| 8 | rem setx PATH "%PATH%;%USERPROFILE%\dotfiles\windows\bin" | ||
| 9 | |||
| 10 | make %* | ||
| 11 | exit /b %ERRORLEVEL% | ||
