#+TITLE: i3 Window Manager Configuration #+AUTHOR: Roger González #+PROPERTY: header-args:conf :tangle config :mkdirp yes #+STARTUP: overview #+OPTIONS: toc:3 num:nil #+auto_tangle: t * i3 Configuration :PROPERTIES: :ID: ec9a7551-34d7-4172-86b1-379ce4e53a51 :END: This is my personal configuration for the i3 window manager. It's written using Org Mode's literate programming features, which allows embedding documentation directly alongside the code. This file is configured to automatically "tangle" the code blocks into the actual i3 configuration file (named =config= in the same directory) whenever this Org file is saved in Emacs (see the [[*Setting Up Auto-Tangle][Setting Up Auto-Tangle]] section). This approach keeps the configuration well-documented and easier to manage. ** Header :PROPERTIES: :ID: 107a2e74-7d42-4455-bb71-7bfb6ab7f8cf :END: This is just a simple header block containing ASCII art with personal information, which will appear at the top of the tangled =config= file. #+begin_src conf # # ██████╗ ██████╗ ██████╗ ███████╗ # ██╔══██╗██╔═══██╗██╔════╝ ██╔════╝ Roger Gonzalez # ██████╔╝██║ ██║██║ ███╗███████╗ https://rogs.me # ██╔══██╗██║ ██║██║ ██║╚════██║ # ██║ ██║╚██████╔╝╚██████╔╝███████║ # ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚══════╝ #+end_src ** Basic Settings :PROPERTIES: :ID: c2a32a32-b383-45e3-83a6-7d3f710f908b :END: Here, we define some fundamental settings for i3. - =$mod=: Sets the primary modifier key. =Mod4= is typically the Super key (Windows key). - =$aux=: Sets an auxiliary modifier key. =Mod1= is usually the Alt key. Using an auxiliary modifier allows for more keybinding combinations without conflicts. - =font=: Specifies the font used for window titles and, by default, the i3bar. =pango:DejaVu Sans Mono= enables Pango for text rendering, which provides better support for Unicode glyphs (like icons), right-to-left text, and improved scaling on high-resolution displays. #+begin_src conf set $mod Mod4 set $aux Mod1 font pango:DejaVu Sans Mono #+end_src ** System Management :PROPERTIES: :ID: e980bd11-e95c-4cff-8e22-387d238d1862 :END: This section configures integration with system services and utilities. - =xss-lock=: Automatically locks the screen using a specified script (=~/.config/i3/scripts/i3lock_script.sh=) before the system suspends. It uses `logind` to manage sleep inhibitors. You can manually lock the screen using =loginctl lock-session=. - =nm-applet=: Starts the NetworkManager applet, providing a system tray icon for managing network connections (especially useful for Wi-Fi). - =autorandr=: Manages display configurations. =exec_always= ensures it runs on startup and i3 restart. The =sleep 2= might be necessary to wait for monitors to be fully detected. A keybinding (=$mod+Shift+x=) is also set to manually trigger a display profile change. #+begin_src conf exec --no-startup-id xss-lock --transfer-sleep-lock ~/.config/i3/scripts/i3lock_script.sh exec --no-startup-id nm-applet # Screen resolution exec_always --no-startup-id sleep 2; autorandr --change bindsym $mod+Shift+x exec autorandr --change #+end_src ** Audio Controls :PROPERTIES: :ID: 8cce53d6-97d3-48e4-86c8-23d81cb671de :END: Keybindings for controlling audio volume and media playback. - Volume control uses =pactl= (PulseAudio Control) to adjust the volume and mute status of the default audio sink (output) and source (input/microphone). - =$refresh_i3status=: This variable defines a command to send the =SIGUSR1= signal to the =i3status= process. This is commonly used to tell status bars (like i3bar or Polybar when using the i3status module) to refresh their display immediately after a change (like volume). - Media keys (Next, Previous, Play/Pause) are bound to =playerctl=, a command-line utility to control MPRIS-compatible media players (like Spotify, VLC, etc.). #+begin_src conf set $refresh_i3status killall -SIGUSR1 i3status bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +10% && $refresh_i3status bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -10% && $refresh_i3status bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle && $refresh_i3status bindsym XF86AudioMicMute exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ toggle && $refresh_i3status bindsym XF86AudioNext exec playerctl next bindsym XF86AudioPrev exec playerctl previous bindsym XF86AudioPlay exec playerctl play-pause #+end_src ** Brightness Controls :PROPERTIES: :ID: 5f791fdf-fa93-4355-be0b-9b03f5e0313b :END: Bindings for adjusting screen brightness using the dedicated function keys found on many laptops. It uses the =xbacklight= utility. #+begin_src conf bindsym XF86MonBrightnessUp exec xbacklight -inc 20 bindsym XF86MonBrightnessDown exec xbacklight -dec 20 #+end_src ** Window Appearance :PROPERTIES: :ID: ae204653-b553-499d-8c81-67385acb56fa :END: Settings related to how windows look and are arranged. - =for_window [class=".*"] border pixel 2=: This rule applies to all windows (matched by the regex =.*=) and sets their border style to =pixel= with a thickness of 2 pixels. This effectively hides the default title bars, saving screen space. - =gaps inner 4= / =gaps outer 4=: Configures gaps (empty space) between windows (inner) and between windows and screen edges (outer). - The =smart_gaps on= line (commented out) would automatically remove outer gaps if there's only one window on the workspace. - Keybindings are provided to dynamically adjust or reset inner and outer gaps during the session. #+begin_src conf # Disable titlebars for_window [class=".*"] border pixel 2 # Use gaps # smart_gaps on gaps inner 4 gaps outer 4 bindsym $mod+Shift+t gaps inner current set 4; gaps outer current set 4 bindsym $mod+s gaps inner current plus 5 bindsym $mod+Shift+s gaps inner current minus 5 bindsym $mod+Shift+d gaps inner current set 0; gaps outer current set 0 bindsym $mod+z gaps outer current plus 5 bindsym $mod+Shift+z gaps outer current minus 5 #+end_src ** Window Management :PROPERTIES: :ID: 27e3cc34-781f-474b-b34a-6072eb9e4bfb :END: Core bindings for managing windows. - =floating_modifier $mod=: Allows dragging floating windows by holding the =$mod= key (Super) and clicking/dragging with the mouse. - =$terminal= / =$auxTerminal=: Defines variables for the preferred terminal emulator (=alacritty=) and an auxiliary one (=ghostty=). - =$mod+Return=: Opens a new instance of the default terminal (=$terminal=). - =$mod+Shift+q=: Kills the currently focused window. - =$mod+d=: Launches =rofi= in =combi= mode, allowing searching for and launching applications (=drun=) or switching to open windows (=window=). #+begin_src conf # Use Mouse+$mod to drag floating windows to their wanted position floating_modifier $mod # start a terminal set $terminal alacritty set $auxTerminal ghostty bindsym $mod+Return exec $terminal # kill focused window bindsym $mod+Shift+q kill # start rofi (a program launcher) bindsym $mod+d exec --no-startup-id "rofi -combi-modi window,drun -show combi" #+end_src ** Navigation :PROPERTIES: :ID: aab86286-395c-40f2-b7c5-051d31fcda2c :END: Keybindings for changing focus between windows and moving windows around. - Focus changes can be done using Vim-style keys (h, j, k, l) or the standard arrow keys, combined with the =$mod= key. - Moving windows uses the same keys but adds the =Shift= modifier (e.g., =$mod+Shift+h= moves the focused window left). - A dedicated "Resize" mode is defined, activated by =$mod+r=. While in this mode, the h, j, k, l keys resize the focused window. Pressing =Return= or =Escape= exits the resize mode and returns to the default keybinding set. #+begin_src conf # change focus bindsym $mod+h focus left bindsym $mod+j focus down bindsym $mod+k focus up bindsym $mod+l focus right # alternatively, you can use the cursor keys: bindsym $mod+Left focus left bindsym $mod+Down focus down bindsym $mod+Up focus up bindsym $mod+Right focus right # move windows: bindsym $mod+Shift+h move left bindsym $mod+Shift+j move down bindsym $mod+Shift+k move up bindsym $mod+Shift+l move right # alternatively, you can use the cursor keys: bindsym $mod+Shift+Left move left bindsym $mod+Shift+Down move down bindsym $mod+Shift+Up move up bindsym $mod+Shift+Right move right bindsym $mod+r mode "Resize" mode "Resize" { bindsym h resize shrink width 10 px or 10 ppt bindsym j resize grow height 10 px or 10 ppt bindsym k resize shrink height 10 px or 10 ppt bindsym l resize grow width 10 px or 10 ppt bindsym Return mode "default" bindsym Escape mode "default" } #+end_src ** Layout Management :PROPERTIES: :ID: dece85d5-2fd5-45f4-9999-6e7966081443 :END: Bindings for controlling the layout of window containers. - =$mod+t=: Toggles the split orientation (horizontal/vertical) for the current container. New windows will be placed accordingly. - =$mod+f=: Toggles fullscreen mode for the focused window or container. - =$mod+w= / =$mod+e=: Change the layout mode of the current container. =tabbed= shows windows like tabs in a browser. =toggle split= switches between the default split layout and stacked layout (titles shown vertically). - =$mod+Shift+space=: Toggles the focused window between tiling (managed by i3's layout) and floating (can be moved/resized freely). - =$mod+space=: Switches focus between tiling and floating windows on the current workspace. - =$mod+a=: Moves focus to the parent container, useful for applying layout changes or moving multiple windows together. #+begin_src conf # toggle split orientation bindsym $mod+t split toggle # enter fullscreen mode for the focused container bindsym $mod+f fullscreen toggle # change container layout (stacked, tabbed, toggle split) bindsym $mod+w layout tabbed bindsym $mod+e layout toggle split # toggle tiling / floating bindsym $mod+Shift+space floating toggle # change focus between tiling / floating windows bindsym $mod+space focus mode_toggle # focus the parent container bindsym $mod+a focus parent #+end_src ** Workspaces :PROPERTIES: :ID: 5f06548f-e0c6-43de-8313-efdced5931a9 :END: Configuration related to i3 workspaces (virtual desktops). - Workspace names are defined using variables (=$ws1=, =$ws2=, etc.). This makes it easy to change names later. Icons (like , ) are used, requiring a Nerd Font or similar for proper display in the status bar. - Keybindings =$mod+[1-0]= switch to the corresponding workspace. =$mod+$aux+0= switches to workspace 11. - Keybindings =$mod+Shift+[1-0]= move the focused container to the corresponding workspace. =$mod+$aux+Shift+0= moves to workspace 11. - Workspaces are explicitly assigned to specific monitor outputs (`primary`, `DP-2-1`, `DP-2-2`). This ensures a consistent workspace layout across multiple monitors. Odd-numbered workspaces appear on the primary monitor, even-numbered on the second, and workspace 11 on the third. #+begin_src conf # Define names for default workspaces for which we configure key bindings later on. # We use variables to avoid repeating the names in multiple places. set $ws1 "1: " set $ws2 "2: " set $ws3 "3: " set $ws4 "4: " set $ws5 "5: " set $ws6 "6: " set $ws7 "7: " set $ws8 "8" set $ws9 "9" set $ws10 "10" set $ws11 "11: " # switch to workspace bindsym $mod+1 workspace number $ws1 bindsym $mod+2 workspace number $ws2 bindsym $mod+3 workspace number $ws3 bindsym $mod+4 workspace number $ws4 bindsym $mod+5 workspace number $ws5 bindsym $mod+6 workspace number $ws6 bindsym $mod+7 workspace number $ws7 bindsym $mod+8 workspace number $ws8 bindsym $mod+9 workspace number $ws9 bindsym $mod+0 workspace number $ws10 bindsym $mod+$aux+0 workspace number $ws11 # move focused container to workspace bindsym $mod+Shift+1 move container to workspace number $ws1 bindsym $mod+Shift+2 move container to workspace number $ws2 bindsym $mod+Shift+3 move container to workspace number $ws3 bindsym $mod+Shift+4 move container to workspace number $ws4 bindsym $mod+Shift+5 move container to workspace number $ws5 bindsym $mod+Shift+6 move container to workspace number $ws6 bindsym $mod+Shift+7 move container to workspace number $ws7 bindsym $mod+Shift+8 move container to workspace number $ws8 bindsym $mod+Shift+9 move container to workspace number $ws9 bindsym $mod+Shift+0 move container to workspace number $ws10 bindsym $mod+$aux+Shift+0 move container to workspace number $ws11 workspace $ws1 output primary workspace $ws3 output primary workspace $ws5 output primary workspace $ws7 output primary workspace $ws9 output primary workspace $ws2 output DP-2-1 workspace $ws4 output DP-2-1 workspace $ws6 output DP-2-1 workspace $ws8 output DP-2-1 workspace $ws10 output DP-2-1 workspace $ws11 output DP-2-2 #+end_src ** System Commands :PROPERTIES: :ID: cdedb31b-0b53-4504-8531-1a4164ae7c23 :END: Bindings for managing the i3 session and the system itself. - =$mod+Shift+c=: Reloads the i3 configuration file (~/.config/i3/config). Useful after making changes. - =$mod+Shift+r=: Restarts i3 in place. This preserves the current layout and session, useful for applying changes that require a restart or upgrading i3. - =$Locker=: Defines a variable for the screen locking command, using the same script as =xss-lock=. - A "System" mode (similar to the "Resize" mode) is defined for power management actions. Activated by =$mod+Shift+e=, it provides single-key shortcuts for locking (l), logging out (e), suspending (s), hibernating (h), rebooting (r), and shutting down (Shift+s). Pressing =Return= or =Escape= exits this mode. #+begin_src conf # reload the configuration file bindsym $mod+Shift+c reload # restart i3 inplace (preserves your layout/session, can be used to upgrade i3) bindsym $mod+Shift+r restart # lock the screen set $Locker exec "~/.config/i3/scripts/i3lock_script.sh" set $mode_power System (l) lock, (e) logout, (s) suspend, (h) hibernate, (r) reboot, (Shift+s) shutdown mode "$mode_power" { bindsym l exec --no-startup-id $Locker, mode "default" bindsym e exec --no-startup-id i3-msg exit, mode "default" bindsym s exec --no-startup-id systemctl suspend, mode "default" bindsym h exec --no-startup-id systemctl hibernate, mode "default" bindsym r exec --no-startup-id systemctl reboot, mode "default" bindsym Shift+s exec --no-startup-id systemctl poweroff -i, mode "default" # back to normal: Enter or Escape bindsym Return mode "default" bindsym Escape mode "default" } bindsym $mod+Shift+e mode "$mode_power" #+end_src ** Status Bar :PROPERTIES: :ID: f71c0252-1c0c-484a-9454-a6fa11389b60 :END: This section handles the status bar. Instead of using the default i3bar with i3status, this configuration uses Polybar. - =exec_always --no-startup-id .config/polybar/launch.sh=: Executes a script located at =.config/polybar/launch.sh= on i3 startup and restart. This script is responsible for launching and configuring the Polybar instances. The actual appearance and content of the bar are defined in the Polybar configuration files, not here. #+begin_src conf # Start Polybar exec_always --no-startup-id .config/polybar/launch.sh #+end_src ** Program Shortcuts :PROPERTIES: :ID: 74cae34a-66d8-42e6-b161-bd0552369f65 :END: Custom keybindings to launch frequently used applications and perform specific actions. - =$aux+f=: Opens Thunar file manager. - =$aux+c=: Opens an image viewer (`xviewer`) showing a Vim cheatsheet. - =$aux+a=: Opens `lxappearance` for changing GTK themes, icons, and fonts. - =$mod+Shift+b=: Opens the auxiliary terminal (=$auxTerminal=, ghostty) running a script named `bmenu`. - Language Switching: =$aux+Shift+e= sets the keyboard layout to Spanish (es), =$aux+Shift+u= sets it to US English (us) using =setxkbmap=. - Screenshots: Various bindings using =scrot= and =flameshot= for capturing the full screen, a selected area (saving to file or clipboard), or launching the Flameshot GUI. The =--release= flag triggers the action when the key is released. - Do Not Disturb: =$mod+m= toggles a Do Not Disturb mode via a custom script. - Custom Shortcuts: Bindings using =$aux= to open specific LibreOffice Calc spreadsheets (=loffice=) and the Feishin music player. #+begin_src conf # Hotkeys for opening programs bindsym $aux+f exec /usr/bin/thunar bindsym $aux+c exec xviewer ~/.vim-cheatsheet.gif bindsym $aux+a exec /usr/bin/lxappearance bindsym $mod+Shift+b exec $auxTerminal -e 'bmenu' # Languages bindsym $aux+Shift+e exec setxkbmap es bindsym $aux+Shift+u exec setxkbmap us # Screenshots bindsym Print exec scrot ~/Pictures/%Y-%m-%d-%H%M%S.png bindsym --release Shift+F12 exec scrot -s -f ~/Pictures/%Y-%m-%d-%H%M%S.png bindsym --release Ctrl+Shift+F12 exec scrot -s -f -o "/tmp/image.png" && xclip -selection clipboard -t image/png -i /tmp/image.png bindsym --release Ctrl+Shift+F11 exec flameshot gui # Do not disturb bindsym $mod+m exec "~/.config/i3/scripts/toggle_dnd.sh" # Shortcuts bindsym $aux+g exec loffice ~/Documents/Gastos/Gastos\ USD.ods bindsym $aux+b exec loffice ~/Documents/Gastos/BTC.ods bindsym $aux+l exec feishin #+end_src ** Focus Behavior :PROPERTIES: :ID: 28c668ac-c174-4c7f-a152-2434d377579c :END: Configures how window focus changes in relation to the mouse cursor. - =focus_follows_mouse no=: Disables focus follows mouse. This means a window only gains focus when explicitly clicked on, not just when the mouse cursor moves over it. This can prevent accidental focus changes. #+begin_src conf # Disable focus follows focus_follows_mouse no #+end_src ** Workspace Assignments :PROPERTIES: :ID: 1632a49b-ec39-4b59-b457-0024c5c01265 :END: Rules to automatically assign specific applications to predefined workspaces when they are opened. This helps maintain an organized workflow. Assignments are based on the window class (obtained using tools like `xprop`). - Browsers (LibreWolf, Firefox, etc.) go to $ws1 (Workspace 1). Brave goes to $ws10. - Development tools (Emacs, Postman, DBeaver) go to $ws2. Note the use of `for_window ... move` for DBeaver, which might be necessary if `assign` doesn't work reliably for that specific application. - Terminals (Alacritty, ghostty) go to $ws3. - Communication apps (Slack, Telegram, Signal, etc.) go to $ws4. - Mail/Calendar apps (Evolution, Thunderbird, Mailspring) go to $ws5. - Music players (Spotify, Lollypop, Feishin, etc.) go to $ws6. - File managers (Thunar, Pcmanfm) go to $ws7. - Miscellaneous utilities (KeePassXC, Bitwarden, Joplin, KDE Connect, Liferea, NewsFlash) are assigned to $ws8 and $ws9. - Floating Rules: Specific windows (like file transfer dialogs, Galculator, GParted, Nitrogen) are set to open in floating mode automatically. - Urgent Focus: =for_window [urgent=latest] focus= automatically switches focus to a workspace containing a window that has set its "urgent" hint (e.g., a new chat message notification). #+begin_src conf # Workspace Assignments # 1: Browsers assign [class="Brave"] $ws10 assign [class="LibreWolf"] $ws1 assign [class="firefox"] $ws1 assign [class="zen"] $ws1 assign [class="qutebrowser"] $ws1 # 2: Development assign [class="Emacs"] $ws2 assign [class="Postman"] $ws2 for_window [class="DBeaver"] move to workspace $ws2 # 3: Terminal assign [class="Alacritty"] $ws3 assign [class="ghostty"] $ws3 # 4: Communication assign [class="Slack"] $ws4 assign [class="Telegram"] $ws4 assign [class="Keybase"] $ws4 assign [class="Ferdi"] $ws4 assign [class="Signal"] $ws4 assign [class="Element"] $ws4 # 5: Mail/Calendar assign [class="Evolution"] $ws5 assign [class="thunderbird"] $ws5 assign [class="Mailspring"] $ws5 # 6: Music for_window [class = "Spotify"] move to workspace $ws6 assign [class="Lollypop"] $ws6 assign [class="feishin"] $ws6 assign [class="Clementine"] $ws6 assign [class="Sublime-music"] $ws6 # 7: File managers assign [class="Thunar"] $ws7 assign [class="Pcmanfm"] $ws7 # 8: Misc assign [class="KeePassXC"] $ws8 assign [class="Bitwarden"] $ws8 assign [class="Joplin"] $ws9 assign [class="kdeconnect.app"] $ws9 assign [class="Liferea"] $ws9 assign [class="NewsFlash"] $ws9 # Open specific applications in floating mode for_window [title="File Transfer*"] floating enable for_window [class="(Galculator|GParted|Nitrogen|Wireguard)"] floating enable border normal # switch to workspace with urgent window automatically for_window [urgent=latest] focus #+end_src ** Autostart Applications :PROPERTIES: :ID: 7087b33c-9793-40e1-aa78-5ae49d6bf991 :END: Applications and services launched automatically when i3 starts. The =--no-startup-id= flag prevents i3 from showing a "busy" cursor while these applications load. =sleep= commands are used to stagger the startup of some applications, potentially reducing initial resource load or waiting for dependencies (like network or system tray) to become ready. - Core applications like Thunderbird (mail), Emacs (editor), Zen Browser, and a terminal instance are started with delays. - =nitrogen --restore=: Restores the previously set wallpaper. - =blueman-applet=: System tray applet for Bluetooth management. - =polkit-gnome-authentication-agent-1=: Handles PolicyKit authentication requests (e.g., for administrative tasks). - =gnome-keyring-daemon=: Manages passwords and secrets. - =unclutter=: Hides the mouse cursor when idle. - =xfce4-power-manager=: Handles power management events (like laptop lid close, battery levels). - =pamac-tray=: Provides notifications for package updates (on Arch-based systems using Pamac). - =picom=: A compositor, responsible for visual effects like transparency, shadows, and fading. =exec_always= ensures it restarts if it crashes. - =xfce4-notifyd=: A notification daemon to display desktop notifications. - =autotiling=: A script that automatically adjusts the split direction (horizontal/vertical) based on window dimensions, aiming for a more balanced layout. - =xinput set-prop 14 345 1=: Likely a specific command to configure a touchpad or mouse setting (device ID 14, property 345 set to 1). This is hardware-specific. - =play-with-mpv=: Likely related to a browser extension that allows opening videos in the MPV player. - =~/.config/i3/connect-speakers.sh=: A custom script, probably for setting up audio outputs. - =kdeconnect-app=: Starts the KDE Connect application for integrating phone notifications and file sharing. - =dbus-update-activation-environment=: Ensures important environment variables (like =DISPLAY=) are available to D-Bus activated services, which is crucial for proper integration of many modern desktop applications. #+begin_src conf # Autostarts exec --no-startup-id sleep 20; exec /usr/bin/thunderbird exec --no-startup-id sleep 10; exec emacsclient -c -a emacs exec --no-startup-id sleep 20; exec /usr/bin/zen-browser exec --no-startup-id sleep 5; exec $terminal exec --no-startup-id sleep 10; exec nitrogen --restore exec --no-startup-id blueman-applet exec --no-startup-id /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 exec --no-startup-id /usr/bin/gnome-keyring-daemon --start --components=pkcs11,secrets,ssh exec --no-startup-id /usr/bin/unclutter exec --no-startup-id xfce4-power-manager exec --no-startup-id pamac-tray exec_always --no-startup-id sleep 5; exec picom exec --no-startup-id /usr/lib/xfce4/notifyd/xfce4-notifyd exec_always --no-startup-id autotiling exec --no-startup-id xinput set-prop 14 345 1 exec --no-startup-id exec /usr/bin/play-with-mpv exec --no-startup-id exec "~/.config/i3/connect-speakers.sh" exec --no-startup-id sleep 5; exec /usr/bin/kdeconnect-app exec dbus-update-activation-environment --systemd DBUS_SESSION_BUS_ADDRESS DISPLAY XAUTHORITY & #+end_src ** Scripts :PROPERTIES: :ID: 126b52b7-5aad-4f45-a296-b425503d6043 :END: Execution of custom scripts and miscellaneous bindings. - =internet_check.sh= (commented out) and =weather_notify.sh= are custom scripts launched at startup (likely for status bar information or notifications). - =$aux+p=: A keybinding that generates a 50-character random password using =/dev/urandom= and =tr=, copies it to the clipboard using =xclip=, and sends a notification. #+begin_src conf # Small scripts # exec --no-startup-id ~/.config/i3/scripts/internet_check.sh & exec --no-startup-id ~/.config/i3/scripts/weather_notify.sh & # Random scripts ## Generate a random password and copy it to the clipboard bindsym $aux+p exec --no-startup-id "tr -dc 'A-Za-z0-9!#$%&'\''()*+,-./:;<=>?@[\]^_`{|}~'