diff --git a/Install.ps1 b/Install.ps1
index dd76e0a..f18ed52 100644
--- a/Install.ps1
+++ b/Install.ps1
@@ -1,8 +1,8 @@
param (
- [Parameter(Mandatory=$true)]
+ [Parameter(Mandatory=$false)]
[string]$DistroName = "Arch",
- [Parameter(Mandatory=$true)]
+ [Parameter(Mandatory=$false)]
[string]$Username = "user"
)
@@ -11,7 +11,7 @@ Write-Host "Distribution: $DistroName" -ForegroundColor Yellow
Write-Host "Username: $Username" -ForegroundColor Yellow
Write-Host ""
-# Check if the specified distro exists - improved detection
+# Check if the specified distro exists
$wslDistros = (wsl --list) -replace "`0", "" | ForEach-Object { $_.Trim() }
$distroExists = $false
foreach ($line in $wslDistros) {
@@ -29,6 +29,29 @@ if (-not $distroExists) {
# Path to current repository
$RepoPath = Get-Location
+# Function to replace placeholder values in configuration files
+function Update-ConfigFile {
+ param (
+ [string]$SourcePath,
+ [string]$DestinationPath,
+ [hashtable]$Replacements
+ )
+
+ if (-not (Test-Path $SourcePath)) {
+ Write-Warning "Source file not found: $SourcePath"
+ return
+ }
+
+ $content = Get-Content -Path $SourcePath -Raw
+
+ foreach ($key in $Replacements.Keys) {
+ $content = $content -replace $key, $Replacements[$key]
+ }
+
+ Set-Content -Path $DestinationPath -Value $content -Force
+ Write-Host "Updated configuration in: $DestinationPath" -ForegroundColor Green
+}
+
Write-Host "Step 1: Initial Setup..." -ForegroundColor Green
wsl -d $DistroName -u root bash -c "/usr/lib/wsl/first-setup.sh"
wsl -d $DistroName -u root bash -c "pacman -Syu --noconfirm"
@@ -58,7 +81,12 @@ wsl -d $DistroName -u root bash -c "echo '$Username ALL=(ALL) ALL' > /etc/sudoer
# Configure WSL default user
Write-Host "Configuring WSL default user..." -ForegroundColor Yellow
-Copy-Item -Path "$RepoPath\wsl\etc\wsl.conf" -Destination "\\wsl$\$DistroName\etc\wsl.conf" -Force
+$wslConfReplacements = @{
+ "default=user" = "default=$Username"
+}
+$tempWslConf = Join-Path $env:TEMP "wsl.conf"
+Update-ConfigFile -SourcePath "$RepoPath\wsl\etc\wsl.conf" -DestinationPath $tempWslConf -Replacements $wslConfReplacements
+Copy-Item -Path $tempWslConf -Destination "\\wsl$\$DistroName\etc\wsl.conf" -Force
wsl -d $DistroName -u root bash -c "dos2unix /etc/wsl.conf"
Write-Host "Step 3: AUR helper and SSH bridge setup..." -ForegroundColor Green
@@ -71,9 +99,61 @@ wsl -d $DistroName -u $Username bash -c "paru -S --noconfirm wsl2-ssh-agent"
# Create .ssh directory
wsl -d $DistroName -u $Username bash -c "mkdir -p ~/.ssh"
-Write-Host "Step 4: Copying configuration files..." -ForegroundColor Green
-# Copy all configuration files from the repository to WSL
-Get-ChildItem -Path "$RepoPath\wsl" -Exclude "etc" | ForEach-Object {
+Write-Host "Step 4: Copying and updating configuration files..." -ForegroundColor Green
+
+# Create temp directory for modified configs
+$tempConfigDir = Join-Path $env:TEMP "wsl-configs"
+if (Test-Path $tempConfigDir) {
+ Remove-Item -Path $tempConfigDir -Recurse -Force
+}
+New-Item -Path $tempConfigDir -ItemType Directory -Force | Out-Null
+
+# Process and copy WezTerm config if it exists
+$weztermSourcePath = "$RepoPath\windows\.wezterm.lua"
+if (Test-Path $weztermSourcePath) {
+ $weztermDestPath = Join-Path $tempConfigDir ".wezterm.lua"
+ $weztermReplacements = @{
+ 'default_domain = "WSL:Arch"' = "default_domain = `"WSL:$DistroName`""
+ }
+ Update-ConfigFile -SourcePath $weztermSourcePath -DestinationPath $weztermDestPath -Replacements $weztermReplacements
+ Copy-Item -Path $weztermDestPath -Destination "$HOME\.wezterm.lua" -Force
+}
+
+# Process and copy all other configuration files from the repository to WSL
+# First copy to temp directory with replacements
+Get-ChildItem -Path "$RepoPath\wsl" -Exclude "etc" -Recurse -File | ForEach-Object {
+ $relativePath = $_.FullName.Substring("$RepoPath\wsl".Length)
+ $destPath = Join-Path $tempConfigDir $relativePath
+ $destDir = Split-Path -Parent $destPath
+
+ if (-not (Test-Path $destDir)) {
+ New-Item -Path $destDir -ItemType Directory -Force | Out-Null
+ }
+
+ # Check and replace content if needed based on file type/path
+ $content = Get-Content -Path $_.FullName -Raw -ErrorAction SilentlyContinue
+ $needsReplacement = $false
+
+ # Check if content contains references to default user or distro name
+ if ($content -match "user" -or $content -match "Arch") {
+ $needsReplacement = $true
+ # Replace username in configuration files
+ $content = $content -replace "\buser\b", $Username
+ # Replace distro name in configuration files
+ $content = $content -replace "\bArch\b", $DistroName
+ }
+
+ if ($needsReplacement) {
+ Set-Content -Path $destPath -Value $content -Force
+ Write-Host "Updated configuration in: $relativePath" -ForegroundColor Green
+ } else {
+ Copy-Item -Path $_.FullName -Destination $destPath -Force
+ }
+}
+
+# Now copy everything to WSL
+Write-Host "Copying updated configuration files to WSL..." -ForegroundColor Yellow
+Get-ChildItem -Path $tempConfigDir | ForEach-Object {
Copy-Item -Path $_.FullName -Destination "\\wsl$\$DistroName\home\$Username" -Recurse -Force
}
@@ -97,4 +177,6 @@ wsl --shutdown
Write-Host "===== Setup Complete! =====" -ForegroundColor Cyan
Write-Host "You can now launch your WSL instance with: wsl -d $DistroName" -ForegroundColor Green
-Write-Host "Remember to install Tmux plugins by pressing Ctrl+Space, Shift+I when in Tmux" -ForegroundColor Green
\ No newline at end of file
+Write-Host "Remember to install Tmux plugins by pressing Ctrl+Space, Shift+I when in Tmux" -ForegroundColor Green
+Write-Host "Edit tmux.conf (~/.config/tmux/tmux.conf) to specify which disk will be displayed in the status bar."
+Write-Host "The recommended way to use this WSL setup is through WezTerm. After all configurations are complete, launch WezTerm and you should see tmux running with 3 panes automatically."
\ No newline at end of file
diff --git a/README.md b/README.md
index 48c1988..2af7139 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@ My minimal setup for Arch Linux development environment optimized for WSL2, desi
## Features
-
+
### Core Components
@@ -36,11 +36,6 @@ My minimal setup for Arch Linux development environment optimized for WSL2, desi
> Note: WSL2 is configured to use up to 16GB of RAM in this setup (can be adjusted in [.wslconfig](./windows/.wslconfig))
-> Note: Throughout this guide, we'll use:
->
-> - Distribution name: `Arch` (if you choose a different name, update it in WezTerm config under `default_domain = "WSL:Arch"`)
-> - Username: `user` (if you want a different username, update relevant configs like `./wsl/etc/wsl.conf`)
-
### 1. Windows Host Setup
```powershell
@@ -51,7 +46,7 @@ winget install wezterm
git clone https://github.com/xzeldon/dotfiles-wsl2
cd dotfiles-wsl2
-# Copy Windows configs (THIS OVERWRITE IF FILES EXISTS!)
+# Copy Windows configs (THIS WILL OVERWRITE FILES IF THEY EXIST!)
Copy-Item -Path ".\windows\*" -Destination $HOME -Force -Recurse
```
@@ -79,108 +74,126 @@ wsl --import Arch D:\wsl\Arch "D:\Downloads\archlinux-latest.wsl"
### 3. System Configuration
-
-Initial Setup
+#### Automatic Setup Script (Recommended)
-```bash
-# Run first-time setup
-/usr/lib/wsl/first-setup.sh
-
-# Update system
-pacman -Syu
-
-# Install dependencies
-pacman -S sudo git vim neovim openssh wget binutils less debugedit fakeroot \
- fastfetch starship exa fish tmux htop python base-devel go dos2unix
-```
-
-
-
-
-User Configuration
-
-```bash
-# Set root user password
-passwd
-
-# Configure locale
-echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
-locale-gen
-
-# Create user
-useradd -m user
-# Set user password
-passwd user
-
-# Configure sudo
-echo "user ALL=(ALL) ALL" >> /etc/sudoers.d/user
-
-# Configure WSL default user
-
-# On Windows (PowerShell):
-# Assuming:
-# - You're in the repository root directory
-# - Your WSL distribution is named "Arch" (from section 2.2)
-# Copy WSL configuration file from host to guest
-cp .\wsl\etc\wsl.conf \\wsl.localhost\Arch\etc\wsl.conf
-
-# In WSL (Arch Linux):
-# Convert line endings from Windows (CRLF) to Unix (LF) format
-dos2unix /etc/wsl.conf
-
-# On Windows (PowerShell):
-# Restart WSL to apply changes
-wsl --shutdown
-```
-
-
-
-
-Aur helper and ssh bridge
-
-```bash
-# Install AUR helper
-git clone https://aur.archlinux.org/paru-bin.git
-cd paru-bin
-makepkg -si
-
-# Install agent for ssh bridge (see: https://wiki.archlinux.org/title/Install_Arch_Linux_on_WSL#Bridge_the_ssh-agent_service_from_Windows)
-paru -S wsl2-ssh-agent
-
-# Create .ssh directory (this not exists by default, but required for wsl2-ssh-agent)
-mkdir ~/.ssh
-```
-
-
-
-
-Copy Configuration Files
-
-You need to copy all configuration files from the repository to your WSL environment:
-
-From powershell:
+The repository includes an automated setup script that performs all the configuration steps described in the manual setup.
```powershell
-# Assuming you're in the repo directory, `Arch` is a WSL distribution name (from 2.2) and arch username is `user`
-Copy-Item -Path .\wsl\* -Destination \\wsl.localhost\Arch\home\user -Recurse -Force -Exclude "etc"
+# Run the setup script with default values (Distribution: "Arch", Username: "user")
+.\Install.ps1
+
+# Or specify your own distribution name and username
+.\Install.ps1 -DistroName "YourDistroName" -Username "yourusername"
```
-
+#### ⚠️ Important Notes About Automatic Setup
-
-Tmux configuration
+- **Error Handling**: The script does not comprehensively handle all possible errors. If something goes wrong (e.g., incorrect password confirmation, package installation failures), the script will continue execution regardless.
+- **Network Requirements**: A stable internet connection is required. Using VPNs or proxies is not recommended due to WSL networking limitations.
+- **User Interaction**: You will need to enter passwords for the root and user accounts during script execution.
-```bash
-# Install Tmux Plugin Manager
-git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
+After the script completes:
-# Start tmux and install plugins
-tmux # Then press Ctrl+Space, Shift+I
-```
+1. Start your WSL distribution: `wsl -d YourDistroName`
+2. Open tmux and install plugins by pressing `Ctrl+Space` followed by `Shift+I`
+3. Edit [tmux.conf](./wsl/.config/tmux/tmux.conf) to specify which disk will be displayed in the status bar.
+4. The recommended way to use this WSL setup is through WezTerm. After all configurations are complete, launch WezTerm and you should see tmux running with 3 panes automatically.
-
+#### Manual Setup
-> Tip: edit [tmux.conf](./wsl/.config/tmux/tmux.conf) to change disk in status bar
+> ⚠️ Note: Throughout this guide, we'll use:
+>
+> - Distribution name: `Arch` (if you choose a different name, update it in WezTerm config under `default_domain = "WSL:Arch"`)
+> - Username: `user` (if you want a different username, update relevant configs like `./wsl/etc/wsl.conf`)
+
+If you prefer a manual setup or need more control over the installation process, follow these steps:
+
+1. **Initial System Setup**
+
+ ```bash
+ # Run first-time setup
+ /usr/lib/wsl/first-setup.sh
+
+ # Update system
+ pacman -Syu
+
+ # Install dependencies
+ pacman -S sudo git vim neovim openssh wget binutils less debugedit fakeroot \
+ fastfetch starship exa fish tmux htop python base-devel go dos2unix
+ ```
+
+2. **User Configuration**
+
+ ```bash
+ # Set root user password
+ passwd
+
+ # Configure locale
+ echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
+ locale-gen
+
+ # Create user
+ useradd -m user
+
+ # Set user password
+ passwd user
+
+ # Configure sudo
+ echo "user ALL=(ALL) ALL" >> /etc/sudoers.d/user
+ ```
+
+3. **WSL Configuration**
+
+ ```bash
+ # On Windows (PowerShell):
+ # Assuming:
+ # - You're in the repository root directory
+ # - Your WSL distribution is named "Arch" (from section 2.2)
+ # Copy WSL configuration file from host to guest
+ cp .\wsl\etc\wsl.conf \\wsl.localhost\Arch\etc\wsl.conf
+
+ # In WSL (Arch Linux):
+ # Convert line endings from Windows (CRLF) to Unix (LF) format
+ dos2unix /etc/wsl.conf
+
+ # On Windows (PowerShell):
+ # Restart WSL to apply changes
+ wsl --shutdown
+ ```
+
+4. **AUR Helper and SSH Bridge Setup**
+
+ ```bash
+ # Install AUR helper
+ git clone https://aur.archlinux.org/paru-bin.git
+ cd paru-bin
+ makepkg -si
+
+ # Install agent for ssh bridge
+ # (see: https://wiki.archlinux.org/title/Install_Arch_Linux_on_WSL#Bridge_the_ssh-agent_service_from_Windows)
+ paru -S wsl2-ssh-agent
+
+ # Create .ssh directory (this does not exist by default, but is required for wsl2-ssh-agent)
+ mkdir ~/.ssh
+ ```
+
+5. **Copy Configuration Files**
+
+ ```powershell
+ # From Windows PowerShell:
+ # Assuming you're in the repo directory, `Arch` is your WSL distribution name and username is `user`
+ Copy-Item -Path .\wsl\* -Destination \\wsl.localhost\Arch\home\user -Recurse -Force -Exclude "etc"
+ ```
+
+6. **Tmux Setup**
+
+ ```bash
+ # Install Tmux Plugin Manager
+ git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
+
+ # Start tmux and install plugins
+ tmux # Then press Ctrl+Space, Shift+I
+ ```
## Configuration