&<\/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 |
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 |
--------------------------------------------------------------------------------