├── other ├── nobeep.conf ├── .Xresources ├── gtk.css ├── xsettingsd ├── .zprofile ├── fonts.conf ├── user-dirs.dirs ├── .xinitrc └── 51-disable-suspension.conf ├── wallpapers ├── paper.png ├── zelda.png ├── balloons.png └── flatiron.png ├── screenshots └── showcase.png ├── config ├── i3 │ ├── scripts │ │ ├── polybar.sh │ │ ├── monitors.sh │ │ ├── layouts.sh │ │ ├── theme.sh │ │ └── lockscreen.sh │ ├── layouts │ │ ├── 2.json │ │ ├── 3.json │ │ ├── 4.json │ │ └── 1.json │ ├── themes │ │ ├── dark │ │ └── light │ └── config ├── polybar │ ├── themes │ │ ├── dark.ini │ │ └── light.ini │ ├── scripts │ │ ├── audio_icon.sh │ │ ├── power.sh │ │ ├── calendar.sh │ │ ├── audio_switcher.sh │ │ └── weather.sh │ ├── polybar.ini │ └── modules.ini ├── rofi │ ├── themes │ │ ├── dark.rasi │ │ └── light.rasi │ ├── scripts │ │ └── calculator.sh │ ├── power.rasi │ ├── rofi.rasi │ └── clipboard.rasi ├── alacritty │ ├── alacritty.toml │ └── themes │ │ ├── dark.toml │ │ └── light.toml ├── dunst │ └── dunstrc ├── picom │ └── picom.conf ├── omp │ └── theme.toml ├── neofetch │ └── config.conf ├── zsh │ └── .zshrc └── tmux │ └── tmux.conf ├── .env.example ├── scripts ├── map.txt ├── symlink.sh └── install.sh ├── LICENSE └── README.md /other/nobeep.conf: -------------------------------------------------------------------------------- 1 | # Disable system bell 2 | blacklist pcspkr 3 | -------------------------------------------------------------------------------- /other/.Xresources: -------------------------------------------------------------------------------- 1 | ! Cursor settings 2 | Xcursor.theme: Quintom_Ink 3 | Xcursor.size: 32 4 | -------------------------------------------------------------------------------- /wallpapers/paper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edu-flores/linux-dotfiles/HEAD/wallpapers/paper.png -------------------------------------------------------------------------------- /wallpapers/zelda.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edu-flores/linux-dotfiles/HEAD/wallpapers/zelda.png -------------------------------------------------------------------------------- /other/gtk.css: -------------------------------------------------------------------------------- 1 | @define-color accent_bg_color #1793d1; 2 | @define-color accent_color @accent_bg_color; 3 | -------------------------------------------------------------------------------- /wallpapers/balloons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edu-flores/linux-dotfiles/HEAD/wallpapers/balloons.png -------------------------------------------------------------------------------- /wallpapers/flatiron.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edu-flores/linux-dotfiles/HEAD/wallpapers/flatiron.png -------------------------------------------------------------------------------- /screenshots/showcase.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edu-flores/linux-dotfiles/HEAD/screenshots/showcase.png -------------------------------------------------------------------------------- /other/xsettingsd: -------------------------------------------------------------------------------- 1 | # Theme settings 2 | Net/ThemeName "adw-gtk3-dark" 3 | Net/IconThemeName "MoreWaita" 4 | Gtk/FontName "Inter 10.5" 5 | -------------------------------------------------------------------------------- /other/.zprofile: -------------------------------------------------------------------------------- 1 | # Start the X server automatically after login 2 | if [ -z "$DISPLAY" ] && [ "$(tty)" = "/dev/tty1" ]; then 3 | startx 4 | fi 5 | -------------------------------------------------------------------------------- /config/i3/scripts/polybar.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Terminate instance 4 | killall polybar 5 | 6 | # Launch instance 7 | polybar -c ~/.config/polybar/polybar.ini main & 8 | -------------------------------------------------------------------------------- /config/polybar/themes/dark.ini: -------------------------------------------------------------------------------- 1 | # Polybar dark mode theme 2 | 3 | [colors] 4 | background = #1e1e1e 5 | background-alt = #242424 6 | foreground = #ffffff 7 | foreground-alt = #8f8f8f 8 | urgent = #ff7043 9 | empty = #454545 10 | raised = #393939 11 | -------------------------------------------------------------------------------- /config/polybar/themes/light.ini: -------------------------------------------------------------------------------- 1 | # Polybar light mode theme 2 | 3 | [colors] 4 | background = #ffffff 5 | background-alt = #fafafa 6 | foreground = #333333 7 | foreground-alt = #999999 8 | urgent = #ff7043 9 | empty = #dddddd 10 | raised = #e6e6e6 11 | -------------------------------------------------------------------------------- /other/fonts.conf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | monospace 6 | JetBrainsMono Nerd Font 7 | 8 | 9 | -------------------------------------------------------------------------------- /config/rofi/themes/dark.rasi: -------------------------------------------------------------------------------- 1 | * { 2 | background: #1e1e1e; 3 | background-alt: #242424; 4 | foreground: #ffffff; 5 | foreground-alt: #8f8f8f; 6 | urgent: #ff7043; 7 | selected: #383838; 8 | scroll: #787878; 9 | raised: #393939; 10 | } 11 | -------------------------------------------------------------------------------- /config/rofi/themes/light.rasi: -------------------------------------------------------------------------------- 1 | * { 2 | background: #ffffff; 3 | background-alt: #fafafa; 4 | foreground: #333333; 5 | foreground-alt: #999999; 6 | urgent: #ff7043; 7 | selected: #e4e4e4; 8 | scroll: #adadad; 9 | raised: #e6e6e6; 10 | } 11 | -------------------------------------------------------------------------------- /other/user-dirs.dirs: -------------------------------------------------------------------------------- 1 | XDG_DESKTOP_DIR="$HOME/Desktop" 2 | XDG_DOCUMENTS_DIR="$HOME/Documents" 3 | XDG_DOWNLOAD_DIR="$HOME/Downloads" 4 | XDG_MUSIC_DIR="$HOME/Music" 5 | XDG_PICTURES_DIR="$HOME/Pictures" 6 | XDG_PUBLICSHARE_DIR="$HOME/Public" 7 | XDG_TEMPLATES_DIR="$HOME/Templates" 8 | XDG_VIDEOS_DIR="$HOME/Videos" 9 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | ##### Polybar Modules ##### 2 | 3 | # Weather (https://openweathermap.org/) 4 | WEATHER_API_KEY=123a456b789c123a456b789c123a456b 5 | WEATHER_LOCATION_ID=9999999 6 | 7 | # Audio ($ pactl list short sinks) 8 | SPEAKERS=alsa_output.name.analog-stereo 9 | HEADPHONES=alsa_output.name.analog-stereo 10 | -------------------------------------------------------------------------------- /config/i3/layouts/2.json: -------------------------------------------------------------------------------- 1 | { 2 | "floating": "auto_off", 3 | "geometry": { 4 | "height": 1, 5 | "width": 1, 6 | "x": 0, 7 | "y": 0 8 | }, 9 | "name": "Music", 10 | "swallows": [ 11 | { 12 | "class": "^Spotify$" 13 | } 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /config/i3/layouts/3.json: -------------------------------------------------------------------------------- 1 | { 2 | "floating": "auto_off", 3 | "geometry": { 4 | "height": 1, 5 | "width": 1, 6 | "x": 0, 7 | "y": 0 8 | }, 9 | "name": "Editor", 10 | "swallows": [ 11 | { 12 | "class": "^Code$" 13 | } 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /config/i3/layouts/4.json: -------------------------------------------------------------------------------- 1 | { 2 | "floating": "auto_off", 3 | "geometry": { 4 | "height": 1, 5 | "width": 1, 6 | "x": 0, 7 | "y": 0 8 | }, 9 | "name": "Notes", 10 | "swallows": [ 11 | { 12 | "class": "^obsidian$" 13 | } 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /config/i3/layouts/1.json: -------------------------------------------------------------------------------- 1 | { 2 | "floating": "auto_off", 3 | "geometry": { 4 | "height": 1, 5 | "width": 1, 6 | "x": 0, 7 | "y": 0 8 | }, 9 | "name": "Browser", 10 | "swallows": [ 11 | { 12 | "class": "^Google-chrome$" 13 | } 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /config/i3/scripts/monitors.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Get primary and secondary monitors 4 | PRIMARY_MONITOR=$1 5 | SECONDARY_MONITOR=$2 6 | 7 | # Configure dual monitor setup 8 | if [ -n "$PRIMARY_MONITOR" ] && [ -n "$SECONDARY_MONITOR" ]; then 9 | xrandr --output "$SECONDARY_MONITOR" --rotate left \ 10 | --left-of "$PRIMARY_MONITOR" 11 | fi 12 | 13 | # Set their wallpapers 14 | feh --bg-fill "$(find ~/Pictures/Wallpapers/* -type f | shuf -n 1)" 15 | -------------------------------------------------------------------------------- /other/.xinitrc: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | userresources="$HOME/.Xresources" 4 | usermodmap="$HOME/.Xmodmap" 5 | sysresources="/etc/X11/xinit/.Xresources" 6 | sysmodmap="/etc/X11/xinit/.Xmodmap" 7 | 8 | # Merge in defaults and keymaps 9 | [ -f "$sysresources" ] && xrdb -merge "$sysresources" 10 | [ -f "$sysmodmap" ] && xmodmap "$sysmodmap" 11 | [ -f "$userresources" ] && xrdb -merge "$userresources" 12 | [ -f "$usermodmap" ] && xmodmap "$usermodmap" 13 | 14 | # Execute xinitrc.d scripts 15 | if [ -d /etc/X11/xinit/xinitrc.d ]; then 16 | for f in /etc/X11/xinit/xinitrc.d/*.sh; do 17 | [ -x "$f" ] && . "$f" 18 | done 19 | fi 20 | 21 | # Launch i3 22 | exec i3 23 | -------------------------------------------------------------------------------- /config/polybar/scripts/audio_icon.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Load environment variables 4 | if [ -e ~/.env ]; then 5 | source ~/.env 6 | else 7 | echo  8 | exit 1 9 | fi 10 | 11 | # Get current default audio sink 12 | current_sink_name=$(pactl info | grep "Default Sink" | cut -d" " -f3) 13 | 14 | # Echo icon 15 | case $current_sink_name in 16 | $SPEAKERS) 17 | audio_icon="󰓃";; 18 | $HEADPHONES) 19 | audio_icon="󰋋";; 20 | *) 21 | audio_icon="";; 22 | esac 23 | 24 | # Check if the sink is muted 25 | if pactl get-sink-mute @DEFAULT_SINK@ | grep -q yes; then 26 | audio_icon="%{F#ff7043}󰝟%{F-}" 27 | fi 28 | 29 | # Output the result 30 | echo $audio_icon 31 | -------------------------------------------------------------------------------- /scripts/map.txt: -------------------------------------------------------------------------------- 1 | config/alacritty ~/.config/alacritty 2 | config/dunst ~/.config/dunst 3 | config/i3 ~/.config/i3 4 | config/neofetch ~/.config/neofetch 5 | config/omp ~/.config/omp 6 | config/picom ~/.config/picom 7 | config/polybar ~/.config/polybar 8 | config/rofi ~/.config/rofi 9 | config/tmux ~/.config/tmux 10 | config/zsh/.zshrc ~/.zshrc 11 | other/.xinitrc ~/.xinitrc 12 | other/.Xresources ~/.Xresources 13 | other/.zprofile ~/.zprofile 14 | other/51-disable-suspension.conf /etc/wireplumber/wireplumber.conf.d/51-disable-suspension.conf 15 | other/fonts.conf ~/.config/fontconfig/fonts.conf 16 | other/gtk.css ~/.config/gtk-3.0/gtk.css 17 | other/nobeep.conf /etc/modprobe.d/nobeep.conf 18 | other/user-dirs.dirs ~/.config/user-dirs.dirs 19 | other/xsettingsd ~/.xsettingsd 20 | -------------------------------------------------------------------------------- /config/polybar/scripts/power.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Define power menu options 4 | options="\n\n\n\n\n󰩈" 5 | 6 | # Display Rofi menu and store the selected option 7 | selected_option=$(echo -e "$options" | rofi -dmenu -config ~/.config/rofi/power.rasi) 8 | 9 | # Perform actions based on the selected option 10 | case "$selected_option" in 11 | "") 12 | systemctl poweroff 13 | ;; 14 | "") 15 | systemctl reboot 16 | ;; 17 | "") 18 | systemctl suspend 19 | ;; 20 | "") 21 | systemctl hibernate 22 | ;; 23 | "") 24 | ~/.config/i3/scripts/lockscreen.sh 25 | ;; 26 | "󰩈") 27 | i3-msg exit 28 | ;; 29 | *) 30 | echo "Dismissed" 31 | ;; 32 | esac 33 | -------------------------------------------------------------------------------- /config/alacritty/alacritty.toml: -------------------------------------------------------------------------------- 1 | # ┌──────────────────────────────────────┐ 2 | # │ ░█▀█░█░░░█▀█░█▀▀░█▀▄░▀█▀░▀█▀░▀█▀░█░█ │ 3 | # │ ░█▀█░█░░░█▀█░█░░░█▀▄░░█░░░█░░░█░░░█░ │ 4 | # │ ░▀░▀░▀▀▀░▀░▀░▀▀▀░▀░▀░▀▀▀░░▀░░░▀░░░▀░ │ 5 | # └──────────────────────────────────────┘ 6 | 7 | [general] 8 | live_config_reload = true 9 | import = [ "~/.config/alacritty/themes/dark.toml" ] 10 | 11 | [window] 12 | padding = { x = 20, y = 20 } 13 | 14 | [font] 15 | size = 10.5 16 | normal = { family = "JetBrainsMono NFP", style = "SemiBold" } 17 | bold = { family = "JetBrainsMono NFP", style = "ExtraBold" } 18 | italic = { family = "JetBrainsMono NFP", style = "SemiBold Italic" } 19 | bold_italic = { family = "JetBrainsMono NFP", style = "ExtraBold Italic" } 20 | 21 | [cursor] 22 | style = { shape = "Block", blinking = "Always" } 23 | blink_timeout = 0 24 | -------------------------------------------------------------------------------- /config/rofi/scripts/calculator.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | HISTORY_FILE=/tmp/rofi_history.txt 4 | 5 | # Remove the history file if the user enters 'clear' as a command 6 | if [[ "$(echo "$@" | awk '{print tolower($0)}')" == "clear" ]]; then 7 | rm $HISTORY_FILE 8 | echo "History cleared successfully." 9 | 10 | # Notify the user that he entered a previous result as a command 11 | elif [[ "$ROFI_RETV" == 1 ]]; then 12 | echo "Press [Ctrl + Enter] to override a highlighted result and enter your own input." 13 | 14 | # Use libqalculate to get the result and save it to the history file 15 | elif [[ "$#" -gt 0 && -n "$1" ]]; then 16 | result=$(qalc --terse "$@") 17 | echo "$@ = $result" >> $HISTORY_FILE 18 | fi 19 | 20 | # Echo the history file in reverse order 21 | if [[ -e $HISTORY_FILE ]]; then 22 | tac $HISTORY_FILE 23 | fi 24 | -------------------------------------------------------------------------------- /config/i3/scripts/layouts.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Open layouts 4 | for i in {1..4}; do 5 | i3-msg "workspace $i; append_layout ~/.config/i3/layouts/$i.json" 6 | done 7 | 8 | # Open scratchpad applications 9 | alacritty -e zsh -c "tmux new-session -A -s scratchpad 'neofetch; zsh'" & 10 | nemo & 11 | 12 | # Send them to the scratchpad 13 | sleep 3 14 | i3-msg "[class=Alacritty] floating enable, sticky enable, mark terminal, move scratchpad" 15 | i3-msg "[class=Nemo] floating enable, sticky enable, mark explorer, move scratchpad" 16 | 17 | # Open the rest of the applications 18 | google-chrome-stable & 19 | spotify & 20 | code & 21 | obsidian & 22 | 23 | # Move workspace programmatically 24 | i3-msg workspace 5 25 | 26 | # Send notification 27 | dunstify --icon="preferences-other" "Please wait" "Opening applications & setting up workspaces..." 28 | -------------------------------------------------------------------------------- /config/dunst/dunstrc: -------------------------------------------------------------------------------- 1 | # ┌──────────────────────┐ 2 | # │ ░█▀▄░█░█░█▀█░█▀▀░▀█▀ │ 3 | # │ ░█░█░█░█░█░█░▀▀█░░█░ │ 4 | # │ ░▀▀░░▀▀▀░▀░▀░▀▀▀░░▀░ │ 5 | # └──────────────────────┘ 6 | 7 | [global] 8 | # Settings 9 | notification_limit = 5 10 | 11 | # Geometry 12 | width = (200, 400) 13 | height = (100, 300) 14 | offset = 140x50 15 | padding = 20 16 | horizontal_padding = 25 17 | text_icon_padding = 20 18 | gap_size = 5 19 | frame_width = 0 20 | 21 | # Text 22 | font = Inter SemiBold 11 23 | alignment = center 24 | show_age_threshold = -1 25 | format = %s\n%b 26 | 27 | # Icons 28 | max_icon_size = 64 29 | icon_theme = MoreWaita 30 | enable_recursive_icon_lookup = true 31 | 32 | # Styling 33 | background = "#1e1e1e" 34 | foreground = "#ffffff" 35 | 36 | [urgency_low] 37 | timeout = 3 38 | 39 | [urgency_normal] 40 | timeout = 5 41 | 42 | [urgency_critical] 43 | timeout = 0 44 | -------------------------------------------------------------------------------- /other/51-disable-suspension.conf: -------------------------------------------------------------------------------- 1 | # Disable audio suspension to prevent pops and cracks 2 | monitor.alsa.rules = [ 3 | { 4 | matches = [ 5 | { 6 | # Matches all sources 7 | node.name = "~alsa_input.*" 8 | }, 9 | { 10 | # Matches all sinks 11 | node.name = "~alsa_output.*" 12 | } 13 | ] 14 | actions = { 15 | update-props = { 16 | session.suspend-timeout-seconds = 0 17 | } 18 | } 19 | } 20 | ] 21 | monitor.bluez.rules = [ 22 | { 23 | matches = [ 24 | { 25 | # Matches all sources 26 | node.name = "~bluez_input.*" 27 | }, 28 | { 29 | # Matches all sinks 30 | node.name = "~bluez_output.*" 31 | } 32 | ] 33 | actions = { 34 | update-props = { 35 | session.suspend-timeout-seconds = 0 36 | } 37 | } 38 | } 39 | ] 40 | -------------------------------------------------------------------------------- /scripts/symlink.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Repo directory location 4 | SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" 5 | REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" 6 | 7 | # Handle symlinking 8 | create_symlink() { 9 | source_path=$1 10 | target_path=$2 11 | 12 | # Expand '~' if necessary 13 | target_path=$(eval echo "$target_path") 14 | 15 | # Remove target in case it alrady exists 16 | sudo rm -rf "$target_path" 17 | 18 | # Ensure its parent directory exists 19 | sudo mkdir -p "$(dirname "$target_path")" 20 | 21 | # Create the symlink 22 | sudo ln -s "$source_path" "$target_path" 23 | echo "Symlinked $source_path to $target_path" 24 | } 25 | 26 | # Iterate through directories and files 27 | SYMLINK_MAP="$SCRIPT_DIR/map.txt" 28 | while read -r source_path target_path; do 29 | create_symlink "$REPO_ROOT/$source_path" "$target_path" 30 | done < "$SYMLINK_MAP" 31 | -------------------------------------------------------------------------------- /config/i3/themes/dark: -------------------------------------------------------------------------------- 1 | # Dark theme 2 | set $background "#1e1e1e" 3 | set $background_alt "#242424" 4 | set $foreground "#ffffff" 5 | set $foreground_alt "#8f8f8f" 6 | set $urgent "#ff7043" 7 | set $empty "#454545" 8 | set $raised "#393939" 9 | set $full "#ffffff" 10 | 11 | # Window Border Background Text Indicator Child border 12 | client.focused $raised $raised $foreground $raised $raised 13 | client.focused_inactive $raised $raised $foreground_alt $raised $raised 14 | client.unfocused $background $background $foreground_alt $background $background 15 | client.urgent $urgent $urgent $foreground $urgent $urgent 16 | client.placeholder $background $background $foreground_alt $background $background 17 | client.background $full 18 | -------------------------------------------------------------------------------- /config/i3/themes/light: -------------------------------------------------------------------------------- 1 | # Dark theme 2 | set $background "#ffffff" 3 | set $background_alt "#fafafa" 4 | set $foreground "#333333" 5 | set $foreground_alt "#999999" 6 | set $urgent "#ff7043" 7 | set $empty "#dddddd" 8 | set $raised "#e6e6e6" 9 | set $full "#ffffff" 10 | 11 | # Window Border Background Text Indicator Child border 12 | client.focused $raised $raised $foreground $raised $raised 13 | client.focused_inactive $raised $raised $foreground_alt $raised $raised 14 | client.unfocused $background $background $foreground_alt $background $background 15 | client.urgent $urgent $urgent $foreground $urgent $urgent 16 | client.placeholder $background $background $foreground_alt $background $background 17 | client.background $full 18 | -------------------------------------------------------------------------------- /config/alacritty/themes/dark.toml: -------------------------------------------------------------------------------- 1 | # Dark monokai terminal 2 | 3 | [colors] 4 | vi_mode_cursor = { text = "#f9f8f5", cursor = "#75715e" } 5 | footer_bar = { foreground = "#f9f8f5", background = "#75715e" } 6 | line_indicator = { foreground = "#f9f8f5", background = "#75715e" } 7 | 8 | [colors.primary] 9 | background = "#1e1e1e" 10 | foreground = "#ffffff" 11 | 12 | [colors.normal] 13 | black = "#272822" 14 | red = "#f92672" 15 | green = "#a6e22e" 16 | yellow = "#f4bf75" 17 | blue = "#66d9ef" 18 | magenta = "#ae81ff" 19 | cyan = "#a1efe4" 20 | white = "#f8f8f2" 21 | 22 | [colors.bright] 23 | black = "#75715e" 24 | red = "#f92672" 25 | green = "#a6e22e" 26 | yellow = "#f4bf75" 27 | blue = "#66d9ef" 28 | magenta = "#ae81ff" 29 | cyan = "#a1efe4" 30 | white = "#f9f8f5" 31 | 32 | [colors.selection] 33 | text = "#f9f8f5" 34 | background = "#75715e" 35 | 36 | [colors.search] 37 | matches = { foreground = "#1e1e1e", background = "#f92672" } 38 | focused_match = { foreground = "#1e1e1e", background = "#f4bf75" } 39 | -------------------------------------------------------------------------------- /config/alacritty/themes/light.toml: -------------------------------------------------------------------------------- 1 | # Light monokai terminal 2 | 3 | [colors] 4 | vi_mode_cursor = { text = "#f9f8f5", cursor = "#75715e" } 5 | footer_bar = { foreground = "#f9f8f5", background = "#75715e" } 6 | line_indicator = { foreground = "#f9f8f5", background = "#75715e" } 7 | 8 | [colors.primary] 9 | background = "#ffffff" 10 | foreground = "#333333" 11 | 12 | [colors.normal] 13 | black = "#272822" 14 | red = "#f92672" 15 | green = "#a6e22e" 16 | yellow = "#f4bf75" 17 | blue = "#66d9ef" 18 | magenta = "#ae81ff" 19 | cyan = "#a1efe4" 20 | white = "#f8f8f2" 21 | 22 | [colors.bright] 23 | black = "#75715e" 24 | red = "#f92672" 25 | green = "#a6e22e" 26 | yellow = "#f4bf75" 27 | blue = "#66d9ef" 28 | magenta = "#ae81ff" 29 | cyan = "#a1efe4" 30 | white = "#f9f8f5" 31 | 32 | [colors.selection] 33 | text = "#f9f8f5" 34 | background = "#75715e" 35 | 36 | [colors.search] 37 | matches = { foreground = "#ffffff", background = "#f92672" } 38 | focused_match = { foreground = "#ffffff", background = "#f4bf75" } 39 | -------------------------------------------------------------------------------- /config/polybar/scripts/calendar.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # File to store the month difference 4 | tmp_file="/tmp/calendar_month_diff" 5 | 6 | # Determine month difference based on the argument 7 | case $1 in 8 | "next") 9 | month_diff=$(($(cat $tmp_file 2> /dev/null) + 1)) 10 | ;; 11 | "prev") 12 | month_diff=$(($(cat $tmp_file 2> /dev/null) - 1)) 13 | ;; 14 | *) 15 | month_diff=0 16 | ;; 17 | esac 18 | 19 | # Store the month difference for next/prev 20 | echo "$month_diff" > $tmp_file 21 | 22 | # Get the calendar for the specified month 23 | if [ $month_diff -eq 0 ]; then 24 | today=$(date "+%e") 25 | calendar=$(cal | sed "1n; 0,/$today/{s/$today/&<\/i><\/span>/}") # Highlight today 26 | else 27 | calendar=$(cal $(date -d "$(date +%Y-%m-01) $month_diff months" "+%m %Y")) 28 | fi 29 | 30 | # Show notification 31 | HEAD=$(echo "$calendar" | head -n +1) 32 | BODY=$(echo "$calendar" | tail -n +2) 33 | FOOT="\n Calendar" 34 | dunstify --urgency="critical" --replace="-1" "$HEAD" "\n$BODY$FOOT" 35 | -------------------------------------------------------------------------------- /config/polybar/polybar.ini: -------------------------------------------------------------------------------- 1 | # ┌──────────────────────────────┐ 2 | # │ ░█▀█░█▀█░█░░░█░█░█▀▄░█▀█░█▀▄ │ 3 | # │ ░█▀▀░█░█░█░░░░█░░█▀▄░█▀█░█▀▄ │ 4 | # │ ░▀░░░▀▀▀░▀▀▀░░▀░░▀▀░░▀░▀░▀░▀ │ 5 | # └──────────────────────────────┘ 6 | 7 | # Import modules and current theme 8 | include-file = ~/.config/polybar/modules.ini 9 | include-file = ~/.config/polybar/themes/dark.ini 10 | 11 | [bar/main] 12 | # Geometry 13 | width = 90% 14 | height = 38 15 | offset-x = 5% 16 | radius-bottom-left = 12 17 | radius-bottom-right = 12 18 | 19 | # Styling 20 | background = ${colors.background} 21 | foreground = ${colors.foreground} 22 | font-0 = Inter:style=SemiBold:size=10.5;4 23 | font-1 = JetBrainsMono NFP:style=Regular:size=12;3 24 | cursor-click = pointer 25 | cursor-scroll = ns-resize 26 | line-size = 8 27 | padding = 4 28 | 29 | # Modules 30 | modules-left = logo LEFT terminal RIGHT LEFT explorer RIGHT workspaces 31 | modules-right = output volume media keyboard clipboard theme notifications network temp date power 32 | 33 | # Other 34 | override-redirect = true 35 | wm-restack = i3 36 | 37 | [settings] 38 | pseudo-transparency = false 39 | -------------------------------------------------------------------------------- /config/rofi/power.rasi: -------------------------------------------------------------------------------- 1 | configuration { 2 | font: "Inter SemiBold 12"; 3 | } 4 | 5 | @theme "dark" 6 | 7 | * { 8 | spacing: 0; 9 | } 10 | 11 | window { 12 | width: 600; 13 | height: 110; 14 | location: south; 15 | background-color: @background; 16 | border-radius: 18 18 0 0; 17 | } 18 | 19 | mainbox { 20 | children: [ box-buttons ]; 21 | background-color: inherit; 22 | padding: 15 20; 23 | } 24 | 25 | box-buttons { 26 | children: [ listview ]; 27 | orientation: horizontal; 28 | background-color: inherit; 29 | } 30 | 31 | listview { 32 | lines: 1; 33 | columns: 6; 34 | cycle: true; 35 | background-color: inherit; 36 | spacing: 15; 37 | } 38 | 39 | element { 40 | background-color: inherit; 41 | } 42 | 43 | element-text { 44 | font: "JetBrainsMono NFM 30"; 45 | background-color: @raised; 46 | color: @foreground-alt; 47 | horizontal-align: 0.5; 48 | border-radius: 100%; 49 | padding: 13 0; 50 | cursor: pointer; 51 | } 52 | 53 | element-text.selected { 54 | background-color: @urgent; 55 | color: @foreground; 56 | } 57 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Eduardo Flores 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /config/polybar/scripts/audio_switcher.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Get a list of available sink indices 4 | sinks=($(pactl list short sinks | awk '{print $1}')) 5 | 6 | # Get the name of the current default sink 7 | current_sink_name=$(pactl info | grep "Default Sink:" | cut -d: -f2 | xargs) 8 | 9 | # Find the current sink index in the list of available sinks 10 | current_index=-1 11 | for i in "${!sinks[@]}"; do 12 | sink_name=$(pactl list sinks | grep -e "Sink #"${sinks[$i]} -e "Name:" | grep -A1 "Sink #${sinks[$i]}" | grep "Name:" | cut -d: -f2 | xargs) 13 | if [ "$sink_name" = "$current_sink_name" ]; then 14 | current_index=$i 15 | break 16 | fi 17 | done 18 | 19 | # Did not find the index of the current sink 20 | if [ $current_index -eq -1 ]; then 21 | echo "Current default sink not found." >&2 22 | exit 1 23 | fi 24 | 25 | # Calculate the next sink index and set it as default 26 | next_index=$(( (current_index + 1) % ${#sinks[@]} )) 27 | pactl set-default-sink "${sinks[$next_index]}" 28 | echo "Switched default sink to ${sinks[$next_index]}" 29 | 30 | # Send notification 31 | dunstify --urgency="low" --icon="soundcard" "Switched Audio Device" 32 | -------------------------------------------------------------------------------- /config/picom/picom.conf: -------------------------------------------------------------------------------- 1 | # ┌──────────────────────┐ 2 | # │ ░█▀█░▀█▀░█▀▀░█▀█░█▄█ │ 3 | # │ ░█▀▀░░█░░█░░░█░█░█░█ │ 4 | # │ ░▀░░░▀▀▀░▀▀▀░▀▀▀░▀░▀ │ 5 | # └──────────────────────┘ 6 | 7 | # General 8 | backend = "glx"; 9 | vsync = true; 10 | 11 | # Shadows 12 | shadow = true; 13 | 14 | # Corners 15 | corner-radius = 6; 16 | 17 | # Animations 18 | animations = ({ 19 | triggers = [ "geometry" ]; 20 | preset = "geometry-change"; 21 | }, { 22 | triggers = [ "open", "show" ]; 23 | preset = "appear"; 24 | }, { 25 | triggers = [ "close", "hide" ]; 26 | preset = "disappear"; 27 | }); 28 | 29 | # Settings 30 | rules = ({ 31 | # Fix shadow related bugs on small UI elements 32 | match = "window_type = 'menu' || role = 'popup' || role = 'bubble'"; 33 | shadow = false; 34 | }, { 35 | # Do not round corners on fullscreen or when there are visual borders 36 | match = "fullscreen || window_type = 'tooltip'"; 37 | corner-radius = 0; 38 | }, { 39 | # Handle corner radius directly from Polybar and Rofi 40 | match = "class_g = 'Polybar' || class_g = 'Rofi'"; 41 | full-shadow = true; 42 | corner-radius = 0; 43 | }, { 44 | # Fix visual bugs on Flameshot but exclude its file chooser 45 | match = "class_g = 'flameshot' && window_type != 'dialog'"; 46 | shadow = false; 47 | corner-radius = 0; 48 | }); 49 | -------------------------------------------------------------------------------- /config/omp/theme.toml: -------------------------------------------------------------------------------- 1 | # ┌──────────────────────────────────────┐ 2 | # │ ░█▀█░█░█░░░█▄█░█░█░░░█▀█░█▀█░█▀▀░█░█ │ 3 | # │ ░█░█░█▀█░░░█░█░░█░░░░█▀▀░█░█░▀▀█░█▀█ │ 4 | # │ ░▀▀▀░▀░▀░░░▀░▀░░▀░░░░▀░░░▀▀▀░▀▀▀░▀░▀ │ 5 | # └──────────────────────────────────────┘ 6 | 7 | version = 3 8 | 9 | [[blocks]] 10 | type = "prompt" 11 | alignment = "left" 12 | 13 | [[blocks.segments]] 14 | template = " {{ .UserName }} on" 15 | foreground = "lightGreen" 16 | type = "session" 17 | style = "plain" 18 | 19 | [blocks.segments.properties] 20 | cache_duration = "none" 21 | 22 | [[blocks.segments]] 23 | template = "  {{ .Path }} " 24 | foreground = "lightBlue" 25 | type = "path" 26 | style = "plain" 27 | 28 | [blocks.segments.properties] 29 | cache_duration = "none" 30 | folder_separator_icon = "/" 31 | style = "full" 32 | 33 | [[blocks.segments]] 34 | template = "{{ .UpstreamIcon }}{{ .HEAD }}{{ if gt .StashCount 0 }}  {{ .StashCount }}{{ end }} " 35 | foreground = "#14A5AE" 36 | powerline_symbol = "" 37 | type = "git" 38 | style = "plain" 39 | 40 | [blocks.segments.properties] 41 | cache_duration = "none" 42 | fetch_stash_count = true 43 | fetch_upstream_icon = true 44 | 45 | [[blocks]] 46 | type = "prompt" 47 | alignment = "left" 48 | newline = true 49 | 50 | [[blocks.segments]] 51 | template = " " 52 | foreground = "#cd5e42" 53 | type = "root" 54 | style = "plain" 55 | 56 | [blocks.segments.properties] 57 | cache_duration = "none" 58 | 59 | [[blocks.segments]] 60 | template = "# " 61 | foreground = "lightRed" 62 | type = "text" 63 | style = "plain" 64 | 65 | [blocks.segments.properties] 66 | cache_duration = "none" 67 | -------------------------------------------------------------------------------- /config/polybar/scripts/weather.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Load environment variables 4 | if [ -e ~/.env ]; then 5 | source ~/.env 6 | else 7 | echo "Unknown" 8 | exit 1 9 | fi 10 | 11 | # OpenWeatherMap API URL 12 | url="https://api.openweathermap.org/data/2.5/weather?id=${WEATHER_LOCATION_ID}&appid=${WEATHER_API_KEY}&units=metric" 13 | 14 | # Get the weather data from the API 15 | if ping -q -c 1 -W 1 cloudflare.com &> /dev/null; then 16 | weather_data=$(curl -s $url) 17 | 18 | # Extract temperature and icon from the JSON response 19 | temp_raw=$(echo $weather_data | grep -o '"temp":[^,]*' | cut -d: -f2) 20 | temp_rounded=$(printf "%.0f" $temp_raw) 21 | icon=$(echo $weather_data | grep -o '"icon":"[^"]*' | cut -d'"' -f4) 22 | 23 | # Convert the icon code to a corresponding symbol 24 | case $icon in 25 | "01d") weather_icon="󰖨 ";; # Clear sky (day) 26 | "02d") weather_icon=" ";; # Few clouds (day) 27 | "03d") weather_icon=" ";; # Scattered clouds (day) 28 | "04d") weather_icon=" ";; # Broken clouds (day) 29 | "09d") weather_icon=" ";; # Shower rain (day) 30 | "10d") weather_icon=" ";; # Rain (day) 31 | "11d") weather_icon=" ";; # Thunderstorm (day) 32 | "13d") weather_icon=" ";; # Snow (day) 33 | "50d") weather_icon="󰍜 ";; # Mist (day) 34 | "01n") weather_icon="󰽧 ";; # Clear sky (night) 35 | "02n") weather_icon=" ";; # Few clouds (night) 36 | "03n") weather_icon=" ";; # Scattered clouds (night) 37 | "04n") weather_icon=" ";; # Broken clouds (night) 38 | "09n") weather_icon=" ";; # Shower rain (night) 39 | "10n") weather_icon=" ";; # Rain (night) 40 | "11n") weather_icon=" ";; # Thunderstorm (night) 41 | "13n") weather_icon=" ";; # Snow (night) 42 | "50n") weather_icon="󰍜 ";; # Mist (night) 43 | *) weather_icon=" ";; 44 | esac 45 | 46 | # Display the result 47 | echo "$temp_rounded°C" 48 | else 49 | # No internet connection 50 | echo "Unknown" 51 | fi 52 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 |

