Signed-off-by: Tuan-Dat Tran <tuan-dat.tran@tudattr.dev>
This commit is contained in:
Tuan-Dat Tran
2026-03-22 22:51:32 +01:00
commit 222062c1a4
17 changed files with 1154 additions and 0 deletions

18
ansible.cfg Normal file
View File

@@ -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

45
bootstrap.sh Executable file
View File

@@ -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."

View File

@@ -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
}

View File

@@ -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"

View File

@@ -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"

25
dotfiles/zsh/.zshrc Normal file
View File

@@ -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)

2
inventory.ini Normal file
View File

@@ -0,0 +1,2 @@
[localhost]
ansible_connection=local

4
requirements.yml Normal file
View File

@@ -0,0 +1,4 @@
---
collections:
- name: kewlfft.aur
version: 0.13.0

6
roles/ai/tasks/main.yaml Normal file
View File

@@ -0,0 +1,6 @@
# tasks file for ai
- name: Install AI development tools
pacman:
name:
- opencode
state: present

View File

@@ -0,0 +1,3 @@
- name: Update font cache
ansible.builtin.command: fc-cache -fv
changed_when: false

138
roles/common/tasks/main.yml Normal file
View File

@@ -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'

View File

@@ -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'

11
roles/ctf/tasks/main.yml Normal file
View File

@@ -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

View File

@@ -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'

View File

@@ -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"

View File

@@ -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

15
site.yml Normal file
View File

@@ -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'] }