commit 222062c1a475e221d367d7366d100e736fabaca1 Author: Tuan-Dat Tran Date: Sun Mar 22 22:51:32 2026 +0100 init Signed-off-by: Tuan-Dat Tran diff --git a/ansible.cfg b/ansible.cfg new file mode 100644 index 0000000..f83158a --- /dev/null +++ b/ansible.cfg @@ -0,0 +1,18 @@ +[defaults] +inventory = inventory.ini +interpreter_python = auto_silent +callbacks_enabled = timer, profile_tasks, default +display_skipped_hosts = no +deprecation_warnings = False +host_key_checking = False +gathering = smart +retry_files_enabled = False + +[privilege_escalation] +become = True +become_method = sudo +become_user = root +become_ask_pass = False + +[connection] +pipelining = True diff --git a/bootstrap.sh b/bootstrap.sh new file mode 100755 index 0000000..dff0e96 --- /dev/null +++ b/bootstrap.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash +set -euo pipefail + +echo "=== Arch Linux Hyprland Setup Bootstrap ===" +echo "" + +# Check if running as root +if [ "$EUID" -eq 0 ]; then + echo "Error: Do not run as root. Run as a normal user." + exit 1 +fi + +# Step 1: Setup sudo access for package installation +echo "[1/4] Setting up sudo access..." +if ! sudo -n true 2>/dev/null; then + echo "$USER ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/local > /dev/null + echo "NOPASSWD sudo configured." +else + echo "Sudo access available." +fi + +# Step 2: Install base requirements (git, ansible) +echo "[2/4] Installing base requirements (git, ansible)..." +sudo pacman -Sy --noconfirm git ansible + +# Step 3: Clone or update the repo +echo "[3/4] Setting up archsetup..." +if [ -d "$HOME/archsetup/.git" ]; then + echo "Updating archsetup..." + cd "$HOME/archsetup" + git pull +else + echo "Cloning archsetup..." + git clone https://github.com/YOUR_USERNAME/archsetup.git "$HOME/archsetup" +fi + +# Step 4: Run the playbook +echo "[4/4] Running Ansible playbook..." +cd "$HOME/archsetup" +ansible-playbook site.yml + +echo "" +echo "=== Setup complete! ===" +echo "Logout and login again for shell changes to take effect." +echo "Restart Hyprland (Super + Shift + Q) to apply new configuration." diff --git a/dotfiles/hypr/.config/hypr/hyprland.conf b/dotfiles/hypr/.config/hypr/hyprland.conf new file mode 100644 index 0000000..2732be8 --- /dev/null +++ b/dotfiles/hypr/.config/hypr/hyprland.conf @@ -0,0 +1,364 @@ + +# ####################################################################################### +# AUTOGENERATED HYPRLAND CONFIG. +# EDIT THIS CONFIG ACCORDING TO THE WIKI INSTRUCTIONS. +# ####################################################################################### + +autogenerated = 0 # remove this line to remove the warning + +# This is an example Hyprland config file. +# Refer to the wiki for more information. +# https://wiki.hypr.land/Configuring/ + +# Please note not all available settings / options are set here. +# For a full list, see the wiki + +# You can split this configuration into multiple files +# Create your files separately and then link them to this file like this: +# source = ~/.config/hypr/myColors.conf + + +################ +### MONITORS ### +################ + +# See https://wiki.hypr.land/Configuring/Monitors/ +monitor=,preferred,auto,auto + + +################### +### MY PROGRAMS ### +################### + +# See https://wiki.hypr.land/Configuring/Keywords/ + +# Set programs that you use +$terminal = kitty +$fileManager = dolphin +$menu = wofi -S drun +$browser = firefox + + +################# +### AUTOSTART ### +################# + +# Autostart necessary processes (like notifications daemons, status bars, etc.) +# Or execute your favorite apps at launch like this: + +exec-once = $terminal +exec-once = nm-applet & +exec-once = waybar & hyprpaper & firefox +exec-once = kanshi + +############################# +### ENVIRONMENT VARIABLES ### +############################# + +# See https://wiki.hypr.land/Configuring/Environment-variables/ + +env = XCURSOR_SIZE,24 +env = HYPRCURSOR_SIZE,24 + + +################### +### PERMISSIONS ### +################### + +# See https://wiki.hypr.land/Configuring/Permissions/ +# Please note permission changes here require a Hyprland restart and are not applied on-the-fly +# for security reasons + +# ecosystem { +# enforce_permissions = 1 +# } + +# permission = /usr/(bin|local/bin)/grim, screencopy, allow +# permission = /usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland, screencopy, allow +# permission = /usr/(bin|local/bin)/hyprpm, plugin, allow + + +##################### +### LOOK AND FEEL ### +##################### + +# Refer to https://wiki.hypr.land/Configuring/Variables/ + +# https://wiki.hypr.land/Configuring/Variables/#general +general { + gaps_in = 5 + gaps_out = 20 + + border_size = 2 + + # https://wiki.hypr.land/Configuring/Variables/#variable-types for info about colors + col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg + col.inactive_border = rgba(595959aa) + + # Set to true enable resizing windows by clicking and dragging on borders and gaps + resize_on_border = false + + # Please see https://wiki.hypr.land/Configuring/Tearing/ before you turn this on + allow_tearing = false + + layout = dwindle +} + +# https://wiki.hypr.land/Configuring/Variables/#decoration +decoration { + rounding = 10 + rounding_power = 2 + + # Change transparency of focused and unfocused windows + active_opacity = 1.0 + inactive_opacity = 1.0 + + shadow { + enabled = true + range = 4 + render_power = 3 + color = rgba(1a1a1aee) + } + + # https://wiki.hypr.land/Configuring/Variables/#blur + blur { + enabled = true + size = 3 + passes = 1 + + vibrancy = 0.1696 + } +} + +# https://wiki.hypr.land/Configuring/Variables/#animations +animations { + enabled = yes, please :) + + # Default curves, see https://wiki.hypr.land/Configuring/Animations/#curves + # NAME, X0, Y0, X1, Y1 + bezier = easeOutQuint, 0.23, 1, 0.32, 1 + bezier = easeInOutCubic, 0.65, 0.05, 0.36, 1 + bezier = linear, 0, 0, 1, 1 + bezier = almostLinear, 0.5, 0.5, 0.75, 1 + bezier = quick, 0.15, 0, 0.1, 1 + + # Default animations, see https://wiki.hypr.land/Configuring/Animations/ + # NAME, ONOFF, SPEED, CURVE, [STYLE] + animation = global, 1, 10, default + animation = border, 1, 5.39, easeOutQuint + animation = windows, 1, 4.79, easeOutQuint + animation = windowsIn, 1, 4.1, easeOutQuint, popin 87% + animation = windowsOut, 1, 1.49, linear, popin 87% + animation = fadeIn, 1, 1.73, almostLinear + animation = fadeOut, 1, 1.46, almostLinear + animation = fade, 1, 3.03, quick + animation = layers, 1, 3.81, easeOutQuint + animation = layersIn, 1, 4, easeOutQuint, fade + animation = layersOut, 1, 1.5, linear, fade + animation = fadeLayersIn, 1, 1.79, almostLinear + animation = fadeLayersOut, 1, 1.39, almostLinear + animation = workspaces, 1, 1.94, almostLinear, fade + animation = workspacesIn, 1, 1.21, almostLinear, fade + animation = workspacesOut, 1, 1.94, almostLinear, fade + animation = zoomFactor, 1, 7, quick +} + +# Ref https://wiki.hypr.land/Configuring/Workspace-Rules/ +# "Smart gaps" / "No gaps when only" +# uncomment all if you wish to use that. +# workspace = w[tv1], gapsout:0, gapsin:0 +# workspace = f[1], gapsout:0, gapsin:0 +# windowrule { +# name = no-gaps-wtv1 +# match:float = false +# match:workspace = w[tv1] +# +# border_size = 0 +# rounding = 0 +# } +# +# windowrule { +# name = no-gaps-f1 +# match:float = false +# match:workspace = f[1] +# +# border_size = 0 +# rounding = 0 +# } + +# See https://wiki.hypr.land/Configuring/Dwindle-Layout/ for more +dwindle { + pseudotile = true # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below + preserve_split = true # You probably want this +} + +# See https://wiki.hypr.land/Configuring/Master-Layout/ for more +master { + new_status = master +} + +# https://wiki.hypr.land/Configuring/Variables/#misc +misc { + force_default_wallpaper = -1 # Set to 0 or 1 to disable the anime mascot wallpapers + disable_hyprland_logo = false # If true disables the random hyprland logo / anime girl background. :( +} + + +############# +### INPUT ### +############# + +# https://wiki.hypr.land/Configuring/Variables/#input +input { + kb_layout = us + kb_variant = + kb_model = + kb_options = caps:ctrl_modifier + kb_rules = + + follow_mouse = 1 + + sensitivity = 0 # -1.0 - 1.0, 0 means no modification. + + touchpad { + natural_scroll = false + } +} + +# See https://wiki.hypr.land/Configuring/Gestures +gesture = 3, horizontal, workspace + +# Example per-device config +# See https://wiki.hypr.land/Configuring/Keywords/#per-device-input-configs for more +device { + name = epic-mouse-v1 + sensitivity = -0.5 +} + + +################### +### KEYBINDINGS ### +################### + +# See https://wiki.hypr.land/Configuring/Keywords/ +$mainMod = SUPER # Sets "Windows" key as main modifier + +# Example binds, see https://wiki.hypr.land/Configuring/Binds/ for more +bind = $mainMod, Return, exec, $terminal +bind = $mainMod SHIFT, Q, killactive, +# bind = $mainMod, M, exec, command -v hyprshutdown >/dev/null 2>&1 && hyprshutdown || hyprctl dispatch exit +bind = $mainMod, E, exec, $fileManager +bind = $mainMod, B, exec, $browser +bind = $mainMod, Space, togglefloating, +bind = $mainMod, F, fullscreen, +bind = $mainMod, d, exec, $menu +bind = $mainMod Shift, R, exec, reload +bind = $mainMod, P, pseudo, # dwindle +# bind = $mainMod, J, layoutmsg, togglesplit # dwindle + +# Move focus with mainMod + arrow keys / hjlk +bind = $mainMod, left, movefocus, l +bind = $mainMod, right, movefocus, r +bind = $mainMod, up, movefocus, u +bind = $mainMod, down, movefocus, d +bind = $mainMod, H, movefocus, l +bind = $mainMod, L, movefocus, r +bind = $mainMod, K, movefocus, u +bind = $mainMod, J, movefocus, d + +# Move window with mainMod + arrow keys / hjlk +bind = $mainMod Shift, H, movewindow, l +bind = $mainMod Shift, L, movewindow, r +bind = $mainMod Shift, K, movewindow, u +bind = $mainMod Shift, J, movewindow, d + + +# Switch workspaces with mainMod + [0-9] +bind = $mainMod, 1, workspace, 1 +bind = $mainMod, 2, workspace, 2 +bind = $mainMod, 3, workspace, 3 +bind = $mainMod, 4, workspace, 4 +bind = $mainMod, 5, workspace, 5 +bind = $mainMod, 6, workspace, 6 +bind = $mainMod, 7, workspace, 7 +bind = $mainMod, 8, workspace, 8 +bind = $mainMod, 9, workspace, 9 +bind = $mainMod, 0, workspace, 10 + +# Move active window to a workspace with mainMod + SHIFT + [0-9] +bind = $mainMod SHIFT, 1, movetoworkspace, 1 +bind = $mainMod SHIFT, 2, movetoworkspace, 2 +bind = $mainMod SHIFT, 3, movetoworkspace, 3 +bind = $mainMod SHIFT, 4, movetoworkspace, 4 +bind = $mainMod SHIFT, 5, movetoworkspace, 5 +bind = $mainMod SHIFT, 6, movetoworkspace, 6 +bind = $mainMod SHIFT, 7, movetoworkspace, 7 +bind = $mainMod SHIFT, 8, movetoworkspace, 8 +bind = $mainMod SHIFT, 9, movetoworkspace, 9 +bind = $mainMod SHIFT, 0, movetoworkspace, 10 + +# Example special workspace (scratchpad) +bind = $mainMod, S, togglespecialworkspace, magic +bind = $mainMod SHIFT, S, movetoworkspace, special:magic + +# Scroll through existing workspaces with mainMod + scroll +bind = $mainMod, mouse_down, workspace, e+1 +bind = $mainMod, mouse_up, workspace, e-1 + +# Move/resize windows with mainMod + LMB/RMB and dragging +bindm = $mainMod, mouse:272, movewindow +bindm = $mainMod, mouse:273, resizewindow + +# Laptop multimedia keys for volume and LCD brightness +bindel = ,XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+ +bindel = ,XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- +bindel = ,XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle +bindel = ,XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle +bindel = ,XF86MonBrightnessUp, exec, brightnessctl -e4 -n2 set 5%+ +bindel = ,XF86MonBrightnessDown, exec, brightnessctl -e4 -n2 set 5%- + +# Requires playerctl +bindl = , XF86AudioNext, exec, playerctl next +bindl = , XF86AudioPause, exec, playerctl play-pause +bindl = , XF86AudioPlay, exec, playerctl play-pause +bindl = , XF86AudioPrev, exec, playerctl previous + +############################## +### WINDOWS AND WORKSPACES ### +############################## + +# See https://wiki.hypr.land/Configuring/Window-Rules/ for more +# See https://wiki.hypr.land/Configuring/Workspace-Rules/ for workspace rules + +# Example windowrules that are useful + +windowrule { + # Ignore maximize requests from all apps. You'll probably like this. + name = suppress-maximize-events + match:class = .* + + suppress_event = maximize +} + +windowrule { + # Fix some dragging issues with XWayland + name = fix-xwayland-drags + match:class = ^$ + match:title = ^$ + match:xwayland = true + match:float = true + match:fullscreen = false + match:pin = false + + no_focus = true +} + +# Hyprland-run windowrule +windowrule { + name = move-hyprland-run + + match:class = hyprland-run + + move = 20 monitor_h-120 + float = yes +} diff --git a/dotfiles/starship/.config/starship/config.toml b/dotfiles/starship/.config/starship/config.toml new file mode 100644 index 0000000..400d7cd --- /dev/null +++ b/dotfiles/starship/.config/starship/config.toml @@ -0,0 +1,24 @@ +$formatters +format = """ +[─](bold green) +[❯](bold green) """ +add_newline = true + +[character] +success_symbol = "[❯](bold green)" +error_symbol = "[❯](bold red)" + +[directory] +home_symbol = "~" +truncation_length = 3 +truncate_to_repo = true + +[git] +branch_symbol = " " +stash_count_symbol = " " +format = "on [$symbol$branch]($style)$completions" +style = "bold purple" + +[docker_context] +format = "via [$symbol$context]($style) " +style = "blue bold" diff --git a/dotfiles/zellij/.config/zellij/config.kdl b/dotfiles/zellij/.config/zellij/config.kdl new file mode 100644 index 0000000..ae8ae10 --- /dev/null +++ b/dotfiles/zellij/.config/zellij/config.kdl @@ -0,0 +1,318 @@ +// If you'd like to override the default keybindings completely, be sure to change "keybinds" to "keybinds clear-defaults=true" +keybinds { + normal clear-defaults=true { + bind "F1" {SwitchToMode "Tab"; } + bind "F2" {SwitchToMode "Pane"; } + bind "F5" {SwitchToMode "Session"; } + bind "F6" {SwitchToMode "Search"; } + bind "F7" {SwitchToMode "Scroll"; } + bind "F8" {SwitchToMode "Resize"; } + bind "F9" {SwitchToMode "Move"; } + bind "F12" {SwitchToMode "Locked"; } + bind "Alt h" "Alt Left" { MoveFocusOrTab "Left"; } + bind "Alt l" "Alt Right" { MoveFocusOrTab "Right"; } + bind "Alt j" "Alt Down" { MoveFocus "Down"; } + bind "Alt k" "Alt Up" { MoveFocus "Up"; } + bind "Alt n" { NewPane; } + bind "Alt t" { NewTab; } + bind "Alt w" { ToggleFloatingPanes; } + bind "Alt =" "Alt +" { Resize "Increase"; } + bind "Alt -" { Resize "Decrease"; } + + } + tab { + bind "Ctrl t" { SwitchToMode "Normal"; } + bind "r" { SwitchToMode "RenameTab"; TabNameInput 0; } + bind "h" "Left" "Up" "k" { GoToPreviousTab; } + bind "l" "Right" "Down" "j" { GoToNextTab; } + bind "n" { NewTab; SwitchToMode "Normal"; } + bind "x" { CloseTab; SwitchToMode "Normal"; } + bind "s" { ToggleActiveSyncTab; SwitchToMode "Normal"; } + bind "1" { GoToTab 1; SwitchToMode "Normal"; } + bind "2" { GoToTab 2; SwitchToMode "Normal"; } + bind "3" { GoToTab 3; SwitchToMode "Normal"; } + bind "4" { GoToTab 4; SwitchToMode "Normal"; } + bind "5" { GoToTab 5; SwitchToMode "Normal"; } + bind "6" { GoToTab 6; SwitchToMode "Normal"; } + bind "7" { GoToTab 7; SwitchToMode "Normal"; } + bind "8" { GoToTab 8; SwitchToMode "Normal"; } + bind "9" { GoToTab 9; SwitchToMode "Normal"; } + bind "Tab" { ToggleTab; } + } + locked { + bind "F12" { SwitchToMode "Normal"; } + } + resize { + bind "Ctrl n" { SwitchToMode "Normal"; } + bind "h" "Left" { Resize "Increase Left"; } + bind "j" "Down" { Resize "Increase Down"; } + bind "k" "Up" { Resize "Increase Up"; } + bind "l" "Right" { Resize "Increase Right"; } + bind "H" { Resize "Decrease Left"; } + bind "J" { Resize "Decrease Down"; } + bind "K" { Resize "Decrease Up"; } + bind "L" { Resize "Decrease Right"; } + bind "=" "+" { Resize "Increase"; } + bind "-" { Resize "Decrease"; } + } + pane { + bind "Ctrl p" { SwitchToMode "Normal"; } + bind "h" "Left" { MoveFocus "Left"; } + bind "l" "Right" { MoveFocus "Right"; } + bind "j" "Down" { MoveFocus "Down"; } + bind "k" "Up" { MoveFocus "Up"; } + bind "p" { SwitchFocus; } + bind "n" { NewPane; SwitchToMode "Normal"; } + bind "d" { NewPane "Down"; SwitchToMode "Normal"; } + bind "r" { NewPane "Right"; SwitchToMode "Normal"; } + bind "x" { CloseFocus; SwitchToMode "Normal"; } + bind "f" { ToggleFocusFullscreen; SwitchToMode "Normal"; } + bind "z" { TogglePaneFrames; SwitchToMode "Normal"; } + bind "w" { ToggleFloatingPanes; SwitchToMode "Normal"; } + bind "e" { TogglePaneEmbedOrFloating; SwitchToMode "Normal"; } + bind "c" { SwitchToMode "RenamePane"; PaneNameInput 0;} + } + move { + bind "Ctrl h" { SwitchToMode "Normal"; } + bind "n" "Tab" { MovePane; } + bind "h" "Left" { MovePane "Left"; } + bind "j" "Down" { MovePane "Down"; } + bind "k" "Up" { MovePane "Up"; } + bind "l" "Right" { MovePane "Right"; } + bind "shift h" { MoveTab "Left"; } + bind "shift l" { MoveTab "Right"; } + } + scroll { + bind "Ctrl s" { SwitchToMode "Normal"; } + bind "e" { EditScrollback; SwitchToMode "Normal"; } + bind "s" { SwitchToMode "EnterSearch"; SearchInput 0; } + bind "Ctrl c" { ScrollToBottom; SwitchToMode "Normal"; } + bind "j" "Down" { ScrollDown; } + bind "k" "Up" { ScrollUp; } + bind "Ctrl f" "PageDown" "Right" "l" { PageScrollDown; } + bind "Ctrl b" "PageUp" "Left" "h" { PageScrollUp; } + bind "d" { HalfPageScrollDown; } + bind "u" { HalfPageScrollUp; } + // uncomment this and adjust key if using copy_on_select=false + // bind "Alt c" { Copy; } + } + search { + bind "Ctrl s" { SwitchToMode "Normal"; } + bind "Ctrl c" { ScrollToBottom; SwitchToMode "Normal"; } + bind "j" "Down" { ScrollDown; } + bind "k" "Up" { ScrollUp; } + bind "Ctrl f" "PageDown" "Right" "l" { PageScrollDown; } + bind "Ctrl b" "PageUp" "Left" "h" { PageScrollUp; } + bind "d" { HalfPageScrollDown; } + bind "u" { HalfPageScrollUp; } + bind "n" { Search "down"; } + bind "p" { Search "up"; } + bind "c" { SearchToggleOption "CaseSensitivity"; } + bind "w" { SearchToggleOption "Wrap"; } + bind "o" { SearchToggleOption "WholeWord"; } + } + entersearch { + bind "Ctrl c" "Esc" { SwitchToMode "Scroll"; } + bind "Enter" { SwitchToMode "Search"; } + } + renametab { + bind "Ctrl c" { SwitchToMode "Normal"; } + bind "Esc" { UndoRenameTab; SwitchToMode "Tab"; } + } + renamepane { + bind "Ctrl c" { SwitchToMode "Normal"; } + bind "Esc" { UndoRenamePane; SwitchToMode "Pane"; } + } + session { + bind "Ctrl o" { SwitchToMode "Normal"; } + bind "Ctrl s" { SwitchToMode "Scroll"; } + bind "d" { Detach; } + } + tmux { + bind "[" { SwitchToMode "Scroll"; } + bind "Ctrl b" { Write 2; SwitchToMode "Normal"; } + bind "\"" { NewPane "Down"; SwitchToMode "Normal"; } + bind "%" { NewPane "Right"; SwitchToMode "Normal"; } + bind "z" { ToggleFocusFullscreen; SwitchToMode "Normal"; } + bind "c" { NewTab; SwitchToMode "Normal"; } + bind "," { SwitchToMode "RenameTab"; } + bind "p" { GoToPreviousTab; SwitchToMode "Normal"; } + bind "n" { GoToNextTab; SwitchToMode "Normal"; } + bind "Left" { MoveFocus "Left"; SwitchToMode "Normal"; } + bind "Right" { MoveFocus "Right"; SwitchToMode "Normal"; } + bind "Down" { MoveFocus "Down"; SwitchToMode "Normal"; } + bind "Up" { MoveFocus "Up"; SwitchToMode "Normal"; } + bind "h" { MoveFocus "Left"; SwitchToMode "Normal"; } + bind "l" { MoveFocus "Right"; SwitchToMode "Normal"; } + bind "j" { MoveFocus "Down"; SwitchToMode "Normal"; } + bind "k" { MoveFocus "Up"; SwitchToMode "Normal"; } + bind "o" { FocusNextPane; } + bind "d" { Detach; } + } + shared_except "locked" { + bind "Ctrl g" { SwitchToMode "Locked"; } + bind "Ctrl q" { Quit; } + bind "Alt n" { NewPane; } + bind "Alt h" "Alt Left" { MoveFocusOrTab "Left"; } + bind "Alt l" "Alt Right" { MoveFocusOrTab "Right"; } + bind "Alt j" "Alt Down" { MoveFocus "Down"; } + bind "Alt k" "Alt Up" { MoveFocus "Up"; } + bind "Alt =" "Alt +" { Resize "Increase"; } + bind "Alt -" { Resize "Decrease"; } + } + shared_except "normal" "locked" { + bind "Enter" "Esc" { SwitchToMode "Normal"; } + } + shared_except "pane" "locked" { + bind "Ctrl p" { SwitchToMode "Pane"; } + } + shared_except "resize" "locked" { + bind "Ctrl n" { SwitchToMode "Resize"; } + } + shared_except "scroll" "locked" { + bind "Ctrl s" { SwitchToMode "Scroll"; } + } + shared_except "session" "locked" { + bind "Ctrl o" { SwitchToMode "Session"; } + } + shared_except "tab" "locked" { + bind "Ctrl t" { SwitchToMode "Tab"; } + } + shared_except "move" "locked" { + bind "Ctrl h" { SwitchToMode "Move"; } + } + shared_except "tmux" "locked" { + bind "Ctrl b" { SwitchToMode "Tmux"; } + } +} + +plugins { + tab-bar { path "tab-bar"; } + status-bar { path "status-bar"; } + strider { path "strider"; } + compact-bar { path "compact-bar"; } +} + +// Choose what to do when zellij receives SIGTERM, SIGINT, SIGQUIT or SIGHUP +// eg. when terminal window with an active zellij session is closed +// Options: +// - detach (Default) +// - quit +// +// on_force_close "quit" + +// Send a request for a simplified ui (without arrow fonts) to plugins +// Options: +// - true +// - false (Default) +// +// simplified_ui true + +// Choose the path to the default shell that zellij will use for opening new panes +// Default: $SHELL +// +// default_shell "fish" + +// Toggle between having pane frames around the panes +// Options: +// - true (default) +// - false +// +// pane_frames true + +// Define color themes for Zellij +// For more examples, see: https://github.com/zellij-org/zellij/tree/main/example/themes +// Once these themes are defined, one of them should to be selected in the "theme" section of this file +// +// +themes { + tokyo-night-dark { + fg 169 177 214 + bg 26 27 38 + black 56 62 90 + red 249 51 87 + green 158 206 106 + yellow 224 175 104 + blue 122 162 247 + magenta 187 154 247 + cyan 42 195 222 + white 192 202 245 + orange 255 158 100 + } +} + +// Choose the theme that is specified in the themes section. +// Default: default +// +theme "tokyo-night-dark" + +// The name of the default layout to load on startup +// Default: "default" +// +// default_layout "compact" + +// Choose the mode that zellij uses when starting up. +// Default: normal +// +// default_mode "locked" + +// Toggle enabling the mouse mode. +// On certain configurations, or terminals this could +// potentially interfere with copying text. +// Options: +// - true (default) +// - false +// +// mouse_mode false + +// Configure the scroll back buffer size +// This is the number of lines zellij stores for each pane in the scroll back +// buffer. Excess number of lines are discarded in a FIFO fashion. +// Valid values: positive integers +// Default value: 10000 +// +// scroll_buffer_size 10000 + +// Provide a command to execute when copying text. The text will be piped to +// the stdin of the program to perform the copy. This can be used with +// terminal emulators which do not support the OSC 52 ANSI control sequence +// that will be used by default if this option is not set. +// Examples: +// +// copy_command "xclip -selection clipboard" // x11 +// copy_command "wl-copy" // wayland +// copy_command "pbcopy" // osx + +// Choose the destination for copied text +// Allows using the primary selection buffer (on x11/wayland) instead of the system clipboard. +// Does not apply when using copy_command. +// Options: +// - system (default) +// - primary +// +// copy_clipboard "primary" + +// Enable or disable automatic copy (and clear) of selection when releasing mouse +// Default: true +// +// copy_on_select false + +// Path to the default editor to use to edit pane scrollbuffer +// Default: $EDITOR or $VISUAL +// +// scrollback_editor "/usr/bin/nvim" + +// When attaching to an existing session with other users, +// should the session be mirrored (true) +// or should each user have their own cursor (false) +// Default: false +// +// mirror_session true + +// The folder in which Zellij will look for layouts +// +// layout_dir "/path/to/my/layout_dir" + +// The folder in which Zellij will look for themes +// +// theme_dir "/path/to/my/theme_dir" diff --git a/dotfiles/zsh/.zshrc b/dotfiles/zsh/.zshrc new file mode 100644 index 0000000..353f897 --- /dev/null +++ b/dotfiles/zsh/.zshrc @@ -0,0 +1,25 @@ +# ~/.zshrc - Zsh configuration + +# Source .zprofile for login shell environment +[[ -f ~/.zprofile ]] && emulate sh -c 'source ~/.zprofile' + +# Enable powerlevel10k instant prompt +#if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then +# source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" +#fi + +# Basic options +setopt HIST_IGNORE_DUPS +setopt HIST_IGNORE_SPACE +setopt AUTO_CD +setopt CORRECT + +# Key bindings +bindkey -v + +# Completion +autoload -Uz compinit +compinit + +# Plugins (loaded via oh-my-zsh) +# plugins=(git docker python node npm) diff --git a/inventory.ini b/inventory.ini new file mode 100644 index 0000000..fca4466 --- /dev/null +++ b/inventory.ini @@ -0,0 +1,2 @@ +[localhost] +ansible_connection=local \ No newline at end of file diff --git a/requirements.yml b/requirements.yml new file mode 100644 index 0000000..c759f63 --- /dev/null +++ b/requirements.yml @@ -0,0 +1,4 @@ +--- +collections: + - name: kewlfft.aur + version: 0.13.0 diff --git a/roles/ai/tasks/main.yaml b/roles/ai/tasks/main.yaml new file mode 100644 index 0000000..8e1e8cc --- /dev/null +++ b/roles/ai/tasks/main.yaml @@ -0,0 +1,6 @@ +# tasks file for ai +- name: Install AI development tools + pacman: + name: + - opencode + state: present diff --git a/roles/common/handlers/main.yaml b/roles/common/handlers/main.yaml new file mode 100644 index 0000000..fdb71e8 --- /dev/null +++ b/roles/common/handlers/main.yaml @@ -0,0 +1,3 @@ +- name: Update font cache + ansible.builtin.command: fc-cache -fv + changed_when: false diff --git a/roles/common/tasks/main.yml b/roles/common/tasks/main.yml new file mode 100644 index 0000000..d783c57 --- /dev/null +++ b/roles/common/tasks/main.yml @@ -0,0 +1,138 @@ +# tasks file for common +- name: Install base development tools + become: true + pacman: + name: + - base-devel + - git + - curl + - wget + - rsync + - unzip + - zip + - less + - man + - texinfo + - which + - zsh + - stow + - ansible + - zoxide + - atuin + - broot + - bottom + - hyperfine + - tokei + - git-delta + - yazi + - tealdeer + state: present + +- name: Install Rust toolchain and Python uv + become: true + pacman: + name: + - rust + - eza + - bat + - ripgrep + - fd + - starship + - cargo + - cargo-binstall + - uv + state: present + +- name: Install Fonts + become: true + pacman: + name: + - ttf-dejavu + - ttf-liberation + - ttf-jetbrains-mono-nerd + - adobe-source-han-sans-jp-fonts + state: present + notify: Update font cache + +- name: Ensure ttf-joypixels is installed from AUR + kewlfft.aur.aur: + name: ttf-joypixels + use: paru + state: present + notify: Update font cache + +- name: Install AUR helper (paru) + shell: | + command -v paru >/dev/null 2>&1 && exit 0 || ( + cd /tmp + rm -rf paru + git clone https://aur.archlinux.org/paru.git + cd paru + makepkg -si --noconfirm + cd ~ + rm -rf /tmp/paru + ) + register: paru_install + changed_when: "'Installing' in paru_install.stdout or 'Compiling' in paru_install.stdout" + +- name: Install oh-my-zsh + shell: | + [ -d ~/.oh-my-zsh ] && exit 0 || sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended + args: + creates: ~/.oh-my-zsh + +- name: Check current shell + become: true + getent: + database: passwd + key: "{{ user }}" + register: user_info + changed_when: false + +- name: Set zsh as default shell + become: true + shell: chsh -s /bin/zsh {{ user }} + when: user_info.ansible_facts.getent_passwd[user][-1] != '/bin/zsh' + +- name: Setup shell profile configuration + blockinfile: + path: "{{ lookup('env', 'HOME') }}/.profile" + marker: "# {mark} ANSIBLE MANAGED BLOCK" + create: yes + mode: '0644' + content: | + # ~/.profile - POSIX compatible environment + + # Rust and cargo binaries + export PATH="$HOME/.cargo/bin:$HOME/.local/bin:$PATH" + + # XDG Base Directory + export XDG_CONFIG_HOME="$HOME/.config" + export XDG_DATA_HOME="$HOME/.local/share" + export XDG_CACHE_HOME="$HOME/.cache" + + export EDITOR="emacs -nw" + +- name: Setup zprofile for Zsh compatibility + copy: + dest: "{{ lookup('env', 'HOME') }}/.zprofile" + content: | + # ~/.zprofile - Sourced by Zsh for login shells + # Source .profile for POSIX-compatible environment + emulate sh -c 'source ~/.profile' + + # Initialize zoxide for smart cd + eval "$(zoxide init zsh)" + + # Initialize atuin for shell history + eval "$(atuin init zsh)" + owner: "{{ lookup('env', 'USER') }}" + mode: '0644' + +- name: Setup shell plugins in zshrc + blockinfile: + path: "{{ lookup('env', 'HOME') }}/.zshrc" + marker: "# {mark} ANSIBLE MANAGED BLOCK" + content: | + # Source .zprofile for login shell environment + [[ -f ~/.zprofile ]] && emulate sh -c 'source ~/.zprofile' diff --git a/roles/cs_student/tasks/main.yml b/roles/cs_student/tasks/main.yml new file mode 100644 index 0000000..434f541 --- /dev/null +++ b/roles/cs_student/tasks/main.yml @@ -0,0 +1,53 @@ +# tasks file for cs_student +- name: Install CS student tools + become: true + pacman: + name: + - neovim + - emacs + - python + - nodejs + - npm + - texlive-bin + - texlive-basic + - jupyter-nbconvert + - docker + - code + - github-cli + state: present + +- name: Install LazyVim + shell: | + [ -d ~/.config/lazyvim ] && rm -rf ~/.config/lazyvim + git clone https://github.com/LazyVim/starter ~/.config/lazyvim + rm -rf ~/.config/lazyvim/.git + args: + creates: ~/.config/lazyvim + +- name: Configure neovim to use LazyVim + shell: | + ln -sf ~/.config/lazyvim ~/.config/nvim + args: + creates: ~/.config/nvim + +- name: Install Spacemacs + shell: | + [ -d ~/.emacs.d ] && rm -rf ~/.emacs.d + git clone https://github.com/syl20bnr/spacemacs ~/.emacs.d -b develop + args: + creates: ~/.emacs.d + +- name: Setup shell aliases + lineinfile: + path: "{{ lookup('env', 'HOME') }}/.zshrc" + line: "{{ item }}" + create: yes + loop: + - alias ls='eza --icons --group-directories-first' + - alias ll='eza -la --icons --group-directories-first' + - alias cat='bat --style=auto' + - alias find='fd' + - alias top='btm' + - alias tre='broot --sizes' + - alias e='emacs -nw' + - alias vim='nvim' diff --git a/roles/ctf/tasks/main.yml b/roles/ctf/tasks/main.yml new file mode 100644 index 0000000..6c1d6ed --- /dev/null +++ b/roles/ctf/tasks/main.yml @@ -0,0 +1,11 @@ +# tasks file for ctf +- name: Install CTF tools (official repos) + become: true + pacman: + name: + - wireshark-qt + - nmap + - openbsd-netcat + - binwalk + - gobuster + state: present diff --git a/roles/devops/tasks/main.yml b/roles/devops/tasks/main.yml new file mode 100644 index 0000000..1dfdcd4 --- /dev/null +++ b/roles/devops/tasks/main.yml @@ -0,0 +1,24 @@ +# tasks file for devops +- name: Install DevOps tools + become: true + pacman: + name: + - docker + - kubectl + - terraform + - ansible + - helm + - k9s + - pulumi + - kubectx + state: present + +- name: Setup shell aliases + lineinfile: + path: "{{ lookup('env', 'HOME') }}/.zshrc" + line: "{{ item }}" + create: yes + loop: + - alias kc='kubectl' + - alias kctx='kubectx' + - alias kns='kubens' diff --git a/roles/dotfiles/tasks/main.yml b/roles/dotfiles/tasks/main.yml new file mode 100644 index 0000000..fb1f6f5 --- /dev/null +++ b/roles/dotfiles/tasks/main.yml @@ -0,0 +1,23 @@ +# tasks file for dotfiles +- name: Ensure stow is installed + become: true + pacman: + name: + - stow + state: present + +- name: Remove existing config files before stowing + shell: | + [ -L ~/.config/hypr/hyprland.conf ] || rm -f ~/.config/hypr/hyprland.conf + [ -L ~/.config/starship ] || rm -rf ~/.config/starship + [ -L ~/.config/zellij ] || rm -rf ~/.config/zellij + changed_when: false + +- name: Create symlinks with stow + shell: | + cd {{ lookup('env', 'HOME') }}/archsetup/dotfiles + stow -t ~ hypr starship zellij + args: + executable: /bin/bash + creates: "{{ lookup('env', 'HOME') }}/.config/starship" + chdir: "{{ lookup('env', 'HOME') }}/archsetup/dotfiles" diff --git a/roles/hyprland/tasks/main.yml b/roles/hyprland/tasks/main.yml new file mode 100644 index 0000000..b36828f --- /dev/null +++ b/roles/hyprland/tasks/main.yml @@ -0,0 +1,81 @@ +# tasks file for hyprland +- name: Install Hyprland and desktop components (official repos) + become: true + pacman: + name: + - waybar + - wofi + - kitty + - swaync + - fastfetch + - hyprpaper + - hyprlock + - pavucontrol + - brightnessctl + - playerctl + - grim + - wl-clipboard + - xdg-desktop-portal-hyprland + - zellij + - veracrypt + state: present + +- name: Install basic Linux tools + become: true + pacman: + name: + - fzf + - jq + - yq + - shellcheck + - dust + - ffmpeg + - sxiv + - pandoc + - p7zip + - entr + - less + - man + - texinfo + - which + - iw + - network-manager-applet + - udiskie + - ntfs-3g + state: present + +- name: Install Bluetooth support + become: true + pacman: + name: + - bluez + - bluez-utils + - bluedevil + state: present + +- name: Install printing support + become: true + pacman: + name: + - cups + - cups-pdf + - system-config-printer + state: present + +- name: Enable services + become: true + systemd: + name: "{{ item }}" + enabled: yes + loop: + - bluetooth + - cups + - docker + - udisks2 + +- name: Add user to docker group + become: true + user: + name: "{{ user }}" + groups: docker + append: yes diff --git a/site.yml b/site.yml new file mode 100644 index 0000000..6412d37 --- /dev/null +++ b/site.yml @@ -0,0 +1,15 @@ +--- +- hosts: localhost + connection: local + vars: + aur_helper: paru + user: "{{ ansible_user_id }}" + + roles: + - { role: common, tags: ['common'] } + - { role: dotfiles, tags: ['dotfiles'] } + - { role: cs_student, tags: ['cs_student'] } + - { role: devops, tags: ['devops'] } + - { role: ctf, tags: ['ctf'] } + - { role: hyprland, tags: ['hyprland'] } + - { role: ai, tags: ['ai'] }