chore: initial commit of all dotfiles, configs, and setup scripts
Includes modular setup, device profile support, and documentation. 🤖 Generated with [opencode](https://opencode.ai) Co-Authored-By: opencode <noreply@opencode.ai>
This commit is contained in:
parent
39687d0769
commit
7d13e6ff1c
6
.config/alacritty/alacritty.toml
Normal file
6
.config/alacritty/alacritty.toml
Normal file
@ -0,0 +1,6 @@
|
||||
[font]
|
||||
normal = { family = "JetBrainsMono", style = "Regular" }
|
||||
size = 12.0
|
||||
|
||||
[window]
|
||||
opacity = 0.95
|
||||
3
.config/hypr/README.md
Normal file
3
.config/hypr/README.md
Normal file
@ -0,0 +1,3 @@
|
||||
# Modular Hyprland Config
|
||||
|
||||
This directory contains a modular Hyprland configuration. Edit files in `includes/` to customize your setup.
|
||||
14
.config/hypr/hypridle.conf
Normal file
14
.config/hypr/hypridle.conf
Normal file
@ -0,0 +1,14 @@
|
||||
general {
|
||||
lock_cmd = pidof hyprlock || hyprlock
|
||||
before_sleep_cmd = loginctl lock-session
|
||||
after_sleep_cmd = hyprctl dispatch dpms on
|
||||
}
|
||||
|
||||
listener {
|
||||
timeout = 300
|
||||
on-timeout = pidof hyprlock || hyprlock
|
||||
}
|
||||
listener {
|
||||
timeout = 600
|
||||
on-timeout = systemctl suspend
|
||||
}
|
||||
12
.config/hypr/hyprland.conf
Normal file
12
.config/hypr/hyprland.conf
Normal file
@ -0,0 +1,12 @@
|
||||
# Main Hyprland config (modular)
|
||||
|
||||
# Source modular configs
|
||||
source = ~/.config/hypr/includes/programs.conf
|
||||
source = ~/.config/hypr/includes/monitors.conf
|
||||
source = ~/.config/hypr/includes/input.conf
|
||||
source = ~/.config/hypr/includes/env.conf
|
||||
source = ~/.config/hypr/includes/autostart.conf
|
||||
source = ~/.config/hypr/includes/binds.conf
|
||||
source = ~/.config/hypr/includes/appearance.conf
|
||||
|
||||
# You can add more includes as needed
|
||||
68
.config/hypr/hyprlock.conf
Normal file
68
.config/hypr/hyprlock.conf
Normal file
@ -0,0 +1,68 @@
|
||||
general {
|
||||
disable_loading_bar = true
|
||||
grace = 300
|
||||
hide_cursor = true
|
||||
no_fade_in = false
|
||||
}
|
||||
|
||||
background {
|
||||
monitor =
|
||||
path = screenshot
|
||||
blur_passes = 3
|
||||
blur_size = 8
|
||||
}
|
||||
|
||||
input-field {
|
||||
monitor =
|
||||
size = 200, 50
|
||||
position = 0, -80
|
||||
dots_center = true
|
||||
fade_on_empty = false
|
||||
font_color = rgb(202, 211, 245)
|
||||
inner_color = rgb(91, 96, 120)
|
||||
outer_color = rgb(24, 25, 38)
|
||||
outline_thickness = 5
|
||||
placeholder_text = <i>Input Password...</i>
|
||||
shadow_passes = 2
|
||||
}
|
||||
|
||||
label {
|
||||
monitor =
|
||||
text = cmd[update:1000] echo "$TIME"
|
||||
color = rgb(200, 200, 200)
|
||||
font_size = 55
|
||||
font_family = Noto Sans
|
||||
position = -40, 40
|
||||
halign = right
|
||||
valign = bottom
|
||||
shadow_passes = 5
|
||||
shadow_size = 10
|
||||
}
|
||||
|
||||
label {
|
||||
monitor =
|
||||
text = $USER
|
||||
color = rgb(200, 200, 200)
|
||||
font_size = 20
|
||||
font_family = Noto Sans
|
||||
position = -100, 160
|
||||
halign = right
|
||||
valign = bottom
|
||||
shadow_passes = 5
|
||||
shadow_size = 10
|
||||
}
|
||||
|
||||
image {
|
||||
monitor =
|
||||
path = ~/.face
|
||||
size = 280
|
||||
rounding = -1
|
||||
border_size = 4
|
||||
border_color = rgb(221, 221, 221)
|
||||
rotate = 0
|
||||
reload_time = -1
|
||||
reload_cmd =
|
||||
position = 0, 200
|
||||
halign = center
|
||||
valign = center
|
||||
}
|
||||
118
.config/hypr/includes/appearance.conf
Normal file
118
.config/hypr/includes/appearance.conf
Normal file
@ -0,0 +1,118 @@
|
||||
#####################
|
||||
### LOOK AND FEEL ###
|
||||
#####################
|
||||
|
||||
# Refer to https://wiki.hyprland.org/Configuring/Variables/
|
||||
|
||||
# https://wiki.hyprland.org/Configuring/Variables/#general
|
||||
|
||||
env = XCURSOR_SIZE,36
|
||||
env = HYPRCURSOR_SIZE,36
|
||||
env = HYPRCURSOR_THEME,rose-pine-hyprcursor
|
||||
|
||||
env = QT_QPA_PLATFORMTHEME,qt6ct # for Qt apps
|
||||
exec = gsettings set org.gnome.desktop.interface gtk-theme "Breeze-Dark" # for GTK3 apps
|
||||
exec = gsettings set org.gnome.desktop.interface color-scheme "prefer-dark" # for GTK4 apps
|
||||
|
||||
general {
|
||||
gaps_in = 2
|
||||
gaps_out = 5
|
||||
|
||||
border_size = 2
|
||||
|
||||
# https://wiki.hyprland.org/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.hyprland.org/Configuring/Tearing/ before you turn this on
|
||||
allow_tearing = false
|
||||
|
||||
layout = dwindle
|
||||
}
|
||||
|
||||
# https://wiki.hyprland.org/Configuring/Variables/#decoration
|
||||
decoration {
|
||||
rounding = 5
|
||||
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.hyprland.org/Configuring/Variables/#blur
|
||||
blur {
|
||||
enabled = true
|
||||
size = 3
|
||||
passes = 1
|
||||
|
||||
vibrancy = 0.1696
|
||||
}
|
||||
}
|
||||
|
||||
# https://wiki.hyprland.org/Configuring/Variables/#animations
|
||||
animations {
|
||||
enabled = yes, please :)
|
||||
|
||||
# Default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more
|
||||
|
||||
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.0
|
||||
bezier = quick,0.15,0,0.1,1
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
# Ref https://wiki.hyprland.org/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
|
||||
windowrulev2 = bordersize 0, floating:0, onworkspace:w[tv1]
|
||||
windowrulev2 = rounding 0, floating:0, onworkspace:w[tv1]
|
||||
windowrulev2 = bordersize 0, floating:0, onworkspace:f[1]
|
||||
windowrulev2 = rounding 0, floating:0, onworkspace:f[1]
|
||||
|
||||
# See https://wiki.hyprland.org/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.hyprland.org/Configuring/Master-Layout/ for more
|
||||
master {
|
||||
new_status = master
|
||||
}
|
||||
|
||||
# https://wiki.hyprland.org/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. :(
|
||||
}
|
||||
|
||||
12
.config/hypr/includes/autostart.conf
Normal file
12
.config/hypr/includes/autostart.conf
Normal file
@ -0,0 +1,12 @@
|
||||
# Autostart applications
|
||||
exec-once = waybar &
|
||||
exec-once = mako &
|
||||
exec-once = wl-clipboard-history -t &
|
||||
exec-once = wlogout &
|
||||
exec-once = rofi-wayland &
|
||||
# exec-once = hyprpaper &
|
||||
|
||||
exec-once = hypridle &
|
||||
|
||||
# Start Brave browser on Hyprland startup
|
||||
exec-once = brave &
|
||||
84
.config/hypr/includes/binds.conf
Normal file
84
.config/hypr/includes/binds.conf
Normal file
@ -0,0 +1,84 @@
|
||||
###################
|
||||
### KEYBINDINGS ###
|
||||
###################
|
||||
|
||||
# See https://wiki.hyprland.org/Configuring/Keywords/
|
||||
$mainMod = SUPER # Sets "Windows" key as main modifier
|
||||
|
||||
# Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more
|
||||
bind = $mainMod, Q, exec, $terminal
|
||||
bind = $mainMod, C, killactive,
|
||||
bind = $mainMod, M, exit,
|
||||
bind = $mainMod, E, exec, $fileManager
|
||||
bind = $mainMod CTRL, B, exec, google-chrome-stable
|
||||
bind = $mainMod, B, exec, firefox
|
||||
bind = $mainMod SHIFT, B, exec, brave
|
||||
bind = $mainMod, V, togglefloating,
|
||||
bind = $mainMod, R, exec, $menu
|
||||
bind = $mainMod, P, pseudo, # dwindle
|
||||
bind = $mainMod, J, togglesplit, # dwindle
|
||||
bind = $mainMod SHIFT, P, exec, ~/.config/hypr/reway.sh
|
||||
bind = $mainMod, L, exec, hyprlock
|
||||
|
||||
# Move focus with mainMod + arrow keys
|
||||
bind = $mainMod, left, movefocus, l
|
||||
bind = $mainMod, right, movefocus, r
|
||||
bind = $mainMod, up, movefocus, u
|
||||
bind = $mainMod, down, movefocus, d
|
||||
|
||||
bind = $mainMod SHIFT, left, swapwindow, l
|
||||
bind = $mainMod SHIFT, right, swapwindow, r
|
||||
bind = $mainMod SHIFT, up, swapwindow, u
|
||||
bind = $mainMod SHIFT, down, swapwindow, 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 @DEFAULT_AUDIO_SINK@ 1%+
|
||||
bindel = ,XF86AudioRaiseVolume, exec, ~/.local/bin/wp-vol
|
||||
bindel = ,XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 1%-
|
||||
bindel = ,XF86AudioLowerVolume, exec, ~/.local/bin/wp-vol
|
||||
bindel = ,XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
|
||||
bindel = ,XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle
|
||||
bindel = ,XF86MonBrightnessUp, exec, brightnessctl s 10%+
|
||||
bindel = ,XF86MonBrightnessDown, exec, brightnessctl s 10%-
|
||||
|
||||
# Requires playerctl
|
||||
bindl = , XF86AudioNext, exec, playerctl next
|
||||
bindl = , XF86AudioPause, exec, playerctl play-pause
|
||||
bindl = , XF86AudioPlay, exec, playerctl play-pause
|
||||
bindl = , XF86AudioPrev, exec, playerctl previous
|
||||
3
.config/hypr/includes/env.conf
Normal file
3
.config/hypr/includes/env.conf
Normal file
@ -0,0 +1,3 @@
|
||||
# Environment variables
|
||||
env = XCURSOR_SIZE,24
|
||||
env = QT_QPA_PLATFORM,wayland
|
||||
0
.config/hypr/includes/hypridle.conf
Normal file
0
.config/hypr/includes/hypridle.conf
Normal file
21
.config/hypr/includes/input-desktop.conf
Normal file
21
.config/hypr/includes/input-desktop.conf
Normal file
@ -0,0 +1,21 @@
|
||||
# Input configuration (desktop)
|
||||
input {
|
||||
kb_layout = de
|
||||
kb_variant = nodeadkeys
|
||||
kb_model =
|
||||
kb_options = caps:escape
|
||||
kb_rules =
|
||||
numlock_by_default = true
|
||||
|
||||
follow_mouse = 1
|
||||
|
||||
sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
|
||||
}
|
||||
|
||||
# Gestures configuration
|
||||
gestures {
|
||||
workspace_swipe = true
|
||||
workspace_swipe_fingers = 4
|
||||
workspace_swipe_distance = 300
|
||||
workspace_swipe_invert = false
|
||||
}
|
||||
28
.config/hypr/includes/input-laptop.conf
Normal file
28
.config/hypr/includes/input-laptop.conf
Normal file
@ -0,0 +1,28 @@
|
||||
# Input configuration (laptop)
|
||||
input {
|
||||
kb_layout = de
|
||||
kb_variant = nodeadkeys
|
||||
kb_model =
|
||||
kb_options = caps:escape
|
||||
kb_rules =
|
||||
numlock_by_default = true
|
||||
|
||||
follow_mouse = 1
|
||||
|
||||
sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
|
||||
|
||||
touchpad {
|
||||
natural_scroll = yes
|
||||
tap-to-click = yes
|
||||
disable_while_typing = yes
|
||||
clickfinger_behavior = yes
|
||||
}
|
||||
}
|
||||
|
||||
# Gestures configuration
|
||||
gestures {
|
||||
workspace_swipe = true
|
||||
workspace_swipe_fingers = 4
|
||||
workspace_swipe_distance = 300
|
||||
workspace_swipe_invert = false
|
||||
}
|
||||
28
.config/hypr/includes/input.conf
Normal file
28
.config/hypr/includes/input.conf
Normal file
@ -0,0 +1,28 @@
|
||||
# Input configuration
|
||||
input {
|
||||
kb_layout = de
|
||||
kb_variant = nodeadkeys
|
||||
kb_model =
|
||||
kb_options = caps:escape
|
||||
kb_rules =
|
||||
numlock_by_default = true
|
||||
|
||||
follow_mouse = 1
|
||||
|
||||
sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
|
||||
|
||||
touchpad {
|
||||
natural_scroll = yes
|
||||
tap-to-click = yes
|
||||
disable_while_typing = yes
|
||||
clickfinger_behavior = yes
|
||||
}
|
||||
}
|
||||
|
||||
# Gestures configuration
|
||||
gestures {
|
||||
workspace_swipe = true
|
||||
workspace_swipe_fingers = 4
|
||||
workspace_swipe_distance = 300
|
||||
workspace_swipe_invert = false
|
||||
}
|
||||
13
.config/hypr/includes/monitors-desktop.conf
Normal file
13
.config/hypr/includes/monitors-desktop.conf
Normal file
@ -0,0 +1,13 @@
|
||||
# Monitor configuration (desktop)
|
||||
monitor=DP-1,preferred,auto,1
|
||||
|
||||
# Workspace assignments
|
||||
workspace=1,monitor:DP-1
|
||||
workspace=2,monitor:DP-1
|
||||
workspace=3,monitor:DP-1
|
||||
workspace=4,monitor:DP-1
|
||||
workspace=5,monitor:DP-1
|
||||
workspace=6,monitor:DP-1
|
||||
workspace=7,monitor:DP-1
|
||||
workspace=8,monitor:DP-1
|
||||
workspace=9,monitor:DP-1
|
||||
15
.config/hypr/includes/monitors-laptop.conf
Normal file
15
.config/hypr/includes/monitors-laptop.conf
Normal file
@ -0,0 +1,15 @@
|
||||
# Monitor configuration (laptop)
|
||||
monitor=eDP-1,preferred,auto,1
|
||||
monitor=DP-1,preferred,auto,1
|
||||
|
||||
# Workspace assignments
|
||||
workspace=10,monitor:eDP-1
|
||||
workspace=1,monitor:DP-1
|
||||
workspace=2,monitor:DP-1
|
||||
workspace=3,monitor:DP-1
|
||||
workspace=4,monitor:DP-1
|
||||
workspace=5,monitor:DP-1
|
||||
workspace=6,monitor:DP-1
|
||||
workspace=7,monitor:DP-1
|
||||
workspace=8,monitor:DP-1
|
||||
workspace=9,monitor:DP-1
|
||||
16
.config/hypr/includes/monitors.conf
Normal file
16
.config/hypr/includes/monitors.conf
Normal file
@ -0,0 +1,16 @@
|
||||
# Monitor configuration
|
||||
# Assign workspace 1 to laptop (eDP-1), others to external (DP-1)
|
||||
monitor=eDP-1,preferred,auto,1
|
||||
monitor=DP-1,preferred,auto,1
|
||||
|
||||
# Workspace assignments
|
||||
workspace=10,monitor:eDP-1
|
||||
workspace=1,monitor:DP-1
|
||||
workspace=2,monitor:DP-1
|
||||
workspace=3,monitor:DP-1
|
||||
workspace=4,monitor:DP-1
|
||||
workspace=5,monitor:DP-1
|
||||
workspace=6,monitor:DP-1
|
||||
workspace=7,monitor:DP-1
|
||||
workspace=8,monitor:DP-1
|
||||
workspace=9,monitor:DP-1
|
||||
7
.config/hypr/includes/programs.conf
Normal file
7
.config/hypr/includes/programs.conf
Normal file
@ -0,0 +1,7 @@
|
||||
# Set programs that you use
|
||||
$terminal = alacritty
|
||||
$fileManager = dolphin
|
||||
$menu = rofi -show combi
|
||||
|
||||
# Always move Brave browser to workspace 10
|
||||
windowrulev2 = workspace 10, class:^(Brave-browser)$
|
||||
19
.config/mako/config
Normal file
19
.config/mako/config
Normal file
@ -0,0 +1,19 @@
|
||||
font=JetBrainsMono 12
|
||||
background-color=#1e1e2e
|
||||
text-color=#cdd6f4
|
||||
border-color=#89b4fa
|
||||
border-size=2
|
||||
|
||||
|
||||
# Default: notifications at the top right
|
||||
anchor=top-right
|
||||
margin=20,20,0,0
|
||||
|
||||
# Default notification timeout (ms)
|
||||
default-timeout=3000
|
||||
|
||||
# Shorter timeout and bottom center for volume notifications
|
||||
[app-name=Volume]
|
||||
anchor=bottom-center
|
||||
margin=0,0,40,0
|
||||
default-timeout=1200
|
||||
7
.config/rofi/config.rasi
Normal file
7
.config/rofi/config.rasi
Normal file
@ -0,0 +1,7 @@
|
||||
configuration {
|
||||
font: "JetBrainsMono 12";
|
||||
location: 0;
|
||||
width: 30;
|
||||
lines: 10;
|
||||
columns: 1;
|
||||
}
|
||||
61
.config/tmux/tmux.conf
Normal file
61
.config/tmux/tmux.conf
Normal file
@ -0,0 +1,61 @@
|
||||
# Set prefix to Ctrl-a
|
||||
set -g prefix C-a
|
||||
unbind C-b
|
||||
bind C-a send-prefix
|
||||
|
||||
# Enable mouse support
|
||||
set -g mouse on
|
||||
|
||||
# Set 256 color mode
|
||||
set -g default-terminal "tmux-256color"
|
||||
set-option -ga terminal-overrides ",*:Tc"
|
||||
|
||||
# Vi mode for copy mode
|
||||
setw -g mode-keys vi
|
||||
|
||||
# Split panes
|
||||
bind | split-window -h
|
||||
bind - split-window -v
|
||||
|
||||
# Reload config
|
||||
bind r source-file ~/.config/tmux/tmux.conf \; display-message "Config reloaded!"
|
||||
|
||||
# --- Modern and simple status bar ---
|
||||
set -g status-bg colour236
|
||||
set -g status-fg colour250
|
||||
set -g status-style "bg=colour236,fg=colour250"
|
||||
set -g status-left-length 40
|
||||
set -g status-right-length 100
|
||||
set -g status-left '#[fg=colour33,bg=colour236,bold] #S #[fg=colour250,bg=colour236,nobold]|'
|
||||
set -g status-right '#[fg=colour250,bg=colour236,nobold]| #[fg=colour33,bg=colour236]#(date +"%a %d %b %Y") %H:%M #[fg=colour250,bg=colour236,nobold]| #[fg=colour33]#(whoami)@#H'
|
||||
|
||||
# Clean window titles
|
||||
setw -g window-status-format ' #[fg=colour250,bg=colour236]#I:#W#{?window_flags,#[fg=colour208]#{window_flags},} '
|
||||
setw -g window-status-current-format ' #[fg=colour234,bg=colour33]#I:#W#{?window_flags,#[fg=colour208]#{window_flags},} '
|
||||
setw -g window-status-separator ''
|
||||
setw -g window-status-style "bg=colour236,fg=colour250"
|
||||
setw -g window-status-current-style "bg=colour33,fg=colour234"
|
||||
|
||||
# Pane border
|
||||
set -g pane-border-style fg=colour238
|
||||
set -g pane-active-border-style fg=colour39
|
||||
|
||||
# Message styling
|
||||
set -g message-style bg=colour234,fg=colour39
|
||||
set -g message-command-style bg=colour234,fg=colour208
|
||||
|
||||
# Command prompt styling
|
||||
|
||||
# Bell
|
||||
set -g visual-bell on
|
||||
set -g bell-action any
|
||||
|
||||
# Allow faster command sequences
|
||||
set -s escape-time 0
|
||||
|
||||
# Clipboard integration (requires xclip or wl-clipboard)
|
||||
bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "xclip -selection clipboard -in"
|
||||
|
||||
# Start window numbering at 1
|
||||
set -g base-index 1
|
||||
setw -g pane-base-index 1
|
||||
82
.config/waybar/config
Normal file
82
.config/waybar/config
Normal file
@ -0,0 +1,82 @@
|
||||
{
|
||||
"layer": "top",
|
||||
"position": "top",
|
||||
"modules-left": ["hyprland/workspaces"],
|
||||
"modules-center": ["clock"],
|
||||
"modules-right": ["idle_inhibitor", "backlight", "cpu", "memory", "disk", "temperature", "pulseaudio", "network", "battery", "tray"],
|
||||
"hyprland/workspaces": {
|
||||
"format": "{icon}",
|
||||
"on-click": "activate",
|
||||
"on-scroll-up": "hyprctl dispatch workspace e-1",
|
||||
"on-scroll-down": "hyprctl dispatch workspace e+1",
|
||||
"all-outputs": true,
|
||||
"persistent-workspaces": {
|
||||
"*": [1,2,3,4,5,6,7,8,9]
|
||||
}
|
||||
},
|
||||
"clock": {
|
||||
"format": "{:%a %d.%m %H:%M}",
|
||||
"tooltip-format": "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>",
|
||||
"format-alt": "{:%Y-%m-%d}"
|
||||
},
|
||||
"cpu": {
|
||||
"format": " {usage}%"
|
||||
},
|
||||
"memory": {
|
||||
"format": " {used}G/{total}G"
|
||||
},
|
||||
"temperature": {
|
||||
"critical-threshold": 80,
|
||||
"format": " {temperatureC}°C"
|
||||
},
|
||||
"backlight": {
|
||||
"device": "intel_backlight",
|
||||
"format": " {percent}%"
|
||||
},
|
||||
"disk": {
|
||||
"format": " {free} free",
|
||||
"path": "/"
|
||||
},
|
||||
"idle_inhibitor": {
|
||||
"format": " {status}",
|
||||
"format-alt": " {status}"
|
||||
},
|
||||
"network": {
|
||||
"format-wifi": " {essid} ({signalStrength}%)",
|
||||
"format-ethernet": " {ipaddr}/{cidr}",
|
||||
"format-linked": " {ifname} (No IP)",
|
||||
"format-disconnected": " Disconnected",
|
||||
"format-alt": "{ifname}: {ipaddr}/{cidr}",
|
||||
"tooltip-format": "{ifname} via {gwaddr}",
|
||||
"tooltip-format-wifi": " {essid} ({signalStrength}%)\n{ifname}: {ipaddr}/{cidr}\nGateway: {gwaddr}",
|
||||
"tooltip-format-ethernet": " {ifname}: {ipaddr}/{cidr}\nGateway: {gwaddr}",
|
||||
"on-click": "nm-connection-editor"
|
||||
},
|
||||
"pulseaudio": {
|
||||
"format": "{icon} {volume}%",
|
||||
"format-muted": " Muted",
|
||||
"format-icons": {
|
||||
"headphone": "",
|
||||
"hands-free": "",
|
||||
"headset": "",
|
||||
"phone": "",
|
||||
"portable": "",
|
||||
"car": "",
|
||||
"default": ["", "", ""]
|
||||
},
|
||||
"on-click": "pavucontrol"
|
||||
},
|
||||
"battery": {
|
||||
"states": {
|
||||
"warning": 30,
|
||||
"critical": 15
|
||||
},
|
||||
"format": "{icon} {capacity}%",
|
||||
"format-charging": " {capacity}% ({time})",
|
||||
"format-plugged": " {capacity}%",
|
||||
"format-alt": "{icon} {capacity}% • {power:.1f}W • {time}",
|
||||
"format-time": "{H}h {M}m",
|
||||
"tooltip-format": "{capacity}% • {power:.1f}W\n{timeTo}",
|
||||
"format-icons": ["", "", "", "", "", "", "", "", "", "", ""]
|
||||
}
|
||||
}
|
||||
63
.config/waybar/config-desktop
Normal file
63
.config/waybar/config-desktop
Normal file
@ -0,0 +1,63 @@
|
||||
{
|
||||
"layer": "top",
|
||||
"position": "top",
|
||||
"modules-left": ["hyprland/workspaces"],
|
||||
"modules-center": ["clock"],
|
||||
"modules-right": ["idle_inhibitor", "cpu", "memory", "disk", "temperature", "pulseaudio", "network", "tray"],
|
||||
"hyprland/workspaces": {
|
||||
"format": "{icon}",
|
||||
"on-click": "activate",
|
||||
"on-scroll-up": "hyprctl dispatch workspace e-1",
|
||||
"on-scroll-down": "hyprctl dispatch workspace e+1",
|
||||
"all-outputs": true,
|
||||
"persistent-workspaces": {
|
||||
"*": [1,2,3,4,5,6,7,8,9]
|
||||
}
|
||||
},
|
||||
"clock": {
|
||||
"format": "{:%a %d.%m %H:%M}",
|
||||
"tooltip-format": "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>",
|
||||
"format-alt": "{:%Y-%m-%d}"
|
||||
},
|
||||
"cpu": {
|
||||
"format": " {usage}%"
|
||||
},
|
||||
"memory": {
|
||||
"format": " {used}G/{total}G"
|
||||
},
|
||||
"temperature": {
|
||||
"critical-threshold": 80,
|
||||
"format": " {temperatureC}°C"
|
||||
},
|
||||
"disk": {
|
||||
"format": " {free} free",
|
||||
"path": "/"
|
||||
},
|
||||
"idle_inhibitor": {
|
||||
"format": " {status}",
|
||||
"format-alt": " {status}"
|
||||
},
|
||||
"network": {
|
||||
"format-ethernet": " {ipaddr}/{cidr}",
|
||||
"format-linked": " {ifname} (No IP)",
|
||||
"format-disconnected": " Disconnected",
|
||||
"format-alt": "{ifname}: {ipaddr}/{cidr}",
|
||||
"tooltip-format": "{ifname} via {gwaddr}",
|
||||
"tooltip-format-ethernet": " {ifname}: {ipaddr}/{cidr}\nGateway: {gwaddr}",
|
||||
"on-click": "nm-connection-editor"
|
||||
},
|
||||
"pulseaudio": {
|
||||
"format": "{icon} {volume}%",
|
||||
"format-muted": " Muted",
|
||||
"format-icons": {
|
||||
"headphone": "",
|
||||
"hands-free": "",
|
||||
"headset": "",
|
||||
"phone": "",
|
||||
"portable": "",
|
||||
"car": "",
|
||||
"default": ["", "", ""]
|
||||
},
|
||||
"on-click": "pavucontrol"
|
||||
}
|
||||
}
|
||||
82
.config/waybar/config-laptop
Normal file
82
.config/waybar/config-laptop
Normal file
@ -0,0 +1,82 @@
|
||||
{
|
||||
"layer": "top",
|
||||
"position": "top",
|
||||
"modules-left": ["hyprland/workspaces"],
|
||||
"modules-center": ["clock"],
|
||||
"modules-right": ["idle_inhibitor", "backlight", "cpu", "memory", "disk", "temperature", "pulseaudio", "network", "battery", "tray"],
|
||||
"hyprland/workspaces": {
|
||||
"format": "{icon}",
|
||||
"on-click": "activate",
|
||||
"on-scroll-up": "hyprctl dispatch workspace e-1",
|
||||
"on-scroll-down": "hyprctl dispatch workspace e+1",
|
||||
"all-outputs": true,
|
||||
"persistent-workspaces": {
|
||||
"*": [1,2,3,4,5,6,7,8,9]
|
||||
}
|
||||
},
|
||||
"clock": {
|
||||
"format": "{:%a %d.%m %H:%M}",
|
||||
"tooltip-format": "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>",
|
||||
"format-alt": "{:%Y-%m-%d}"
|
||||
},
|
||||
"cpu": {
|
||||
"format": " {usage}%"
|
||||
},
|
||||
"memory": {
|
||||
"format": " {used}G/{total}G"
|
||||
},
|
||||
"temperature": {
|
||||
"critical-threshold": 80,
|
||||
"format": " {temperatureC}°C"
|
||||
},
|
||||
"backlight": {
|
||||
"device": "intel_backlight",
|
||||
"format": " {percent}%"
|
||||
},
|
||||
"disk": {
|
||||
"format": " {free} free",
|
||||
"path": "/"
|
||||
},
|
||||
"idle_inhibitor": {
|
||||
"format": " {status}",
|
||||
"format-alt": " {status}"
|
||||
},
|
||||
"network": {
|
||||
"format-wifi": " {essid} ({signalStrength}%)",
|
||||
"format-ethernet": " {ipaddr}/{cidr}",
|
||||
"format-linked": " {ifname} (No IP)",
|
||||
"format-disconnected": " Disconnected",
|
||||
"format-alt": "{ifname}: {ipaddr}/{cidr}",
|
||||
"tooltip-format": "{ifname} via {gwaddr}",
|
||||
"tooltip-format-wifi": " {essid} ({signalStrength}%)\n{ifname}: {ipaddr}/{cidr}\nGateway: {gwaddr}",
|
||||
"tooltip-format-ethernet": " {ifname}: {ipaddr}/{cidr}\nGateway: {gwaddr}",
|
||||
"on-click": "nm-connection-editor"
|
||||
},
|
||||
"pulseaudio": {
|
||||
"format": "{icon} {volume}%",
|
||||
"format-muted": " Muted",
|
||||
"format-icons": {
|
||||
"headphone": "",
|
||||
"hands-free": "",
|
||||
"headset": "",
|
||||
"phone": "",
|
||||
"portable": "",
|
||||
"car": "",
|
||||
"default": ["", "", ""]
|
||||
},
|
||||
"on-click": "pavucontrol"
|
||||
},
|
||||
"battery": {
|
||||
"states": {
|
||||
"warning": 30,
|
||||
"critical": 15
|
||||
},
|
||||
"format": "{icon} {capacity}%",
|
||||
"format-charging": " {capacity}% ({time})",
|
||||
"format-plugged": " {capacity}%",
|
||||
"format-alt": "{icon} {capacity}% • {power:.1f}W • {time}",
|
||||
"format-time": "{H}h {M}m",
|
||||
"tooltip-format": "{capacity}% • {power:.1f}W\n{timeTo}",
|
||||
"format-icons": ["", "", "", "", "", "", "", "", "", "", ""]
|
||||
}
|
||||
}
|
||||
48
.config/waybar/style.css
Normal file
48
.config/waybar/style.css
Normal file
@ -0,0 +1,48 @@
|
||||
* {
|
||||
font-family: JetBrainsMono, monospace;
|
||||
font-size: 13px;
|
||||
border: none;
|
||||
box-shadow: none;
|
||||
min-height: 0;
|
||||
}
|
||||
|
||||
window#waybar {
|
||||
background: rgba(30, 30, 46, 0.95);
|
||||
border-radius: 10px;
|
||||
color: #cdd6f4;
|
||||
border: 1px solid #181825;
|
||||
margin: 6px 6px 0 6px;
|
||||
}
|
||||
|
||||
#workspaces button {
|
||||
background: transparent;
|
||||
color: #a6adc8;
|
||||
border-radius: 6px;
|
||||
margin: 0 2px;
|
||||
padding: 0 8px;
|
||||
transition: background 0.2s, color 0.2s;
|
||||
}
|
||||
#workspaces button.active {
|
||||
background: #89b4fa;
|
||||
color: #1e1e2e;
|
||||
}
|
||||
#workspaces button.urgent {
|
||||
background: #f38ba8;
|
||||
color: #1e1e2e;
|
||||
}
|
||||
|
||||
#clock, #cpu, #memory, #temperature, #pulseaudio, #network, #battery, #tray, #backlight, #disk, #idle_inhibitor {
|
||||
padding: 0 10px;
|
||||
margin: 0 2px;
|
||||
border-radius: 6px;
|
||||
background: rgba(49, 50, 68, 0.7);
|
||||
}
|
||||
#battery.charging {
|
||||
color: #a6e3a1;
|
||||
}
|
||||
#battery.critical {
|
||||
color: #f38ba8;
|
||||
}
|
||||
#pulseaudio.muted {
|
||||
color: #f9e2af;
|
||||
}
|
||||
4
.config/wlogout/layout
Normal file
4
.config/wlogout/layout
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"label": "Logout",
|
||||
"command": "loginctl terminate-user $USER"
|
||||
}
|
||||
46
.github/copilot-instructions.md
vendored
Normal file
46
.github/copilot-instructions.md
vendored
Normal file
@ -0,0 +1,46 @@
|
||||
|
||||
# Copilot Instructions for This Dotfiles Project
|
||||
|
||||
## Project Overview
|
||||
- This is a modular dotfiles and desktop setup for Arch Linux, focused on Wayland/Hyprland workflows.
|
||||
- All package management is done with `paru` (AUR helper). Do not use `pacman` or other helpers.
|
||||
- Dotfiles and app configs are version-controlled in the repo root and `.config/` directory, then symlinked to `$HOME` and `$HOME/.config`.
|
||||
- The setup is fully modular: each major component (packages, symlinks, shell, Neovim, Hyprland, sound, etc.) is handled by its own script in `modules/`.
|
||||
|
||||
## Architecture & Workflow
|
||||
- The main entrypoint is `setup.sh`, which finds and runs all numbered scripts in `modules/` in sorted order.
|
||||
- Each module script is responsible for a single concern (e.g., `01-packages.sh` for package install, `05-hyprland.sh` for Hyprland/Wayland packages, etc.).
|
||||
- The symlinking logic (`02-symlinks.sh`) links all dotfiles (including `.config/`) from the repo to the home directory, so configs are always up to date and versioned.
|
||||
- App configs (Hyprland, Waybar, etc.) are stored in `.config/` and should be modular and extensible (e.g., Hyprland uses `includes/` for config fragments).
|
||||
|
||||
## Key Conventions
|
||||
- Always add new packages to the appropriate module script (e.g., Hyprland-related to `05-hyprland.sh`, sound to `06-sound.sh`).
|
||||
- To add new dotfiles, place them in the repo root (for files like `.zshrc`) or in `.config/` for app configs.
|
||||
- To add new setup logic, create a new numbered module in `modules/` (e.g., `07-myfeature.sh`).
|
||||
- All scripts must be idempotent and safe to re-run.
|
||||
- Use only `paru` for package installation.
|
||||
|
||||
## Examples
|
||||
- To add a new app config (e.g., for `kitty`):
|
||||
1. Place config files in `.config/kitty/` in the repo.
|
||||
2. The symlink module will link them to `$HOME/.config/kitty` on setup.
|
||||
- To add a new package:
|
||||
1. Edit the appropriate `modules/XX-*.sh` script and add the package to the array.
|
||||
2. Re-run `setup.sh`.
|
||||
- To add a new setup step:
|
||||
1. Create `modules/07-myfeature.sh` and make it executable.
|
||||
2. It will be picked up automatically by `setup.sh`.
|
||||
|
||||
## Integration Points
|
||||
- Hyprland, Waybar, Rofi, Mako, Alacritty, wlogout, and sound are all integrated and configured via `.config/`.
|
||||
- Neovim is set up with AstroNvim by default.
|
||||
- Sound is managed with PipeWire, WirePlumber, and related tools.
|
||||
|
||||
## Notable Patterns
|
||||
- All configuration is declarative and modular. Avoid hardcoding paths; use `$HOME` and relative repo paths.
|
||||
- Avoid duplicating logic between modules; each should have a single responsibility.
|
||||
|
||||
## See Also
|
||||
- `README.md` for user-facing setup and customization instructions.
|
||||
- `modules/` for all setup logic.
|
||||
- `.config/` for all app configs.
|
||||
11
.local/bin/wp-vol
Normal file
11
.local/bin/wp-vol
Normal file
@ -0,0 +1,11 @@
|
||||
#!/bin/bash
|
||||
# Show current volume in a Mako notification using wpctl
|
||||
|
||||
# Get current volume as a percentage
|
||||
VOLUME=$(wpctl get-volume @DEFAULT_AUDIO_SINK@ | awk '{printf "%d", $2 * 100}')
|
||||
|
||||
# Get mute status
|
||||
MUTED=$(wpctl get-volume @DEFAULT_AUDIO_SINK@ | grep -q MUTED && echo " (muted)" || echo "")
|
||||
|
||||
# Show notification
|
||||
notify-send -a Volume -h string:x-canonical-private-synchronous:volume -u low "Volume: $VOLUME%$MUTED"
|
||||
12
.vscode/tasks.json
vendored
Normal file
12
.vscode/tasks.json
vendored
Normal file
@ -0,0 +1,12 @@
|
||||
{
|
||||
"version": "2.0.0",
|
||||
"tasks": [
|
||||
{
|
||||
"label": "Run dotfiles setup script",
|
||||
"type": "shell",
|
||||
"command": "chmod +x ./setup.sh && ./setup.sh",
|
||||
"problemMatcher": [],
|
||||
"group": "build"
|
||||
}
|
||||
]
|
||||
}
|
||||
88
.zshrc
Normal file
88
.zshrc
Normal file
@ -0,0 +1,88 @@
|
||||
# =====================
|
||||
# Environment settings
|
||||
# =====================
|
||||
|
||||
# Do Not Track for CLI tools
|
||||
export DO_NOT_TRACK=1
|
||||
|
||||
# Preferred editor
|
||||
export EDITOR='nvim'
|
||||
|
||||
|
||||
# =====================
|
||||
# Prompt and UI
|
||||
# =====================
|
||||
|
||||
# Starship prompt (modern, fast, customizable)
|
||||
eval "$(starship init zsh)"
|
||||
|
||||
|
||||
# =====================
|
||||
# fzf integration
|
||||
# =====================
|
||||
|
||||
# fzf key bindings and completion
|
||||
if [ -f /usr/share/fzf/key-bindings.zsh ]; then
|
||||
source /usr/share/fzf/key-bindings.zsh
|
||||
fi
|
||||
if [ -f /usr/share/fzf/completion.zsh ]; then
|
||||
source /usr/share/fzf/completion.zsh
|
||||
fi
|
||||
|
||||
|
||||
# =====================
|
||||
# Aliases
|
||||
# =====================
|
||||
|
||||
# Modern replacements for coreutils
|
||||
alias cat="bat"
|
||||
alias ls="exa --icons"
|
||||
alias ll="exa -l --icons"
|
||||
alias la="exa -la --icons"
|
||||
|
||||
# Developer tools
|
||||
alias lg="lazygit"
|
||||
|
||||
|
||||
# =====================
|
||||
# Zsh history settings
|
||||
# =====================
|
||||
|
||||
HISTFILE=~/.zsh_history
|
||||
HISTSIZE=10000
|
||||
SAVEHIST=10000
|
||||
setopt append_history
|
||||
setopt inc_append_history
|
||||
setopt share_history
|
||||
setopt hist_ignore_dups
|
||||
setopt hist_reduce_blanks
|
||||
|
||||
|
||||
# =====================
|
||||
# Zsh plugin integrations
|
||||
# =====================
|
||||
|
||||
# Autosuggestions
|
||||
if [ -f /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh ]; then
|
||||
source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh
|
||||
fi
|
||||
# Syntax highlighting
|
||||
if [ -f /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh ]; then
|
||||
source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
|
||||
fi
|
||||
# Additional completions
|
||||
fpath+=/usr/share/zsh/site-functions
|
||||
autoload -Uz compinit && compinit
|
||||
|
||||
|
||||
# =====================
|
||||
# Command-not-found handler (Arch/pkgfile)
|
||||
# =====================
|
||||
|
||||
if [ -f /usr/share/doc/pkgfile/command-not-found.zsh ]; then
|
||||
source /usr/share/doc/pkgfile/command-not-found.zsh
|
||||
fi
|
||||
|
||||
# =====================
|
||||
# End of .zshrc
|
||||
# =====================
|
||||
65
README.md
Normal file
65
README.md
Normal file
@ -0,0 +1,65 @@
|
||||
# Arch Linux Dotfiles & Hyprland Setup
|
||||
|
||||
This repository manages your personal dotfiles and a modular, Wayland-ready desktop environment for Arch Linux using `paru`.
|
||||
|
||||
|
||||
## Features
|
||||
- Modular setup: each aspect (packages, symlinks, shell, Neovim, Hyprland, sound, browsers, devtools, etc.) is handled by its own script in `modules/`.
|
||||
- All dotfiles and app configs are version-controlled and symlinked to your home directory.
|
||||
- Out-of-the-box integration for Hyprland, Waybar, Rofi, Mako, Alacritty, wlogout, and more.
|
||||
- Modern sound stack (PipeWire, WirePlumber, pavucontrol, etc.).
|
||||
- Volume notifications: see current volume as a Mako popup at the bottom center when changed.
|
||||
- Multi-monitor workspace rules: workspace 1 always on laptop, others on external (DP-1) if connected; all on laptop if standalone.
|
||||
- Brave browser always launches on workspace 10 and autostarts with Hyprland.
|
||||
- TTY/console uses German nodeadkeys layout (`de-latin1-nodeadkeys`).
|
||||
- Devtools module installs git, Python, Node.js, Docker, VS Code, opencode-bin, and more.
|
||||
- Easily extensible: add new modules or configs as needed.
|
||||
|
||||
## Setup
|
||||
|
||||
1. Clone this repository:
|
||||
```sh
|
||||
git clone https://github.com/yourusername/dotfiles.git ~/git/dotfiles
|
||||
cd ~/git/dotfiles
|
||||
```
|
||||
2. Run the setup script:
|
||||
```sh
|
||||
./setup.sh
|
||||
```
|
||||
|
||||
When you run `setup.sh`, you will be prompted to select your device profile (`laptop` or `desktop`).
|
||||
This ensures that device-specific configs (e.g., battery, backlight, touchpad, monitor layout) are applied correctly for your hardware.
|
||||
You can also set the environment variable `DOTFILES_DEVICE` to skip the prompt:
|
||||
```sh
|
||||
DOTFILES_DEVICE=desktop ./setup.sh
|
||||
```
|
||||
|
||||
The script will install all required packages and symlink dotfiles and configs (including everything in `.config/`) to your home directory, using the correct device-specific fragments for Hyprland and Waybar.
|
||||
|
||||
|
||||
## Customization
|
||||
- Add new dotfiles to the repo root (e.g., `.zshrc`, `.tmux.conf`).
|
||||
- Place app configs in `.config/` (e.g., `.config/hypr/hyprland.conf`).
|
||||
- Add or edit modules in the `modules/` directory to automate more setup steps.
|
||||
- To add custom scripts, place them in `.local/bin/` in the repo; they will be symlinked to `~/.local/bin/`.
|
||||
- To add browsers, edit `modules/06-browsers.sh` (Chrome, Firefox, Brave supported out of the box).
|
||||
- To add devtools, edit `modules/50-devtools.sh` (includes VS Code, opencode-bin, lazygit, etc.).
|
||||
|
||||
|
||||
## Requirements
|
||||
- Arch Linux
|
||||
- [paru](https://github.com/Morganamilo/paru) (will be installed automatically if missing)
|
||||
- For TTY keymap: `kbd` package (should be present on most systems)
|
||||
|
||||
|
||||
## Notable Integrations & Tips
|
||||
- **Browsers:** Chrome, Firefox, and Brave are installed via the browser module. Brave autostarts and is always on workspace 10.
|
||||
- **Devtools:** Includes VS Code (`visual-studio-code-bin`), opencode-bin, lazygit, and more.
|
||||
- **Volume OSD:** Volume changes show a notification at the bottom center of the screen (Mako).
|
||||
- **Multi-monitor:** Workspace 1 is always on the laptop display, others on DP-1 if connected.
|
||||
- **TTY Keymap:** Console uses German nodeadkeys layout for all users (system-wide via `localectl`).
|
||||
- **No official Teams/Outlook client:** Use the web app or AUR wrappers for best compatibility.
|
||||
- **TortoiseGit alternative:** Use GitKraken, Sublime Merge, SmartGit, or lazygit for graphical Git workflows.
|
||||
|
||||
## License
|
||||
MIT
|
||||
28
modules/01-packages.sh
Executable file
28
modules/01-packages.sh
Executable file
@ -0,0 +1,28 @@
|
||||
#!/usr/bin/env bash
|
||||
# Install paru if not present
|
||||
if ! command -v paru &>/dev/null; then
|
||||
echo "paru not found. Installing paru..."
|
||||
git clone https://aur.archlinux.org/paru.git /tmp/paru
|
||||
(cd /tmp/paru && makepkg -si --noconfirm)
|
||||
fi
|
||||
|
||||
# List of packages to install (edit as needed)
|
||||
PACKAGES=(
|
||||
git
|
||||
zsh
|
||||
neovim
|
||||
tmux
|
||||
starship
|
||||
fzf
|
||||
ripgrep
|
||||
bat
|
||||
exa
|
||||
zsh-autosuggestions
|
||||
zsh-syntax-highlighting
|
||||
zsh-completions
|
||||
btop
|
||||
pkgfile
|
||||
# Add more packages here
|
||||
)
|
||||
|
||||
paru -S --needed --noconfirm "${PACKAGES[@]}"
|
||||
69
modules/02-symlinks.sh
Executable file
69
modules/02-symlinks.sh
Executable file
@ -0,0 +1,69 @@
|
||||
#!/usr/bin/env bash
|
||||
# Ensure required directories exist
|
||||
mkdir -p "$HOME/.config"
|
||||
|
||||
echo "Symlinking dotfiles..."
|
||||
# Get the dotfiles directory (parent of modules directory)
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
DOTFILES_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||||
|
||||
# Symlink regular dotfiles (excluding .config directory)
|
||||
for file in $(find "$DOTFILES_DIR" -maxdepth 1 -name ".*"); do
|
||||
[ "$file" = "$DOTFILES_DIR/.git" ] && continue
|
||||
[ "$file" = "$DOTFILES_DIR/.github" ] && continue
|
||||
[ "$file" = "$DOTFILES_DIR/.vscode" ] && continue
|
||||
[ "$file" = "$DOTFILES_DIR/.config" ] && continue # Handle .config separately
|
||||
basefile="$(basename "$file")"
|
||||
if [ -f "$file" ] || [ -d "$file" ]; then
|
||||
ln -sf "$file" "$HOME/$basefile"
|
||||
echo "Linked $basefile"
|
||||
fi
|
||||
done
|
||||
|
||||
# Symlink .config directory contents
|
||||
CONFIG_DIR="$DOTFILES_DIR/.config"
|
||||
if [ -d "$CONFIG_DIR" ]; then
|
||||
echo "Symlinking .config contents..."
|
||||
for item in "$CONFIG_DIR"/*; do
|
||||
[ -e "$item" ] || continue
|
||||
baseitem="$(basename "$item")"
|
||||
target_dir="$HOME/.config/$baseitem"
|
||||
|
||||
# Remove existing symlink or directory to avoid conflicts
|
||||
[ -L "$target_dir" ] && rm "$target_dir"
|
||||
[ -d "$target_dir" ] && [ ! -L "$target_dir" ] && rm -rf "$target_dir"
|
||||
|
||||
ln -sf "$item" "$target_dir"
|
||||
echo "Linked .config/$baseitem"
|
||||
done
|
||||
|
||||
# Device-specific symlinks for Hyprland and Waybar
|
||||
if [ -n "$DOTFILES_DEVICE" ]; then
|
||||
# Hyprland monitors
|
||||
ln -sf "$CONFIG_DIR/hypr/includes/monitors-$DOTFILES_DEVICE.conf" "$CONFIG_DIR/hypr/includes/monitors.conf"
|
||||
echo "Linked monitors-$DOTFILES_DEVICE.conf as monitors.conf"
|
||||
# Hyprland input
|
||||
ln -sf "$CONFIG_DIR/hypr/includes/input-$DOTFILES_DEVICE.conf" "$CONFIG_DIR/hypr/includes/input.conf"
|
||||
echo "Linked input-$DOTFILES_DEVICE.conf as input.conf"
|
||||
# Waybar config
|
||||
ln -sf "$CONFIG_DIR/waybar/config-$DOTFILES_DEVICE" "$CONFIG_DIR/waybar/config"
|
||||
echo "Linked config-$DOTFILES_DEVICE as waybar config"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "Dotfiles setup complete!"
|
||||
|
||||
# Symlink .local/bin scripts
|
||||
LOCAL_BIN_REPO="$DOTFILES_DIR/.local/bin"
|
||||
LOCAL_BIN_HOME="$HOME/.local/bin"
|
||||
if [ -d "$LOCAL_BIN_REPO" ]; then
|
||||
mkdir -p "$LOCAL_BIN_HOME"
|
||||
echo "Symlinking .local/bin scripts..."
|
||||
for script in "$LOCAL_BIN_REPO"/*; do
|
||||
[ -e "$script" ] || continue
|
||||
base_script="$(basename "$script")"
|
||||
ln -sf "$script" "$LOCAL_BIN_HOME/$base_script"
|
||||
echo "Linked .local/bin/$base_script"
|
||||
done
|
||||
fi
|
||||
|
||||
13
modules/03-shell.sh
Executable file
13
modules/03-shell.sh
Executable file
@ -0,0 +1,13 @@
|
||||
#!/usr/bin/env bash
|
||||
# Set zsh as the default shell
|
||||
if [ "$SHELL" != "$(command -v zsh)" ]; then
|
||||
echo "Setting zsh as the default shell..."
|
||||
chsh -s "$(command -v zsh)"
|
||||
fi
|
||||
|
||||
# Set German nodeadkeys layout for TTY/console
|
||||
if command -v localectl >/dev/null 2>&1; then
|
||||
echo "Setting TTY keyboard layout to de-latin1-nodeadkeys..."
|
||||
sudo localectl set-keymap de-latin1-nodeadkeys
|
||||
fi
|
||||
|
||||
13
modules/04-nvim.sh
Executable file
13
modules/04-nvim.sh
Executable file
@ -0,0 +1,13 @@
|
||||
#!/usr/bin/env bash
|
||||
# Install AstroNvim if not already installed
|
||||
ASTRONVIM_DIR="$HOME/.config/nvim"
|
||||
mkdir -p "$HOME/.config"
|
||||
if [ ! -d "$ASTRONVIM_DIR" ] || [ -z "$(ls -A "$ASTRONVIM_DIR")" ]; then
|
||||
echo "Installing AstroNvim..."
|
||||
rm -rf "$ASTRONVIM_DIR"
|
||||
git clone --depth 1 https://github.com/AstroNvim/template "$ASTRONVIM_DIR"
|
||||
rm -rf "$ASTRONVIM_DIR/.git"
|
||||
echo "AstroNvim installed in $ASTRONVIM_DIR"
|
||||
else
|
||||
echo "AstroNvim already installed. Skipping."
|
||||
fi
|
||||
0
modules/05-hyprland.sh
Normal file
0
modules/05-hyprland.sh
Normal file
22
modules/05-sound.sh
Executable file
22
modules/05-sound.sh
Executable file
@ -0,0 +1,22 @@
|
||||
#!/usr/bin/env bash
|
||||
# Install sound-related packages for Hyprland
|
||||
|
||||
SOUND_PACKAGES=(
|
||||
pipewire
|
||||
pipewire-alsa
|
||||
pipewire-pulse
|
||||
pipewire-jack
|
||||
wireplumber
|
||||
pavucontrol
|
||||
pamixer
|
||||
playerctl
|
||||
alsa-utils
|
||||
sof-firmware
|
||||
)
|
||||
|
||||
paru -S --needed --noconfirm "${SOUND_PACKAGES[@]}"
|
||||
|
||||
# Enable and start PipeWire services
|
||||
systemctl --user enable --now pipewire pipewire-pulse wireplumber
|
||||
|
||||
echo "Sound packages installed and services enabled."
|
||||
0
modules/06-browsers.sh
Normal file
0
modules/06-browsers.sh
Normal file
23
modules/06-hyprland.sh
Executable file
23
modules/06-hyprland.sh
Executable file
@ -0,0 +1,23 @@
|
||||
#!/usr/bin/env bash
|
||||
# Install Hyprland and related software
|
||||
|
||||
HYPR_PACKAGES=(
|
||||
hyprland
|
||||
hyprlock
|
||||
hypridle
|
||||
xdg-desktop-portal-hyprland
|
||||
waybar
|
||||
rofi-wayland
|
||||
mako
|
||||
wl-clipboard
|
||||
wlogout
|
||||
brightnessctl
|
||||
alacritty
|
||||
ttf-jetbrains-mono
|
||||
ttf-nerd-fonts-symbols
|
||||
noto-fonts
|
||||
)
|
||||
|
||||
paru -S --needed --noconfirm "${HYPR_PACKAGES[@]}"
|
||||
|
||||
echo "Hyprland and related tools installed and configured."
|
||||
0
modules/06-sound.sh
Normal file
0
modules/06-sound.sh
Normal file
13
modules/07-browsers.sh
Executable file
13
modules/07-browsers.sh
Executable file
@ -0,0 +1,13 @@
|
||||
#!/usr/bin/env bash
|
||||
# 06-browsers.sh - Install web browsers (Chrome, Firefox, Brave)
|
||||
|
||||
set -e
|
||||
|
||||
# List of browser packages to install
|
||||
BROWSERS=(google-chrome firefox brave-bin)
|
||||
|
||||
# Install browsers with paru (AUR helper)
|
||||
echo "Installing browsers: ${BROWSERS[*]}"
|
||||
paru -S --needed --noconfirm "${BROWSERS[@]}"
|
||||
|
||||
echo "Browsers installed."
|
||||
22
modules/50-devtools.sh
Executable file
22
modules/50-devtools.sh
Executable file
@ -0,0 +1,22 @@
|
||||
#!/usr/bin/env bash
|
||||
# Install development tools and utilities
|
||||
|
||||
DEVTOOLS_PACKAGES=(
|
||||
git
|
||||
python
|
||||
nodejs
|
||||
npm
|
||||
docker
|
||||
jq
|
||||
ripgrep
|
||||
fd
|
||||
btop
|
||||
htop
|
||||
lazygit
|
||||
visual-studio-code-bin
|
||||
opencode-bin
|
||||
)
|
||||
|
||||
paru -S --needed --noconfirm "${DEVTOOLS_PACKAGES[@]}"
|
||||
|
||||
echo "Development tools installed."
|
||||
21
modules/99-postinstall.sh
Executable file
21
modules/99-postinstall.sh
Executable file
@ -0,0 +1,21 @@
|
||||
#!/usr/bin/env bash
|
||||
# Post-install steps for dotfiles setup
|
||||
|
||||
# Update pkgfile database for command-not-found suggestions
|
||||
if command -v pkgfile &>/dev/null; then
|
||||
echo "Updating pkgfile database..."
|
||||
sudo pkgfile --update
|
||||
fi
|
||||
|
||||
# Rehash zsh command hash table so new executables are found
|
||||
if command -v zsh &>/dev/null; then
|
||||
echo "Running zsh rehash..."
|
||||
zsh -c 'rehash'
|
||||
fi
|
||||
|
||||
# Add other post-install steps here as needed
|
||||
# Example: update icon cache, font cache, etc.
|
||||
# sudo fc-cache -fv
|
||||
# sudo gtk-update-icon-cache -f /usr/share/icons/hicolor
|
||||
|
||||
echo "Post-install steps complete."
|
||||
32
setup.sh
Executable file
32
setup.sh
Executable file
@ -0,0 +1,32 @@
|
||||
#!/usr/bin/env bash
|
||||
# Dotfiles setup script for Arch Linux using paru
|
||||
set -e
|
||||
|
||||
#!/usr/bin/env bash
|
||||
# Dotfiles setup script for Arch Linux using paru
|
||||
set -e
|
||||
|
||||
# Device profile detection
|
||||
if [ -z "$DOTFILES_DEVICE" ]; then
|
||||
echo "Select device profile:"
|
||||
select profile in "laptop" "desktop"; do
|
||||
DOTFILES_DEVICE="$profile"
|
||||
export DOTFILES_DEVICE
|
||||
echo "Using device profile: $DOTFILES_DEVICE"
|
||||
break
|
||||
done
|
||||
else
|
||||
echo "Using device profile from environment: $DOTFILES_DEVICE"
|
||||
fi
|
||||
|
||||
# Find, sort, and run all modules in the modules directory
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
MODULES=( $(find "$SCRIPT_DIR/modules" -maxdepth 1 -type f -name "*.sh" | sort) )
|
||||
COUNT=${#MODULES[@]}
|
||||
for i in "${!MODULES[@]}"; do
|
||||
MODULE="${MODULES[$i]}"
|
||||
STEP=$((i+1))
|
||||
BASENAME=$(basename "$MODULE")
|
||||
echo "[$STEP/$COUNT] Running $BASENAME..."
|
||||
source "$MODULE"
|
||||
done
|
||||
Loading…
Reference in New Issue
Block a user