Linux Dotfiles

3 |

My Desktop Configuration

4 |
5 |
6 | 7 | Showcase 8 | 9 | ## 🖇️ Dependencies 10 | 11 | You can read about the packages I use on the [wiki](https://github.com/edu-flores/linux-dotfiles/wiki). To replicate my setup, run `scripts/install.sh` on a fresh Arch Linux install. Here's a quick summary about the main packages used: 12 | 13 | | Usage | Package | 14 | |----------------------|-----------| 15 | | Window Manager | i3 | 16 | | Status Bar | Polybar | 17 | | Terminal Emulator | Alacritty | 18 | | Notification Daemon | Dunst | 19 | | Compositor | Picom | 20 | | Launcher & Applets | Rofi | 21 | 22 | Some of the status bar modules need manual configuration. Check `.env.example` for guidance. 23 | 24 | ### Weather Setup 25 | 26 | To enable the weather module, create a `~/.env` file with your location ID and [OpenWeatherMap](https://openweathermap.org/) API key. 27 | 28 | ### Audio Setup 29 | 30 | Use `pactl list short sinks` to find your audio device IDs and configure them in the `.env` file. 31 | 32 | ## ⌨️ Keybindings 33 | 34 | ```bash 35 | # Switch between workspaces 36 | bindsym $mod+Tab workspace back_and_forth 37 | 38 | # Center focused window 39 | bindsym $mod+Shift+c move position center 40 | 41 | # Open color picker 42 | bindsym $mod+o --release exec xcolor -s -S 3 43 | 44 | # Show clipboard history 45 | bindsym $mod+v exec CM_LAUNCHER=rofi clipmenu -config ~/.config/rofi/clipboard.rasi -i 46 | 47 | # Clear clipboard history 48 | bindsym $mod+Shift+v exec clipdel -d ".*" 49 | 50 | # Launch applications 51 | bindsym $mod+space exec rofi -config ~/.config/rofi/rofi.rasi -show drun 52 | 53 | # Switch to light mode 54 | bindsym $mod+bracketleft exec ~/.config/i3/scripts/theme.sh light 55 | 56 | # Switch to dark mode 57 | bindsym $mod+bracketright exec ~/.config/i3/scripts/theme.sh dark 58 | 59 | # Take a screenshot 60 | bindsym Print exec XDG_CURRENT_DESKTOP=X-Cinnamon flameshot gui 61 | ``` 62 | 63 | ## ⚠️ Disclaimer 64 | 65 | These dotfiles are under active development. I recently moved from a retro to a modern design. For the older setup, check the `prev` branch. 66 | -------------------------------------------------------------------------------- /config/neofetch/config.conf: -------------------------------------------------------------------------------- 1 | # ┌──────────────────────────────────┐ 2 | # │ ░█▀█░█▀▀░█▀█░█▀▀░█▀▀░▀█▀░█▀▀░█░█ │ 3 | # │ ░█░█░█▀▀░█░█░█▀▀░█▀▀░░█░░█░░░█▀█ │ 4 | # │ ░▀░▀░▀▀▀░▀▀▀░▀░░░▀▀▀░░▀░░▀▀▀░▀░▀ │ 5 | # └──────────────────────────────────┘ 6 | 7 | # Show design in terminal 8 | print_info() { 9 | prin 10 | info "\n \n \n \n" title 11 | info "\n \n \n \n \n" local_ip 12 | prin 13 | # System 14 | info "\n \n \n \n \n \n ${color4} OS ${color6} " distro 15 | info "\n \n ${color4} Kernel ${color6} 󰹻" kernel 16 | info "${color4} Packages ${color6} " packages 17 | prin 18 | # Software 19 | info "\n \n \n \n \n \n ${color4} WM ${color6} 󰕮" wm 20 | info "\n \n \n ${color4} Shell ${color6} 󱆃" shell 21 | info "${color4} Terminal ${color6} " term 22 | prin 23 | # Stats 24 | info "\n \n \n \n \n ${color4} CPU ${color6} " cpu_usage 25 | info "\n \n \n \n ${color4} Disk ${color6} " disk 26 | info "\n \n ${color4} Memory ${color6} " memory 27 | prin "\n ${color8}▂▂▂ ${color9}▂▂▂ ${color10}▂▂▂ ${color11}▂▂▂ ${color12}▂▂▂ ${color13}▂▂▂ ${color14}▂▂▂ ${color15}▂▂▂" 28 | prin "\n ${color8}███ ${color9}███ ${color10}███ ${color11}███ ${color12}███ ${color13}███ ${color14}███ ${color15}███" 29 | } 30 | 31 | # Hide OS architecture 32 | os_arch="off" 33 | 34 | # Change memory output unit 35 | memory_unit="gib" 36 | 37 | # Hide $SHELL version 38 | shell_version="off" 39 | 40 | # Do not append anything to the disk subtitle 41 | disk_subtitle="none" 42 | 43 | # Hide disk percentage 44 | disk_percent="off" 45 | 46 | # Text colors 47 | colors=(4 6 7 4 6 7 7) 48 | 49 | # Replace the default separator 50 | separator=" " 51 | 52 | # Ascii colors 53 | ascii_colors=(6 4) 54 | 55 | # Gap between image and text 56 | gap=6 57 | 58 | # Colors 59 | color0="\e[30m" # Black 60 | color1="\e[31m" # Red 61 | color2="\e[32m" # Green 62 | color3="\e[33m" # Yellow 63 | color4="\e[34m" # Blue 64 | color5="\e[35m" # Magenta 65 | color6="\e[36m" # Cyan 66 | color7="\e[37m" # White 67 | color8="\e[90m" # Bright Black 68 | color9="\e[91m" # Bright Red 69 | color10="\e[92m" # Bright Green 70 | color11="\e[93m" # Bright Yellow 71 | color12="\e[94m" # Bright Blue 72 | color13="\e[95m" # Bright Magenta 73 | color14="\e[96m" # Bright Cyan 74 | color15="\e[97m" # Bright White 75 | -------------------------------------------------------------------------------- /config/i3/scripts/theme.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Toggle dark and light if no specific theme is passed 4 | if [[ -z "$1" || "$1" = "toggle" ]]; then 5 | current_theme=$(awk '/@theme/ {print $2}' ~/.config/rofi/rofi.rasi | tr -d '"') 6 | [ "$current_theme" = "dark" ] && theme="light" || theme="dark" 7 | else 8 | # Select a theme based on the user's choice 9 | case $1 in 10 | "light") theme="light" ;; 11 | "dark") theme="dark" ;; 12 | *) echo "Invalid theme selection." && exit 1 ;; 13 | esac 14 | fi 15 | 16 | # Set variables based on the selected theme 17 | case $theme in 18 | light) 19 | gtk_theme="adw-gtk" 20 | background="#ffffff" 21 | foreground="#333333" 22 | notification_icon="weather-clear" 23 | notification_title="Light theme" 24 | ;; 25 | dark) 26 | gtk_theme="adw-gtk3-dark" 27 | background="#1e1e1e" 28 | foreground="#ffffff" 29 | notification_icon="weather-clear-night" 30 | notification_title="Dark theme" 31 | ;; 32 | esac 33 | 34 | # Polybar 35 | sed -i "s/themes\/.*\.ini/themes\/$theme\.ini/" ~/.config/polybar/polybar.ini 36 | source ~/.config/i3/scripts/polybar.sh 37 | 38 | # i3 39 | sed -i "s/themes\/.*/themes\/$theme/" ~/.config/i3/config 40 | i3 reload 41 | 42 | # Dunst 43 | prev_pause_level=$(dunstctl get-pause-level) && pkill dunst 44 | sed -i "s/background = \".*\"/background = \"$background\"/" ~/.config/dunst/dunstrc 45 | sed -i "s/foreground = \".*\"/foreground = \"$foreground\"/" ~/.config/dunst/dunstrc 46 | dunstctl set-pause-level $prev_pause_level 47 | 48 | # Gtk 49 | sed -i --follow-symlinks "s/Net\/ThemeName \".*\"/Net\/ThemeName \"$gtk_theme\"/" ~/.xsettingsd 50 | pkill -HUP xsettingsd 51 | 52 | # Alacritty 53 | sed -i "s/themes\/.*\.toml/themes\/$theme\.toml/" ~/.config/alacritty/alacritty.toml 54 | 55 | # Rofi 56 | sed -i "s/@theme \".*\"/@theme \"$theme\"/" ~/.config/rofi/rofi.rasi 57 | sed -i "s/@theme \".*\"/@theme \"$theme\"/" ~/.config/rofi/clipboard.rasi 58 | sed -i "s/@theme \".*\"/@theme \"$theme\"/" ~/.config/rofi/power.rasi 59 | 60 | # Flameshot 61 | printf "[General]\nuiColor=%s\ncontrastUiColor=%s\n" "$background" "$foreground" > ~/.config/flameshot/flameshot.ini 62 | 63 | # Send notification 64 | dunstify --urgency="low" --icon="$notification_icon" "$notification_title" 65 | -------------------------------------------------------------------------------- /config/i3/scripts/lockscreen.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Colors 4 | TRANSPARENT="#00000000" 5 | WHITE="#ffffff" 6 | BLACK="#000000" 7 | URGENT="#ff7043" 8 | 9 | # Fonts 10 | UI_FONT="Inter SemiBold" 11 | NERD_FONT="JetBrainsMono NFP SemiBold" 12 | 13 | # Wallpaper 14 | current_wallpaper=$(awk '{print $4}' ~/.fehbg | tr -d "'") 15 | blurred_wallpaper="/tmp/blurred_wallpaper.png" 16 | ffmpeg -i $current_wallpaper -vf "gblur=sigma=5" $blurred_wallpaper -y > /dev/null 2>&1 17 | 18 | # Pause notifications 19 | pause_level=$(dunstctl get-pause-level) 20 | dunstctl set-paused true 21 | 22 | # Start lockscreen 23 | i3lock \ 24 | --nofork \ 25 | --fill \ 26 | --clock \ 27 | --radius 15 \ 28 | --ring-width 5 \ 29 | \ 30 | --inside-color $TRANSPARENT \ 31 | --ring-color $WHITE \ 32 | --insidever-color $WHITE \ 33 | --ringver-color $WHITE \ 34 | --insidewrong-color $URGENT \ 35 | --ringwrong-color $WHITE \ 36 | --line-color $TRANSPARENT \ 37 | --keyhl-color $BLACK \ 38 | --bshl-color $URGENT \ 39 | --separator-color $WHITE \ 40 | --verif-color $TRANSPARENT \ 41 | --wrong-color $TRANSPARENT \ 42 | --modif-color $TRANSPARENT \ 43 | --layout-color $TRANSPARENT \ 44 | --time-color $WHITE \ 45 | --date-color $WHITE \ 46 | --greeter-color $WHITE \ 47 | \ 48 | --time-str "%I:%M %p" \ 49 | --date-str "%A %d %B" \ 50 | --verif-text "" \ 51 | --wrong-text "" \ 52 | --noinput-text "" \ 53 | --lock-text "" \ 54 | --lockfailed-text "" \ 55 | --greeter-text "" \ 56 | --no-modkey-text \ 57 | \ 58 | --time-font "$UI_FONT" \ 59 | --date-font "$UI_FONT" \ 60 | --greeter-font "$NERD_FONT" \ 61 | \ 62 | --verif-size "18" \ 63 | --time-size "64" \ 64 | --date-size "40" \ 65 | --greeter-size "24" \ 66 | \ 67 | --ind-pos x+w-60:y+60 \ 68 | --time-pos x/2+w/2:y/2+h/2 \ 69 | --date-pos x/2+w/2:y/2+h/2+60 \ 70 | --greeter-pos ix-50:iy+8 \ 71 | \ 72 | --image "$blurred_wallpaper" 73 | 74 | # Restore notifications 75 | dunstctl set-pause-level $pause_level 76 | -------------------------------------------------------------------------------- /config/zsh/.zshrc: -------------------------------------------------------------------------------- 1 | # ┌──────────────┐ 2 | # │ ░▀▀█░█▀▀░█░█ │ 3 | # │ ░▄▀░░▀▀█░█▀█ │ 4 | # │ ░▀▀▀░▀▀▀░▀░▀ │ 5 | # └──────────────┘ 6 | 7 | # Bindings 8 | bindkey "^[[1;5C" forward-word 9 | bindkey "^[[1;5D" backward-word 10 | bindkey "^H" backward-kill-word 11 | bindkey "^[[3;5~" kill-word 12 | bindkey "^[[3~" delete-char 13 | bindkey "^[[H" beginning-of-line 14 | bindkey "^[[F" end-of-line 15 | bindkey "^[[A" history-search-backward 16 | bindkey "^[[B" history-search-forward 17 | 18 | # Plugins 19 | source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh 20 | source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh 21 | 22 | # Autosuggestions 23 | HISTFILE=~/.zsh_history 24 | HISTSIZE=1000 25 | HISTDUP=erase 26 | SAVEHIST=$HISTSIZE 27 | setopt appendhistory # Append to history file instead of overwriting 28 | setopt sharehistory # Share history across all sessions 29 | setopt hist_ignore_space # Ignore commands prefixed with a space 30 | setopt hist_ignore_all_dups # Remove all duplicate entries from history 31 | setopt hist_save_no_dups # Don't save duplicate commands in history 32 | setopt hist_ignore_dups # Ignore consecutive duplicate commands 33 | setopt hist_find_no_dups # Skip duplicates during history search 34 | setopt interactive_comments # Allow comments in interactive shell 35 | 36 | # Completions 37 | autoload -Uz compinit && compinit 38 | export LS_COLORS="di=34:ln=36:so=32:pi=35:ex=31:bd=44;37:cd=44;37:su=41;30:sg=46;30:tw=42;30:ow=43;30" 39 | zstyle ":completion:*" matcher-list "m:{a-z}={A-Za-z}" 40 | zstyle ":completion:*" list-colors "${(s.:.)LS_COLORS}" 41 | 42 | # Aliases 43 | alias ls="eza --icons --hyperlink --group-directories-first" 44 | alias ll="eza --long --all --icons --hyperlink --group-directories-first --bytes --git --time-style='+%d %B %Y, %I:%M %p'" 45 | alias ld="ls --only-dirs" 46 | alias lf="ls --only-files" 47 | alias lt="ls --tree --git-ignore" 48 | alias editpick='file=$(fd --type f --hidden | fzf --preview="bat --color=always --theme=ansi {}") && [ -n "$file" ] && nano "$file"' 49 | alias cat="bat --paging=never --style=plain --theme=ansi" 50 | alias more="bat --paging=always --theme=ansi" 51 | alias grep="rg" 52 | alias df="duf --only=local" 53 | alias find="fd" 54 | alias Windows="sudo grub-reboot 2 && sudo shutdown -r now" 55 | alias xcopy="xsel -ib" 56 | alias xpaste="xsel -ob" 57 | 58 | # Customize fzf style 59 | export FZF_DEFAULT_OPTS="--color=gutter:-1,bg+:-1,fg+:-1 --height 70% --reverse" 60 | export FZF_CTRL_T_COMMAND="fd --type f" 61 | 62 | # Set up fzf key bindings and fuzzy completion 63 | source <(fzf --zsh) 64 | 65 | # Initialize zoxide 66 | eval "$(zoxide init --cmd cd zsh)" 67 | 68 | # Theme 69 | eval "$(oh-my-posh init zsh --config ~/.config/omp/theme.toml)" 70 | -------------------------------------------------------------------------------- /config/rofi/rofi.rasi: -------------------------------------------------------------------------------- 1 | // ┌──────────────────┐ 2 | // │ ░█▀▄░█▀█░█▀▀░▀█▀ │ 3 | // │ ░█▀▄░█░█░█▀▀░░█░ │ 4 | // │ ░▀░▀░▀▀▀░▀░░░▀▀▀ │ 5 | // └──────────────────┘ 6 | 7 | /* Settings */ 8 | configuration { 9 | font: "Inter SemiBold 10.5"; 10 | show-icons: true; 11 | icon-theme: "MoreWaita"; 12 | modi: "drun,window,recursivebrowser,calculator:~/.config/rofi/scripts/calculator.sh"; 13 | display-drun: "⎇ 1 󰕰"; 14 | display-window: "⎇ 2 "; 15 | display-recursivebrowser: "⎇ 3 "; 16 | display-calculator: "⎇ 4 󰃬"; 17 | window-format: "{t}"; 18 | window-thumbnail: true; 19 | terminal: "/usr/bin/alacritty"; 20 | kb-element-prev: ""; 21 | kb-element-next: ""; 22 | kb-mode-previous: "ISO_Left_Tab"; 23 | kb-mode-next: "Tab"; 24 | } 25 | 26 | /* Styling */ 27 | @theme "dark" 28 | 29 | * { 30 | spacing: 0; 31 | highlight: none; 32 | background-color: @background-alt; 33 | } 34 | 35 | window { 36 | width: 750; 37 | height: 425; 38 | border-radius: 6; 39 | } 40 | 41 | mainbox { 42 | children: [ inputbar, textbox-results, listview, footer ]; 43 | } 44 | 45 | spacer { 46 | content: ""; 47 | expand: true; 48 | background-color: transparent; 49 | } 50 | 51 | inputbar { 52 | children: [ entry, textbox-return-icon ]; 53 | padding: 15 20; 54 | background-color: @background-alt; 55 | } 56 | 57 | entry { 58 | background-color: inherit; 59 | color: @foreground; 60 | placeholder: "Start typing here..."; 61 | placeholder-color: @foreground-alt; 62 | vertical-align: 0.5; 63 | cursor: text; 64 | } 65 | 66 | textbox-return-icon { 67 | font: "JetBrainsMono NFP Regular 12"; 68 | content: "󰌑"; 69 | background-color: @raised; 70 | color: @foreground-alt; 71 | expand: false; 72 | padding: 0 6; 73 | border-radius: 3; 74 | margin: 0 0 0 8; 75 | } 76 | 77 | textbox-results { 78 | content: "Results"; 79 | expand: false; 80 | background-color: @background; 81 | color: @foreground-alt; 82 | padding: 15 20; 83 | } 84 | 85 | listview { 86 | padding: 0 20 10 20; 87 | background-color: @background; 88 | lines: 6; 89 | scrollbar: true; 90 | } 91 | 92 | element { 93 | background-color: inherit; 94 | border-radius: 10; 95 | padding: 10; 96 | spacing: 15; 97 | cursor: pointer; 98 | } 99 | 100 | element.selected { 101 | background-color: @selected; 102 | } 103 | 104 | element-icon { 105 | size: 25; 106 | background-color: inherit; 107 | cursor: pointer; 108 | } 109 | 110 | element-text { 111 | background-color: inherit; 112 | color: @foreground-alt; 113 | vertical-align: 0.5; 114 | cursor: pointer; 115 | } 116 | 117 | element-text.selected { 118 | color: @foreground; 119 | } 120 | 121 | scrollbar { 122 | handle-color: @scroll; 123 | margin: 0 0 0 10; 124 | background-color: inherit; 125 | handle-width: 4; 126 | } 127 | 128 | footer { 129 | children: [ mode-switcher, spacer, textbox-switch-icon, textbox-switch-text ]; 130 | orientation: horizontal; 131 | background-color: @background-alt; 132 | color: @foreground-alt; 133 | padding: 8 20; 134 | height: 200; 135 | expand: false; 136 | spacing: 5; 137 | } 138 | 139 | mode-switcher { 140 | background-color: inherit; 141 | color: inherit; 142 | spacing: 5; 143 | width: 300; 144 | } 145 | 146 | button { 147 | background-color: @raised; 148 | color: inherit; 149 | border-radius: 3; 150 | padding: 0 6; 151 | cursor: pointer; 152 | } 153 | 154 | button.selected { 155 | color: @foreground; 156 | } 157 | 158 | textbox-switch-icon { 159 | font: "JetBrainsMono NFP Regular 12"; 160 | content: "󰌒"; 161 | background-color: @raised; 162 | color: inherit; 163 | expand: false; 164 | padding: 0 6; 165 | border-radius: 3; 166 | } 167 | 168 | textbox-switch-text { 169 | content: "Switch mode"; 170 | background-color: inherit; 171 | color: inherit; 172 | vertical-align: 0.5; 173 | expand: false; 174 | } 175 | -------------------------------------------------------------------------------- /config/rofi/clipboard.rasi: -------------------------------------------------------------------------------- 1 | configuration { 2 | font: "Inter SemiBold 10.5"; 3 | } 4 | 5 | @theme "dark" 6 | 7 | * { 8 | spacing: 0; 9 | highlight: none; 10 | background-color: @background-alt; 11 | } 12 | 13 | window { 14 | width: 350; 15 | location: northeast; 16 | x-offset: -290; 17 | y-offset: 50; 18 | border-radius: 6; 19 | } 20 | 21 | mainbox { 22 | children: [ header, listview, inputbar ]; 23 | } 24 | 25 | spacer { 26 | content: ""; 27 | expand: true; 28 | background-color: transparent; 29 | } 30 | 31 | inputbar { 32 | children: [ entry, case-indicator, textbox-return-icon ]; 33 | padding: 15 20; 34 | background-color: @background-alt; 35 | } 36 | 37 | entry { 38 | background-color: inherit; 39 | color: @foreground; 40 | placeholder: "Search to copy..."; 41 | placeholder-color: @foreground-alt; 42 | vertical-align: 0.5; 43 | cursor: text; 44 | } 45 | 46 | case-indicator { 47 | background-color: inherit; 48 | color: @foreground-alt; 49 | padding: 0 6; 50 | border-radius: 3; 51 | vertical-align: 0.5; 52 | } 53 | 54 | textbox-return-icon { 55 | font: "JetBrainsMono NFP Regular 12"; 56 | content: "󰌑"; 57 | background-color: @raised; 58 | color: @foreground-alt; 59 | expand: false; 60 | padding: 0 6; 61 | border-radius: 3; 62 | margin: 0 0 0 8; 63 | } 64 | 65 | textbox-copied { 66 | content: "Copied texts: "; 67 | expand: false; 68 | background-color: @background; 69 | color: @foreground-alt; 70 | padding: 15 20; 71 | } 72 | 73 | listview { 74 | padding: 10 20; 75 | background-color: @background; 76 | scrollbar: true; 77 | fixed-height: false; 78 | dynamic: true; 79 | reverse: true; 80 | } 81 | 82 | element { 83 | background-color: inherit; 84 | border-radius: 10; 85 | padding: 10; 86 | spacing: 15; 87 | cursor: pointer; 88 | } 89 | 90 | element.selected { 91 | background-color: @selected; 92 | } 93 | 94 | element-text { 95 | background-color: inherit; 96 | color: @foreground-alt; 97 | vertical-align: 0.5; 98 | cursor: pointer; 99 | } 100 | 101 | element-text.selected { 102 | color: @foreground; 103 | } 104 | 105 | scrollbar { 106 | handle-color: @scroll; 107 | margin: 0 0 0 10; 108 | background-color: inherit; 109 | handle-width: 4; 110 | } 111 | 112 | header { 113 | children: [ textbox-clipboard, spacer, textbox-clear-icon, textbox-clear-text ]; 114 | orientation: horizontal; 115 | background-color: @background-alt; 116 | color: @foreground-alt; 117 | padding: 8 20; 118 | height: 200; 119 | expand: false; 120 | spacing: 5; 121 | } 122 | 123 | textbox-clipboard { 124 | content: "Clipboard"; 125 | background-color: @raised; 126 | color: @foreground; 127 | padding: 0 12; 128 | border-radius: 3; 129 | vertical-align: 0.5; 130 | expand: false; 131 | cursor: pointer; 132 | } 133 | 134 | textbox-case-icon { 135 | font: "JetBrainsMono NFP Regular 12"; 136 | content: "`"; 137 | background-color: @raised; 138 | color: inherit; 139 | expand: false; 140 | padding: 0 6; 141 | border-radius: 3; 142 | } 143 | 144 | textbox-case-text { 145 | content: "Case"; 146 | background-color: inherit; 147 | color: inherit; 148 | vertical-align: 0.5; 149 | expand: false; 150 | margin: 0 5 0 0; 151 | } 152 | 153 | textbox-clear-icon { 154 | font: "JetBrainsMono NFP Regular 12"; 155 | content: "󰖳 󰘶 V"; 156 | background-color: @raised; 157 | color: inherit; 158 | expand: false; 159 | padding: 0 6; 160 | border-radius: 3; 161 | } 162 | 163 | textbox-clear-text { 164 | content: "Clear"; 165 | background-color: inherit; 166 | color: inherit; 167 | vertical-align: 0.5; 168 | expand: false; 169 | } 170 | 171 | @media ( max-width: 1920 ) { 172 | window { 173 | height: 1000; 174 | width: 750; 175 | location: center; 176 | x-offset: 0; 177 | y-offset: 0; 178 | } 179 | } 180 | -------------------------------------------------------------------------------- /config/polybar/modules.ini: -------------------------------------------------------------------------------- 1 | # Module decorators 2 | 3 | [module/LEFT] 4 | type = custom/text 5 | label = "%{T2}%{T-}" 6 | label-padding-left = 1 7 | label-foreground = ${colors.raised} 8 | 9 | [module/RIGHT] 10 | type = custom/text 11 | label = "%{T2}%{T-}" 12 | label-padding-right = 1 13 | label-foreground = ${colors.raised} 14 | 15 | # Polybar modules 16 | 17 | [module/logo] 18 | type = custom/text 19 | label =  20 | label-padding = 2 21 | label-foreground = #1793d1 22 | click-left = rofi -config ~/.config/rofi/rofi.rasi -show drun 23 | click-right = rofi -config ~/.config/rofi/rofi.rasi -show window 24 | 25 | [module/terminal] 26 | type = custom/script 27 | interval = 0.5 28 | exec = [ "$(xdotool search --onlyvisible --class Alacritty)" ] && echo "%{F#ff7043}%{F-} Terminal" || echo " Terminal" 29 | format-background = ${colors.raised} 30 | format-overline = ${colors.background} 31 | format-underline = ${colors.background} 32 | format-padding = 2 33 | click-left = i3-msg '[con_mark="terminal"] scratchpad show' 34 | 35 | [module/explorer] 36 | type = custom/script 37 | interval = 0.5 38 | exec = [ "$(xdotool search --onlyvisible --class Nemo)" ] && echo "%{F#ff7043}%{F-} Explorer" || echo " Explorer" 39 | format-background = ${colors.raised} 40 | format-overline = ${colors.background} 41 | format-underline = ${colors.background} 42 | format-padding = 2 43 | click-left = i3-msg '[con_mark="explorer"] scratchpad show' 44 | 45 | [module/workspaces] 46 | type = internal/i3 47 | pin-workspaces = true 48 | reverse-scroll = false 49 | wrapping-scroll = false 50 | ws-icon-0 = 1; 51 | ws-icon-1 = 2;󰝚 52 | ws-icon-2 = 3; 53 | ws-icon-3 = 4;󱚌 54 | ws-icon-default =  55 | label-mode-padding = 2 56 | label-mode-foreground = ${colors.urgent} 57 | label-focused = %icon% 58 | label-focused-padding = 3 59 | label-focused-foreground = ${colors.foreground} 60 | label-unfocused = %icon% 61 | label-unfocused-padding = 3 62 | label-unfocused-foreground = ${colors.empty} 63 | label-visible = %icon% 64 | label-visible-padding = 3 65 | label-visible-foreground = ${colors.foreground-alt} 66 | label-urgent = %icon% 67 | label-urgent-padding = 3 68 | label-urgent-foreground = ${colors.urgent} 69 | label-mode = 󰲏 70 | 71 | [module/output] 72 | type = custom/script 73 | label-padding = 2 74 | interval = 0.5 75 | exec = ~/.config/polybar/scripts/audio_icon.sh 76 | click-left = ~/.config/polybar/scripts/audio_switcher.sh 77 | 78 | [module/volume] 79 | type = internal/pulseaudio 80 | use-ui-max = false 81 | format-volume = 82 | format-volume-padding = 2 83 | format-muted = 84 | format-muted-padding = 2 85 | bar-volume-width = 75 86 | bar-volume-fill = 󱪼 87 | bar-volume-empty = 󱪼 88 | bar-volume-indicator = "" 89 | bar-volume-gradient = false 90 | bar-volume-foreground-0 = ${colors.foreground} 91 | bar-volume-foreground-1 = ${colors.foreground} 92 | bar-volume-foreground-2 = ${colors.foreground} 93 | bar-volume-foreground-3 = ${colors.urgent} 94 | bar-volume-empty-foreground = ${colors.empty} 95 | 96 | [module/media] 97 | type = custom/script 98 | label-padding = 2 99 | interval = 0.5 100 | exec = [ "$(playerctl --player=spotify status 2> /dev/null)" = "Playing" ] && echo 󰏥 || echo 󰐌 101 | click-left = playerctl --player=spotify play-pause 102 | click-right = playerctl --player=spotify next 103 | double-click-right = playerctl --player=spotify previous 104 | 105 | [module/keyboard] 106 | type = internal/xkeyboard 107 | format = 108 | format-padding = 2 109 | label-layout = %icon% 110 | layout-icon-0 = us;󰌌 111 | layout-icon-1 = latam;%{F#ff7043}󰌓%{F} 112 | 113 | [module/clipboard] 114 | type = custom/text 115 | label = 󰅇 116 | label-padding = 2 117 | click-left = CM_LAUNCHER=rofi clipmenu -config ~/.config/rofi/clipboard.rasi -i 118 | 119 | [module/theme] 120 | type = custom/text 121 | label = 󰃝 122 | label-padding = 2 123 | click-left = ~/.config/i3/scripts/theme.sh toggle 124 | 125 | [module/notifications] 126 | type = custom/script 127 | label-padding = 2 128 | interval = 0.5 129 | exec = [ "$(dunstctl is-paused)" = "true" ] && echo "%{F#ff7043}󱏫%{F-}" || echo 󰂚 130 | click-left = dunstctl set-paused toggle 131 | 132 | [module/network] 133 | type = internal/network 134 | interval = 5 135 | interface-type = wired 136 | format-connected = 137 | label-connected =  138 | label-connected-padding = 2 139 | format-disconnected = 140 | label-disconnected =  141 | label-disconnected-padding = 2 142 | label-disconnected-foreground = ${colors.urgent} 143 | 144 | [module/temp] 145 | type = custom/script 146 | label-padding-left = 2 147 | interval = 600 148 | exec = echo "$(~/.config/polybar/scripts/weather.sh) at " 149 | click-left = ~/.config/polybar/scripts/calendar.sh 150 | scroll-up = ~/.config/polybar/scripts/calendar.sh next 151 | scroll-down = ~/.config/polybar/scripts/calendar.sh prev 152 | 153 | [module/date] 154 | type = custom/script 155 | label-padding-right = 2 156 | interval = 1 157 | exec = echo $(date +"%a %d %b, %I:%M %p") 158 | click-left = ~/.config/polybar/scripts/calendar.sh 159 | scroll-up = ~/.config/polybar/scripts/calendar.sh next 160 | scroll-down = ~/.config/polybar/scripts/calendar.sh prev 161 | 162 | [module/power] 163 | type = custom/text 164 | label = ⏼ 165 | label-padding = 2 166 | label-foreground = ${colors.urgent} 167 | click-left = ~/.config/polybar/scripts/power.sh 168 | -------------------------------------------------------------------------------- /scripts/install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Repo directory location 4 | SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" 5 | REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" 6 | 7 | # Intro 8 | echo "This script will set up your Linux environment." 9 | 10 | # Ask for confirmation 11 | read -p "Begin the installation? [Y/n]: " answer 12 | if [ "${answer:0:1}" = "Y" ] || [ "${answer:0:1}" = "y" ] || [ -z "$answer" ]; then 13 | echo "Exiting..." 14 | exit 0 15 | fi 16 | 17 | # Enter username full name 18 | read -p "Enter your full name: " name 19 | sudo chfn -f "$name" "$USER" 20 | 21 | # Update the system & install packages 22 | cat << "EOF" 23 | ___ __ 24 | / _ \___ _____/ /_____ ____ ____ ___ 25 | / ___/ _ `/ __/ '_/ _ `/ _ `/ -_|_-< 26 | /_/ \_,_/\__/_/\_\\_,_/\_, /\__/___/ 27 | /___/ 28 | 29 | EOF 30 | 31 | echo -e "\nUpdating the system..." 32 | sudo pacman -Syu --noconfirm 33 | 34 | # Customize package manager 35 | sudo sed -i "s/^#Color/Color/" /etc/pacman.conf 36 | sudo sed -i "s/^#ParallelDownloads = 5/ParallelDownloads = 5/" /etc/pacman.conf 37 | sudo sed -i "s/^#VerbosePkgLists/VerbosePkgLists/" /etc/pacman.conf 38 | 39 | # Set desired packages from the official and AUR repositories 40 | official_packages=( 41 | "xorg-server" "xorg-xinit" "xorg-xrandr" # X.Org 42 | "alacritty" "tmux" "zsh" "zsh-autosuggestions" "zsh-syntax-highlighting" # Terminal and shell 43 | "i3-wm" "polybar" "dunst" "rofi" "picom" "ly" "feh" # WM environment 44 | "neofetch" "xsettingsd" "xcolor" "clipmenu" "flameshot" "libqalculate" # Utilities 45 | "inter-font" "ttf-jetbrains-mono-nerd" # UI and monospaced fonts 46 | "noto-fonts" "noto-fonts-cjk" "noto-fonts-emoji" "noto-fonts-extras" # No-tofu fonts 47 | "pipewire" "pipewire-alsa" "pipewire-pulse" "pipewire-jack" "playerctl" # Audio 48 | "eza" "bat" "ripgrep" "zoxide" "fzf" "duf" "fd" "less" # Commands 49 | "obsidian" "nemo" # Apps 50 | ) 51 | aur_packages=( 52 | "i3lock-color" "oh-my-posh" "quintom-cursor-theme-git" "adw-gtk-theme-git" "morewaita-icon-theme-git" # Styling 53 | "google-chrome" "spotify" "visual-studio-code-bin" # Apps 54 | ) 55 | 56 | # Install packages from the official repositories 57 | echo -e "\nThe following packages will be installed from the official repositories: ${official_packages[*]}" 58 | read -p "Press Enter to continue..." 59 | for package in "${official_packages[@]}"; do 60 | if ! pacman -Qi "$package" &> /dev/null; then 61 | sudo pacman -S --noconfirm "$package" 62 | else 63 | echo "$package is already installed. Skipping..." 64 | fi 65 | done 66 | 67 | # Install the AUR helper 68 | echo -e "\nChecking for AUR helper (paru)..." 69 | if ! command -v paru &> /dev/null; then 70 | echo "Paru is not installed. Installing..." 71 | rm -rf ~/AUR 72 | mkdir -p ~/AUR 73 | git clone https://aur.archlinux.org/paru.git ~/AUR/paru 74 | if (cd ~/AUR/paru && makepkg -si --noconfirm); then 75 | echo "Paru installed successfully." 76 | else 77 | echo "Error: Paru installation failed. Exiting..." 78 | rm -rf ~/AUR 79 | exit 1 80 | fi 81 | else 82 | echo "Paru is already installed. Skipping installation..." 83 | fi 84 | 85 | # Install packages from the AUR repositories 86 | echo "The following packages will be installed from the AUR: ${aur_packages[*]}" 87 | for package in "${aur_packages[@]}"; do 88 | if ! paru -Qi "$package" &> /dev/null; then 89 | paru -S --noconfirm "$package" 90 | else 91 | echo "$package is already installed. Skipping..." 92 | fi 93 | done 94 | 95 | # Clean up AUR build directory 96 | echo "Cleaning up..." 97 | rm -rf ~/AUR 98 | 99 | # Misc config 100 | cat << "EOF" 101 | _____ ____ 102 | / ___/__ ___ / _(_)__ _ 103 | / /__/ _ \/ _ \/ _/ / _ `/ 104 | \___/\___/_//_/_//_/\_, / 105 | /___/ 106 | 107 | EOF 108 | 109 | # Change user shell to zsh 110 | echo -e "\nSetting up shell..." 111 | chsh -s $(which zsh) 112 | 113 | # Environment variables file 114 | echo -e "\nCreating a .env file..." 115 | cp $REPO_ROOT/.env.example ~/.env.test 116 | 117 | # Wallpapers 118 | wallpaper_dir="~/Pictures/Wallpapers/" 119 | echo -e "\nSetting up wallpapers..." 120 | mkdir -p $wallpaper_dir 121 | cp $REPO_ROOT/wallpapers/* $wallpaper_dir 122 | 123 | # Enable services 124 | echo -e "\nEnabling system services..." 125 | systemctl --user enable pipewire pipewire-pulse 126 | systemctl --user start pipewire pipewire-pulse 127 | sudo systemctl enable ly.service 128 | 129 | # Symlink config files 130 | echo -e "\nLinking config files..." 131 | "$REPO_ROOT/scripts/symlink.sh" 132 | 133 | # Create XDG user directories 134 | mkdir -p ~/Desktop ~/Documents ~/Downloads ~/Music ~/Pictures ~/Public ~/Templates ~/Videos 135 | 136 | # Enable NTP to automatically sync time 137 | sudo timedatectl set-ntp true 138 | 139 | # Configure keyboard options 140 | sudo localectl set-x11-keymap us,latam "" "" grp:rctrl_toggle,caps:swapescape,compose:ralt 141 | 142 | # Set libqalculate commands 143 | echo "set autocalc on" | qalc > /dev/null 144 | echo "set upxrates 7" | qalc > /dev/null 145 | 146 | # Notify user for remaining changes 147 | echo -e "\nInstallation completed. You'll need to manually: " 148 | echo " - Set up specific app configurations via their respective GUIs" 149 | echo " - Set up environment variables (for some status bar modules) in ~/.env" 150 | echo " - Install necessary GPU drivers (AMD or Nvidia)" 151 | echo -e "\nNote: Run xrandr to see your monitor identifiers, then adjust necessary configs." 152 | 153 | # Prompt for reboot 154 | read -p "Do you want to reboot now? [Y/n]: " answer 155 | if [ "${answer:0:1}" = "Y" ] || [ "${answer:0:1}" = "y" ] || [ -z "$answer" ]; then 156 | sudo reboot 157 | else 158 | echo "You can manually reboot later to apply the remaining changes." 159 | fi 160 | -------------------------------------------------------------------------------- /config/tmux/tmux.conf: -------------------------------------------------------------------------------- 1 | # ┌──────────────────┐ 2 | # │ ░▀█▀░█▄█░█░█░█░█ │ 3 | # │ ░░█░░█░█░█░█░▄▀▄ │ 4 | # │ ░░▀░░▀░▀░▀▀▀░▀░▀ │ 5 | # └──────────────────┘ 6 | 7 | ########## GENERAL ########## 8 | 9 | # Prefix key 10 | unbind C-b 11 | set -g prefix C-space 12 | bind C-space send-prefix 13 | 14 | # Reload configuration 15 | bind -n M-R source-file ~/.config/tmux/tmux.conf \; display '#[fill=terminal,bg=terminal,fg=yellow,align=centre]󰞌 #[fg=terminal]Reloading...' 16 | 17 | 18 | ########## GLOBAL ########## 19 | 20 | # Global variables 21 | max_windows=5 22 | 23 | # Remove zero-based numbering 24 | set -g base-index 1 25 | set -g pane-base-index 1 26 | 27 | # Enable mouse mode 28 | set -g mouse on 29 | 30 | # Prevent automatic copy 31 | set -g set-clipboard off 32 | 33 | # Decrement escape time 34 | set -g escape-time 10 35 | 36 | # Fix End and Home keys 37 | bind -n End send-key C-e 38 | bind -n Home send-key C-a 39 | 40 | 41 | ########## SESSIONS ########## 42 | 43 | # Create session 44 | bind -n M-C new-session 45 | 46 | # Rename session 47 | bind -n M-s command-prompt -p '#[fg=blue]󰏫 󰙅 #[fg=terminal]Rename session #[fg=magenta] ' 'rename-session "%%"' 48 | 49 | # Show session tree 50 | bind -n M-t choose-tree -Zw 51 | 52 | # Switch sessions 53 | bind -n M-K if '[ #{server_sessions} -gt 1 ]' 'switch-client -p' 54 | bind -n M-J if '[ #{server_sessions} -gt 1 ]' 'switch-client -n' 55 | bind -n M-P if '[ #{server_sessions} -gt 1 ]' 'switch-client -p' 56 | bind -n M-N if '[ #{server_sessions} -gt 1 ]' 'switch-client -n' 57 | 58 | 59 | ########## WINDOWS ########## 60 | 61 | # Rename window 62 | bind -n M-w command-prompt -p '#[fg=green]󰏫  #[fg=terminal]Rename window #[fg=magenta] ' 'rename-window "%%"' 63 | 64 | # Create window 65 | bind -n M-c if '[ "#{session_windows}" -lt $max_windows ]' 'new-window' 66 | 67 | # Kill window 68 | bind -n M-Q if '[ "#{session_windows}" -eq 1 ]' \ 69 | 'confirm-before -y -p "#[fg=yellow] #[fg=terminal]Are you sure you want to exit? #[fg=magenta][Y/n]  " kill-window' \ 70 | 'kill-window' 71 | 72 | # Windows back and forth 73 | bind -n M-Tab run 'tmux last-window' 74 | 75 | # Switch windows 76 | bind -n M-H if '[ #{session_windows} -gt 1 ]' 'previous-window' 77 | bind -n M-L if '[ #{session_windows} -gt 1 ]' 'next-window' 78 | bind -n M-p if '[ #{session_windows} -gt 1 ]' 'previous-window' 79 | bind -n M-n if '[ #{session_windows} -gt 1 ]' 'next-window' 80 | bind -n M-1 if 'tmux list-windows | grep -q "1:"' 'select-window -t 1' 'new-window -n 1' 81 | bind -n M-2 if 'tmux list-windows | grep -q "2:"' 'select-window -t 2' 'new-window -n 2' 82 | bind -n M-3 if 'tmux list-windows | grep -q "3:"' 'select-window -t 3' 'new-window -n 3' 83 | bind -n M-4 if 'tmux list-windows | grep -q "4:"' 'select-window -t 4' 'new-window -n 4' 84 | bind -n M-5 if 'tmux list-windows | grep -q "5:"' 'select-window -t 5' 'new-window -n 5' 85 | 86 | # Renumber windows 87 | bind -n M-! if 'tmux list-windows | grep -q "1:"' 'swap-window -t 1; select-window -t 1' 'move-window -t 1' 88 | bind -n M-@ if 'tmux list-windows | grep -q "2:"' 'swap-window -t 2; select-window -t 2' 'move-window -t 2' 89 | bind -n M-# if 'tmux list-windows | grep -q "3:"' 'swap-window -t 3; select-window -t 3' 'move-window -t 3' 90 | bind -n M-$ if 'tmux list-windows | grep -q "4:"' 'swap-window -t 4; select-window -t 4' 'move-window -t 4' 91 | bind -n M-% if 'tmux list-windows | grep -q "5:"' 'swap-window -t 5; select-window -t 5' 'move-window -t 5' 92 | 93 | 94 | ########## PANES ########## 95 | 96 | # Select pane 97 | bind -n M-m select-pane -m 98 | 99 | # Swap panes 100 | bind -n M-M run "tmux display -p '#{pane_id}' | xargs tmux swap-pane -d -t; tmux select-pane -m" 101 | 102 | # Zoom pane 103 | bind -n M-f resize-pane -Z 104 | 105 | # Kill pane 106 | bind -n M-q if '[ "#{session_windows}" -eq 1 -a "#{window_panes}" -eq 1 ]' \ 107 | 'confirm-before -y -p "#[fg=yellow] #[fg=terminal]Are you sure you want to exit? #[fg=magenta][Y/n]  " kill-pane' \ 108 | 'kill-pane' 109 | 110 | # Split pane 111 | bind -n M-z split-window -v -c "#{pane_current_path}" 112 | bind -n M-x split-window -h -c "#{pane_current_path}" 113 | 114 | # Break pane 115 | bind -n M-b if '[ "#{session_windows}" -lt $max_windows ]' 'break-pane' 116 | 117 | # Toggle layout 118 | bind -n M-space next-layout 119 | 120 | # Switch panes 121 | bind -n M-Left select-pane -L 122 | bind -n M-Down select-pane -D 123 | bind -n M-Up select-pane -U 124 | bind -n M-Right select-pane -R 125 | bind -n M-h select-pane -L 126 | bind -n M-j select-pane -D 127 | bind -n M-k select-pane -U 128 | bind -n M-l select-pane -R 129 | 130 | 131 | ########## COPY MODE ########## 132 | 133 | # Replace emacs bindings for vi bindings 134 | set -g mode-keys vi 135 | 136 | # Prevent window from jumping down after selecting text 137 | bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-selection -x 138 | 139 | 140 | ########## STYLING ########## 141 | 142 | # Empty line above the status bar 143 | if -F '#{!=:#{status},2}' { 144 | set -Fg status-format[1] '#{status-format[0]}' 145 | set -g status-format[0] '' 146 | set -g status 2 147 | } 148 | 149 | # Terminal colors 150 | set -g status-style "bg=terminal" 151 | set -g message-style "fill=terminal,bg=terminal,fg=terminal" 152 | 153 | # Left side of the status bar 154 | set -g status-left-length 30 155 | set -g status-left '#[fg=brightblue]#[bg=brightblue,fg=black] 󰙅 #{?client_prefix, , } #S #[bg=terminal,fg=brightblue] ' 156 | 157 | # Inactive windows format 158 | set -g window-status-format '  #{?#{==:#{window_index},1},󰎦,}#{?#{==:#{window_index},2},󰎩,}#{?#{==:#{window_index},3},󰎬,}#{?#{==:#{window_index},4},󰎮,}#{?#{==:#{window_index},5},󰎰,} #W #[fg=brightyellow]#{?window_last_flag,󰁯, } ' 159 | 160 | # Active window format 161 | set -g window-status-current-format ' #[fg=brightgreen,bold] #{?#{==:#{window_index},1},󰎤,}#{?#{==:#{window_index},2},󰎧,}#{?#{==:#{window_index},3},󰎪,}#{?#{==:#{window_index},4},󰎭,}#{?#{==:#{window_index},5},󰎱,}#[fg=terminal] #W #[fg=brightred]#{?window_zoomed_flag,󰁌, } ' 162 | 163 | # Right side of the status bar 164 | set -g status-right-length 30 165 | mem_usage="#(free | awk '/^Mem/ {printf \"%.1f\", $3 / 1024 / 1024}') GiB" 166 | cpu_usage="#(grep 'cpu ' /proc/stat | awk '{printf \"%.1f\", ($2+$4)*100/($2+$4+$5)}')%" 167 | set -g status-right "#[fg=brightblack] #[bg=brightblack,fg=brightwhite] $mem_usage  #[bg=brightgreen,fg=brightblack]#[fg=black] $cpu_usage  #[bg=terminal,fg=brightgreen]" 168 | 169 | # Panel borders color 170 | set -g pane-border-style "fg=brightblack" 171 | set -g pane-active-border-style "fg=brightwhite" 172 | 173 | # Mode style 174 | set -g mode-style "bg=brightblack,fg=brightwhite" 175 | -------------------------------------------------------------------------------- /config/i3/config: -------------------------------------------------------------------------------- 1 | # ┌──────────────────────┐ 2 | # │ ░▀█▀░▀▀█░░░░░█░█░█▄█ │ 3 | # │ ░░█░░░▀▄░▄▄▄░█▄█░█░█ │ 4 | # │ ░▀▀▀░▀▀░░░░░░▀░▀░▀░▀ │ 5 | # └──────────────────────┘ 6 | 7 | # Default modifier 8 | set $mod Mod4 9 | 10 | # Font for window titles 11 | font pango: Inter SemiBold 11 12 | 13 | # Drag floating windows 14 | floating_modifier $mod 15 | 16 | # Move tiling windows 17 | tiling_drag modifier titlebar 18 | 19 | # Start a terminal 20 | bindsym $mod+Return exec --no-startup-id alacritty 21 | 22 | # Kill focused window 23 | bindsym $mod+Shift+q kill 24 | 25 | # Change focus 26 | bindsym $mod+h focus left 27 | bindsym $mod+j focus down 28 | bindsym $mod+k focus up 29 | bindsym $mod+l focus right 30 | bindsym $mod+Left focus left 31 | bindsym $mod+Down focus down 32 | bindsym $mod+Up focus up 33 | bindsym $mod+Right focus right 34 | 35 | # Move focused window 36 | bindsym $mod+Shift+h move left 37 | bindsym $mod+Shift+j move down 38 | bindsym $mod+Shift+k move up 39 | bindsym $mod+Shift+l move right 40 | bindsym $mod+Shift+Left move left 41 | bindsym $mod+Shift+Down move down 42 | bindsym $mod+Shift+Up move up 43 | bindsym $mod+Shift+Right move right 44 | 45 | # Split in horizontal orientation 46 | bindsym $mod+x split h 47 | 48 | # Split in vertical orientation 49 | bindsym $mod+z split v 50 | 51 | # Enter fullscreen mode for the focused container 52 | bindsym $mod+f fullscreen toggle 53 | 54 | # Change container layout (stacked, tabbed, toggle split) 55 | bindsym $mod+s layout stacking 56 | bindsym $mod+w layout tabbed 57 | bindsym $mod+e layout toggle split 58 | 59 | # Toggle tiling / floating 60 | bindsym $mod+Shift+space floating toggle 61 | 62 | # Change focus between tiling / floating windows 63 | bindsym $mod+t focus mode_toggle 64 | 65 | # Focus the parent container 66 | bindsym $mod+a focus parent 67 | 68 | # Focus the child container 69 | bindsym $mod+d focus child 70 | 71 | # Define names for default workspaces 72 | set $ws1 "1" 73 | set $ws2 "2" 74 | set $ws3 "3" 75 | set $ws4 "4" 76 | set $ws5 "5" 77 | set $ws6 "6" 78 | set $ws7 "7" 79 | set $ws8 "8" 80 | set $ws9 "9" 81 | set $ws10 "10" 82 | 83 | # Switch to workspace 84 | bindsym $mod+1 workspace number $ws1 85 | bindsym $mod+2 workspace number $ws2 86 | bindsym $mod+3 workspace number $ws3 87 | bindsym $mod+4 workspace number $ws4 88 | bindsym $mod+5 workspace number $ws5 89 | bindsym $mod+6 workspace number $ws6 90 | bindsym $mod+7 workspace number $ws7 91 | bindsym $mod+8 workspace number $ws8 92 | bindsym $mod+9 workspace number $ws9 93 | bindsym $mod+0 workspace number $ws10 94 | 95 | # Move focused container to workspace 96 | bindsym $mod+Shift+1 move container to workspace number $ws1 97 | bindsym $mod+Shift+2 move container to workspace number $ws2 98 | bindsym $mod+Shift+3 move container to workspace number $ws3 99 | bindsym $mod+Shift+4 move container to workspace number $ws4 100 | bindsym $mod+Shift+5 move container to workspace number $ws5 101 | bindsym $mod+Shift+6 move container to workspace number $ws6 102 | bindsym $mod+Shift+7 move container to workspace number $ws7 103 | bindsym $mod+Shift+8 move container to workspace number $ws8 104 | bindsym $mod+Shift+9 move container to workspace number $ws9 105 | bindsym $mod+Shift+0 move container to workspace number $ws10 106 | 107 | # Reload the configuration file 108 | bindsym $mod+Shift+f reload 109 | 110 | # Restart i3 inplace 111 | bindsym $mod+Shift+r restart 112 | 113 | # Resize window 114 | bindsym $mod+r mode "resize" 115 | mode "resize" { 116 | # Precise movement 117 | bindsym $mod+h resize shrink width 1 px or 1 ppt 118 | bindsym $mod+j resize shrink height 1 px or 1 ppt 119 | bindsym $mod+k resize grow height 1 px or 1 ppt 120 | bindsym $mod+l resize grow width 1 px or 1 ppt 121 | bindsym $mod+Left resize shrink width 1 px or 1 ppt 122 | bindsym $mod+Down resize shrink height 1 px or 1 ppt 123 | bindsym $mod+Up resize grow height 1 px or 1 ppt 124 | bindsym $mod+Right resize grow width 1 px or 1 ppt 125 | 126 | # Larger movement 127 | bindsym $mod+Shift+h resize shrink width 5 px or 5 ppt 128 | bindsym $mod+Shift+j resize shrink height 5 px or 5 ppt 129 | bindsym $mod+Shift+k resize grow height 5 px or 5 ppt 130 | bindsym $mod+Shift+l resize grow width 5 px or 5 ppt 131 | bindsym $mod+Shift+Left resize shrink width 5 px or 5 ppt 132 | bindsym $mod+Shift+Down resize shrink height 5 px or 5 ppt 133 | bindsym $mod+Shift+Up resize grow height 5 px or 5 ppt 134 | bindsym $mod+Shift+Right resize grow width 5 px or 5 ppt 135 | 136 | # Back to normal 137 | bindsym $mod+Return mode "default" 138 | bindsym $mod+Escape mode "default" 139 | bindsym $mod+r mode "default" 140 | } 141 | 142 | # Workspaces & Layouts 143 | set $monitor1 "HDMI-0" 144 | set $monitor2 "DP-0" 145 | workspace $ws1 output $monitor1 146 | workspace $ws2 output $monitor1 147 | workspace $ws3 output $monitor1 148 | workspace $ws4 output $monitor1 149 | workspace $ws5 output $monitor1 150 | workspace $ws6 output $monitor1 151 | workspace $ws7 output $monitor1 152 | workspace $ws8 output $monitor1 153 | workspace $ws9 output $monitor1 154 | workspace $ws10 output $monitor2 155 | for_window [workspace=$ws6] split toggle 156 | for_window [workspace=$ws9] floating enable 157 | 158 | # Startup 159 | exec --no-startup-id ~/.config/i3/scripts/monitors.sh $monitor1 $monitor2 160 | exec --no-startup-id ~/.config/i3/scripts/layouts.sh 161 | exec --no-startup-id ~/.config/i3/scripts/polybar.sh 162 | exec --no-startup-id xsettingsd 163 | exec --no-startup-id clipmenud 164 | exec --no-startup-id picom 165 | exec --no-startup-id dunst 166 | 167 | # Scratchpad 168 | bindsym $mod+Shift+BackSpace move scratchpad 169 | bindsym $mod+BackSpace scratchpad show 170 | bindsym $mod+Shift+minus floating enable, sticky enable, mark terminal, move scratchpad 171 | bindsym $mod+Shift+equal floating enable, sticky enable, mark explorer, move scratchpad 172 | bindsym $mod+minus [con_mark="terminal"] scratchpad show 173 | bindsym $mod+equal [con_mark="explorer"] scratchpad show 174 | 175 | # Bindings 176 | bindsym $mod+Tab workspace back_and_forth 177 | bindsym $mod+Shift+c move position center 178 | bindsym $mod+o --release exec xcolor -s -S 3 179 | bindsym $mod+Shift+v exec clipdel -d ".*" 180 | bindsym $mod+v exec CM_LAUNCHER=rofi clipmenu -config ~/.config/rofi/clipboard.rasi -i 181 | bindsym $mod+space exec rofi -config ~/.config/rofi/rofi.rasi -show drun 182 | bindsym $mod+bracketleft exec ~/.config/i3/scripts/theme.sh light 183 | bindsym $mod+bracketright exec ~/.config/i3/scripts/theme.sh dark 184 | bindsym Print exec XDG_CURRENT_DESKTOP=X-Cinnamon flameshot gui 185 | 186 | # Media 187 | bindsym XF86AudioRaiseVolume exec wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ --limit 1.0 188 | bindsym XF86AudioLowerVolume exec wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- 189 | bindsym XF86AudioMute exec wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle 190 | bindsym XF86AudioPlay exec playerctl --player=spotify play-pause 191 | bindsym XF86AudioPrev exec playerctl --player=spotify previous 192 | bindsym XF86AudioNext exec playerctl --player=spotify next 193 | 194 | # Styling 195 | include ~/.config/i3/themes/dark 196 | for_window [all] title_window_icon on, title_window_icon padding 5 197 | for_window [floating] border pixel 0, resize set 990 600 198 | default_border none 199 | title_align center 200 | workspace $ws10 gaps top 0 201 | gaps inner 20 202 | gaps top 40 203 | --------------------------------------------------------------------------------