#!/bin/bash # Arch Linux Development Environment Module # Handles programming languages, tools, and development setup arch_install_development_languages() { log SECTION "Installing development languages and runtimes" local section_start=$(date +%s) if confirm "Install development languages (Node.js, Go, PHP, Ruby, Julia, Java)?"; then local dev_packages=( nodejs npm go php luarocks composer jdk-openjdk julia ruby ) install_packages "${dev_packages[@]}" # Configure npm prefix npm config set prefix "${HOME}/.npm" log SUCCESS "Development languages installed $(show_timer $section_start)" fi } arch_install_neovim() { if ! role_enabled "CODE" && ! role_enabled "DEVELOPMENT" && ! role_enabled "TERMINAL"; then return 0 fi log SECTION "Installing Neovim" local section_start=$(date +%s) if confirm "Install Neovim (git version)?"; then # Install git version of neovim from AUR install_aur_packages neovim-git-bin # Install Node.js integration if command_exists npm; then sudo npm install -g neovim fi # Setup Neovim configuration mkdir -p ~/.config/nvim ln -sf ~/linuxbox/config/nvim/init.lua ~/.config/nvim/init.lua # Sync plugins if lazy directory exists if [ -d ~/.local/share/nvim/lazy ]; then nvim --headless "+Lazy! sync" +qa || true fi log SUCCESS "Neovim installed $(show_timer $section_start)" fi } arch_install_rust_tools() { log SECTION "Installing Rust development tools" local section_start=$(date +%s) if confirm "Install Rust tools (cargo packages)?"; then # Essential Rust tools local rust_tools=( "tree-sitter-cli" "ripgrep" "eza" "zoxide --locked" "starship --locked" ) for tool in "${rust_tools[@]}"; do log INFO "Installing $tool..." cargo install $tool done # Setup starship configuration mkdir -p ~/.config ln -sf ~/linuxbox/config/starship.toml ~/.config/starship.toml log SUCCESS "Rust tools installed $(show_timer $section_start)" fi } arch_install_embedded_tools() { if ! role_enabled "CODE" && ! role_enabled "LAB"; then return 0 fi log SECTION "Installing embedded development tools" local section_start=$(date +%s) if confirm "Install embedded development tools (RP2040, etc.)?"; then # Add embedded target for Rust rustup target add thumbv6m-none-eabi # Install embedded-specific cargo tools local embedded_tools=( "elf2uf2-rs --locked" "probe-run" "flip-link" ) for tool in "${embedded_tools[@]}"; do log INFO "Installing $tool..." cargo install $tool done # Link pico-load script mkdir -p ~/.local/bin ln -sf ~/linuxbox/pico-load.sh ~/.local/bin/pico-load log SUCCESS "Embedded tools installed $(show_timer $section_start)" fi } arch_install_lsp_servers() { if ! role_enabled "CODE" && ! role_enabled "DEVELOPMENT"; then return 0 fi log SECTION "Installing LSP servers" local section_start=$(date +%s) if confirm "Install Language Server Protocol servers?"; then # LSP servers from official repos local lsp_packages=( prettier stylua python-black shfmt lua-language-server bash-language-server ccls vscode-html-languageserver vscode-json-languageserver marksman pyright yaml-language-server vscode-css-languageserver clang ) install_packages "${lsp_packages[@]}" # LSP servers from AUR install_aur_packages dockerfile-language-server # Rust components rustup component add rust-analyzer clippy rustfmt # Lua configuration ln -sf ~/linuxbox/luacheckrc ~/.luacheckrc log SUCCESS "LSP servers installed $(show_timer $section_start)" fi } arch_install_virtualhere() { if ! role_enabled "CODE" && ! role_enabled "LAB"; then return 0 fi log SECTION "Installing VirtualHere USB client" local section_start=$(date +%s) if confirm "Install VirtualHere USB over IP client?"; then cd ~ # Download VirtualHere client files local vh_files=( "virtualhereclient.service" "vhclientx86_64" "vhuit64" ) local vh_base_url="https://www.virtualhere.com/sites/default/files/usbclient" for file in "${vh_files[@]}"; do if [ "$file" == "virtualhereclient.service" ]; then wget "${vh_base_url}/scripts/$file" else wget "${vh_base_url}/$file" fi done # Make executables and install chmod +x ./vhclientx86_64 ./vhuit64 sudo mv ./vhclientx86_64 /usr/sbin sudo mv ./vhuit64 /usr/sbin # Setup sudo permissions echo "$USER ALL=(ALL:ALL) NOPASSWD: /usr/sbin/vhclientx86_64" | \ sudo tee /etc/sudoers.d/$USER+vhclientx86_64 echo "$USER ALL=(ALL:ALL) NOPASSWD: /usr/sbin/vhuit64" | \ sudo tee /etc/sudoers.d/$USER+vhuit64 # Install and enable service sudo mv virtualhereclient.service /etc/systemd/system/virtualhereclient.service sudo systemctl daemon-reload sudo systemctl enable virtualhereclient.service sudo systemctl start virtualhereclient.service log SUCCESS "VirtualHere client installed $(show_timer $section_start)" fi } arch_setup_git() { log SECTION "Setting up Git configuration" local section_start=$(date +%s) # Install git-lfs if not present if ! command_exists git-lfs; then install_packages git-lfs fi # Link git configuration ln -sf ~/linuxbox/gitconfig ~/.gitconfig log SUCCESS "Git configuration setup $(show_timer $section_start)" } arch_install_lazygit() { if ! role_enabled "CODE" && ! role_enabled "DEVELOPMENT"; then return 0 fi log SECTION "Installing Lazygit" local section_start=$(date +%s) if confirm "Install Lazygit Git TUI?"; then install_packages lazygit # Setup lazygit configuration mkdir -p ~/.config/lazygit ln -sf ~/linuxbox/config/lazygit/config.yml ~/.config/lazygit/config.yml log SUCCESS "Lazygit installed $(show_timer $section_start)" fi } arch_install_containers() { if ! role_enabled "CODE" && ! role_enabled "DEVELOPMENT"; then return 0 fi log SECTION "Installing container tools" local section_start=$(date +%s) if confirm "Install container tools (Docker, Podman)?"; then # Install from official repositories or AUR local container_packages=() if confirm "Install Docker?"; then container_packages+=(docker docker-compose) fi if confirm "Install Podman?"; then container_packages+=(podman podman-compose) fi if [ ${#container_packages[@]} -gt 0 ]; then install_packages "${container_packages[@]}" # Add user to docker group if docker was installed if [[ " ${container_packages[@]} " =~ " docker " ]]; then sudo usermod -aG docker $USER log INFO "Added $USER to docker group - logout/login required" fi fi log SUCCESS "Container tools installed $(show_timer $section_start)" fi } # Main function to run all development setup arch_setup_development() { if ! role_enabled "CODE" && ! role_enabled "DEVELOPMENT"; then log INFO "Development roles not enabled - skipping development setup" return 0 fi arch_setup_git arch_install_development_languages arch_install_neovim arch_install_rust_tools arch_install_embedded_tools arch_install_lsp_servers arch_install_virtualhere arch_install_lazygit arch_install_containers } # Source guard if [ -z "$ARCH_DEVELOPMENT_LOADED" ]; then ARCH_DEVELOPMENT_LOADED=true fi