dotfiles/.config/i3/README.org

46 KiB
Raw Blame History

Phundraks i3 config

Presentation

i3 is a window manager for GNU/Linux which automatically tiles windows in workspaces. This configuration was ade to automatically handle some tasks such as which software allowed where, autostart, and launching software with shortcuts.

It is to be noted I am using resloveds fork of i3, i3-gaps-rounded. Some configuration will not work with i3-gaps, and some will not work with vanilla i3 either.

Variables declaration

Global

The first I do is declaring the modifier key and the alt key —I dont find the names Mod1 and Mod4 to be explicit enough. This will map $mod to the Super key (or as some people unfortunately call it, the Windows key) and $alt to the Alt key.

Lets also bind the $up, $down, $left and $right variables to respectively the up, down, left, and right arrows on the keyboard. Why bind them to variables? If I ever want to modify the arrow keys to some other keys, like é, a, u, and i (the equivalent of wqsd on the bépo layout) or c, t, s, and r (the equivalent of hjkl on the bépo layout), I will just have to modify these four lines.

Ill also set the $term variable. A lot of shortcuts in my i3 config rely on the terminal emulator itself to launch commands in the terminal, and thus call the terminal itself. If I ever need to move from my current terminal, I will just have to change the name of the executable here.

variable value
$mod Mod4
$alt Mod1
$up Up
$down Down
$left Left
$right Right
$term st
$exiti3 i3-nagbar -t warning -m 'Leave i3?' -b 'Yes' 'i3-msg exit'
$lockscreen Lucien Cartier-Tilet\n(Phuntsok Drak-pa)\n+33 (0)6 83 90 56 89
$rofiexec rofi -combi-modi 'window,drun' -show combi -mohh combi -m -1 -show-icons
$gnus emacsclient create-frame eval '(gnus)' -n
$ec emacsclient create-frame -n
$walset wal -i ~/Pictures/Wallpapers -o wal-set

Variables will be set like so.

set $term st
  result = ''
  for line in variables:
      result += "set {0}\t{1}\n".format(line[0], line[1])
  return result
set $mod	Mod4
set $alt	Mod1
set $up	Up
set $down	Down
set $left	Left
set $right	Right
set $term	st

Finally, some variables hold some long strings for commands I dont want to have to type multiple times.

  result = ''
  for line in variables:
      result += "set {0}\t\"{1}\"\n".format(line[0], line[1])
  return result
set $exiti3	"i3-nagbar -t warning -m "Leave i3?" -b "Yes" "i3-msg exit""
set $lockscreen	"Lucien Cartier-Tilet\n(Phuntsok Drak-pa)\n+33 (0)6 83 90 56 89"
set $rofiexec	"rofi -combi-modi "window,drun" -show combi -mohh combi -m -1 -show-icons"
set $gnus	"emacsclient --create-frame --eval "(gnus)" -n"
set $ec	"emacsclient --create-frame -n"
set $walset	"wal -i ~/Pictures/Wallpapers -o wal-set"

Here is the configuration:

<<generate-variables()>>
<<generate-variables2()>>

Now comes the font for the window tiles. Honestly, this setting is useless since we do not see it, but lets set it anyway.

  font Fira Sans Book:style=Book:pixelsize=10

Floating windows

Floating windows are windows that are not tiled with other windows, but rather are free to go anywhere on your screen, with any size. A bit like what you would get with any other non-tiling window manager or desktop environment (though most of them support minimal tiling features).

Lets declare our floading modyfier. With floating windows, you can move them around by clicking on the windows borders; but since we dont have any with this config, we will have instead to press the floating modifier while clicking on the window (anywhere on the window is fine) to move them around.

Here is the configuration:

floating_modifier $mod

i3 global settings

Some settings affect i3 globally, such as its aspect or how it handles the mouse. Hence, here are some settings I set in my configuration.

Mouse settings

First of all, I do not want i3 to warp my mouse each time I change windows; my mouse stays where it is.

mouse_warping none

I also to not want the window focus to follow my mouse, because sometimes I will just knock my physical mouse out of the way of my hand, and when I do that the software mouse will most likely end up in another window I do not want to focus.

  focus_follows_mouse no

Popup handling

While in fullscreen, some software might generate a popup. In that case, I want to be aware of that, and any popup will make me leave fullscreen in order to be presented with said popup.

popup_during_fullscreen leave_fullscreen

Behavior of workspace changes

When changing workspace as described below, we often want to go back to the previous workspace we were working on, but we might not remember immediately which one it was, or we might still have our fingers ready to fire the shortcut which made us make the first workspace change. Hence, if we type the same workspace change shortcut, instead of doing nothing it will bring us back to the previous workspace we were on.

workspace_auto_back_and_forth yes

Gaps and window appearance

As mentioned in at the beginning of this document, I am using i3-gaps-rounded, which brings rounded corners to i3-gaps, a fork of i3 which brings spacing (gaps) between tiled windows.

First, I want space around my windows only when there are several containers on the same screen, otherwise they will be maximized.

  smart_gaps on

I also do not want to see any window border, so I will be turning this setting off.

  smart_borders on

By the way, the default border is invisible, since it is zero pixels wide.

default_border pixel 0

Then comes the size of these gaps. I made the outer gap negative so the space between my windows and the border of my screens is smaller than the gap between my containers.

  gaps inner 20
  gaps outer -10

And I am not using i3-gaps-rounded for nothing: my containers that are not tiled will get their corners rounded with a radius of five pixels.

border_radius 5

Some parameters are also available when it comes to the colors i3 uses. Honestly, we wont see these colors much, so lets simply keep the default values.

  set_from_resource $fg i3wm.color7 #f0f0f0
  set_from_resource $bg i3wm.color2 #f0f0f0

  # class                 border  backgr. text indicator child_border
  client.focused          $bg     $bg     $fg  $bg       $bg
  client.focused_inactive $bg     $bg     $fg  $bg       $bg
  client.unfocused        $bg     $bg     $fg  $bg       $bg
  client.urgent           $bg     $bg     $fg  $bg       $bg
  client.placeholder      $bg     $bg     $fg  $bg       $bg

Assigning windows to workspaces

I decided to bind some windows to some workspaces in order to have a better organization of my desktop.

Application Class Workspace
Emacs Emacs 2
Chromium Chromium 3
Firefox firefox 3
Nemo Nemo 4
Wonderdraft Godot 5
Gimp Gimp* 6
Gnome Boxes gnome-boxes 8
Steam Steam 9
Discord discord 10

The class table is used in the assignment in the i3 config file. For instance, Gimps assignment will look like this:

  assign [class="Gimp*"] 6
  results = ''
  for line in workspaces:
      results += 'assign [class="{0}"] {1}\n'.format(line[1],line[2])
  return results

Here is the configuration:

<<generate-workspaces()>>

And although this is not specifically assigning a window to a workspace, I also want to have the tenth workspace assigned to a specific output in case I have two screens — and since this is the case when I am using only one computer, Marpa, I can make it a conditional thanks to yadms jinja2 syntax.

  {% if YADM_HOSTNAME == 'Marpa' -%}
  workspace 10 output eDP-1
  {% endif -%}

Shortcuts

I use A LOT of shortcuts when it comes to my workflow. Like, all the time. So, expect this chapter to be a bit long, and Ill try to make it readable still.

Shortcuts are set like so:

bindsym shortcut command

Terminal shortcuts

I have a couple of shortcuts which are related to my terminal. For instance, $mod+Return opens a regular terminal instance while $mod+$alt+M opens an SSH instance on my Mila host.

shortcut command What it does
$mod+Return exec $term Opens a regular terminal console
$mod+$alt+Return split h;; exec $term Opens a terminal console below the current one
$mod+Shift+Return split v;; exec $term Opens a terminal on the right of the current one
$mod+$alt+m exec $term ssh Mila Opens an SSH instance in my Mila host
$mod+$alt+n exec $term ssh Naro Opens an SSH instance in my Naro host
$mod+Shift+h exec $term htop Opens a terminal with htop

Here is the configuration:

<<generate-shortcuts(table=terminal-shortcuts)>>

i3 shortcuts

A couple of shortcuts are dedicated to i3 itself.

shortcut command what it does
$mod+Shift+c exec yadm alt && i3-msg reload Reload the i3 configuration file
$mod+Shift+r exec yadm alt && i3-msg restart Restart i3 inplace
$mod+Shift+e exec $exiti3 Quit i3

And although this is not really an i3 shortcut per se, I add here the shortcut for launching pywal, which will set one of my wallpapers as the wallpaper and will generate my systems color configuration from it.

shortcut command what it does
$mod+Ctrl+w exec $walset Set a random wallpaper and generates a color profile from it

We also have some shortcuts to lock our screen, sleep, hibernate and shut down our computer.

shortcut command what it does
$mod+l exec i3lock -fol Lock the screen
$mod+$alt+h exec "systemctl suspend" Suspend the computer
$mod+Ctrl+h exec "systemctl hibernate" Hibernate the computer
$mod+Shift+F4 exec poweroff Power off the computer

Here is the configuration:

<<generate-shortcuts(table=i3-sh)>>
<<generate-shortcuts(table=wal-sh)>>
<<generate-shortcuts(table=computer-sh)>>

Window and workspace management

Managing how windows will split

It is possible to indicate to i3 how windows interact with one another, and especially how they are organized by spawning new windows either to the right or below the current window.

shortcuts command what it does
$mod+h split h Next window to spawn will spawn below the current one
$mod+v split v Next window to spawn will spawn beside the current one

Here is the configuration:

<<generate-shortcuts(table=split-win-sh)>>

Focus windows

To change window focus, you can use one of the following shortcuts:

shortcut command what it does
$mod+$left focus left Focus the window left of the current one
$mod+$down focus down Focus the window down of the current one
$mod+$up focus up Focus the window up of the current one
$mod+$right focus right Focus the windof right of the current one

Here is the configuration:

<<generate-shortcuts(table=window-focus-sh)>>

Focus workspaces

Just like windows, it is also possible to change focus between workspaces, because lets be honest, most people wont have ten screens to display all ten workspaces at the same time, and frankly that would be impractical.

shortcut window what it does
$mod+1 workspace 1 Focus first workspace
$mod+2 workspace 2 Focus second workspace
$mod+3 workspace 3 Focus third workspace
$mod+4 workspace 4 Focus fourth workspace
$mod+5 workspace 5 Focus fifth workspace
$mod+6 workspace 6 Focus sixth workspace
$mod+7 workspace 7 Focus seventh workspace
$mod+8 workspace 8 Focus eighth workspace
$mod+9 workspace 9 Focus ninth workspace
$mod+0 workspace 10 Focus tenth workspace

Here is the configuration:

<<generate-shortcuts(table=ws-focus-sh)>>

Moving windows

To move windows, a couple of shortcuts are available:

shortcut command what it does
$mod+Shift+$left move left Move the focused window left
$mod+Shift+$down move down Move the focused window down
$mod+Shift+$up move up Move the focused window up
$mod+Shift+$right move right Move the focused window right

Here is the configuration:

<<generate-shortcuts(table=window-move-sh)>>

Moving containers

To move containers between the available screens, you have the following shortcuts:

shortcut command what it does
$mod+Ctrl+$left move container to output left Moves the container to the screen left of the current one
$mod+Ctrl+$down move container to output down Moves the container to the screen down of the current one
$mod+Ctrl+$up move container to output up Moves the container to the screen above the current one
$mod+Ctrl+$right move container to output right Moves the container to the screen right of the current one

You can also send containers to other workspaces by their number.

shortcut command what it does
$mod+Shift+1 move container to workspace 1 Move current container to the workspace 1
$mod+Shift+2 move container to workspace 2 Move current container to the workspace 2
$mod+Shift+3 move container to workspace 3 Move current container to the workspace 3
$mod+Shift+4 move container to workspace 4 Move current container to the workspace 4
$mod+Shift+5 move container to workspace 5 Move current container to the workspace 5
$mod+Shift+6 move container to workspace 6 Move current container to the workspace 6
$mod+Shift+7 move container to workspace 7 Move current container to the workspace 7
$mod+Shift+8 move container to workspace 8 Move current container to the workspace 8
$mod+Shift+9 move container to workspace 9 Move current container to the workspace 9
$mod+Shift+0 move container to workspace 10 Move current container to the workspace 10

Here is the configuration:

<<generate-shortcuts(table=containers-move-sh)>>
<<generate-shortcuts(table=containers-ws-sh)>>

Moving workspaces

It is also possible to move workspaces. The related shortcuts available are the following:

shortcut command what it does
$mod+Ctrl+Shift+$left move workspace to output left Moves the workspace to the screen left of the current one
$mod+Ctrl+Shift+$down move workspace to output down Moves the workspace to the screen down of the current one
$mod+Ctrl+Shift+$up move workspace to output up Moves the workspace to the screen above the current one
$mod+Ctrl+Shift+$right move workspace to output right Moves the workspace to the screen right of the current one

Here is the configuration:

<<generate-shortcuts(table=workspace-move-sh)>>

Close windows

To close windows, we have two main shortcuts: Alt+F4 and mod+q. The first one is here due to habits, but I dont really use it anymore due to my main keyboard which doesnt have any easy access to the functions keys, hence mod+q.

shortcut command what it does
$mod+q kill kill the current window
$alt+F4 kill kill the current window

Here is the configuration:

<<generate-shortcuts(table=close-win-sh)>>

Manage the size of the current window

It is possible to change the size of the current window, even if it is a floating one. The first shortcut that might interest you is $mod+f which switches your current window to fullscreen. But to resize a window, you will need to enter the resize mode.

shortcut command what it does
$mod+f fullscreen toggle Puts the current window in fullscreen or exits it
$mod+r mode "resize" Enter resize mode

When it comes to modes, they are defined as follows:

  mode "nameofyourmode" {
      here go your shortcuts
  }

So, all the following shortcuts will be inserted in a mode called resize. Note that not only are the resizing shortcuts bound to the arrow keys, they are also bound to ctsr, which is the bépo equivalent of hjkl.

shortcut command what it does
$right resize grow width 20 px or 10 ppt Increase the width of the current window
r resize grow width 20 px or 10 ppt Increase the width of the current window
$left resize shrink width 10 px or 5 ppt Decrease the width of the current window
c resize shrink width 10 px or 5 ppt Decrease the width of the current window
$down resize grow height 10 px or 5 ppt Increase the height of the current window
t resize grow height 10 px or 5 ppt Increase the height of the current window
$up resize shrink height 10 px or 5 ppt Decrease the height of the current window
s resize shrink height 10 px or 5 ppt Decrease the height of the current window
Return mode "default" Return to the default mode
Escape mode "default" Return to the default mode

If you prefer, you can think of these shortcuts not as increasing or decreasing the width or height of the current window, but rather as how the bottom or right limit of the windows will be moved relative to the top left corner.

Here is the configuration:

  <<generate-shortcuts(table=size-win-sh)>>
  mode "resize" {
      <<generate-shortcuts(table=resize-win-sh)>>
  }

Manage floating windows

As said above, your windows can be floating windows instead of being tiled like they are by default. For this too we have a couple of shortcuts:

shortcut command what it does
$mod+Shift+space floating toggle Toggles the window between tiled and floating mode
$mod+space focus mode_toggle Toggles the focus between tiled and floating windows
$mod+Ctrl+c move position center Centers the focused floating window

If you want to move around your floating window, you can do it with your mouse while holding down the floating modifier declared here.

Here is the configuration:

<<generate-shortcuts(table=float-win-sh)>>

Scratchpad and window display

You can think of i3s scratchpad as some sort of extra workspace in which you can hide your windows you are not using, or as if you want to reduce a window to the taskbar of other window managers or desktop environments. You have basically two shortcuts for the scratchpad: one that sends the current window to the scratchpad, and one that cicles through the windows sent to the scratchpad and shows them to you sequencially. If you go through all of them, they will be hidden again. You can get a window out of the scratchpad by tiling it to the current workspace with the shortcut described above.

You also have the possibility of making a floating window a sticky window. This means not only will it show on all workspaces, it will also be on top of every other window. It can be useful if you have some notes you want to keep an eye on for instance.

shortcut command what it does
$mod+Shift+s move scratchpad Sends the current window to the scratchpad
$mod+s scratchpad show Shows and cycles through windows from the scratchpad
$mod+Ctrl+s sticky toggle Toggles sticky mode on current window

Here is the configuration:

<<generate-shortcuts(table=scratchpad-sh)>>

Gaps management

It is possible to dynamically change the gaps between containers if we want to change a bit the appearance of i3. For that, we obviously have some shortcuts.

shortcut command what it does
$mod+g gaps inner current plus 5 Increase the inner gap size
$mod+Shift+g gaps inner current minus 5 Decrease the inner gap size
$mod+Ctrl+g gaps outer current plus 5 Increase the outer gap size
$mod+Ctrl+Shift+g gaps outer current minus 5 Decrease the outer gap size
$mod+$alt+g gaps inner all set 20; gaps outer all set -10 Reset gaps

Here is the corresponding configuration:

<<generate-shortcuts(table=gaps-resize-sh)>>

Launching software

A big part of my i3 shortcuts though are related to launching various software. Ill try to sort them by category here, but do take a look even at categories which you might not be interested in, they might actually have something useful for you.

Software and command launcher

These commands will allow the user to launch applications which provide .desktop files or user-defined .desktop files, as well as commands with the help of rofi.

shortcut command what it does
$mod+Shift+d exec no-startup-id j4-dmenu-desktop Launch a registered application
$mod+d exec no-startup-id $rofiexec Launch a terminal command or a registered application

Here is the configuration:

<<generate-shortcuts(table=launcher-sh)>>

Internet software

I have a couple of Internet-related software I can launch easily.

shortcut command what it does
$mod+c exec firefox Launch firefox
$mod+m exec $gnus Launch Gnus, my mail client
Ctrl+Shift+d exec discord-canary Launch Discord

Hence this configuration:

<<generate-shortcuts(table=internet-sh)>>

Screenshots

A couple of shortcuts are available for taking screenshots.

shortcut command what it does
Print exec no-startup-id scrot Takes a screenshot of the entire desktop
Ctrl+Print exec no-startup-id "scrot -s" Takes a screenshot of a region or the selected window
Shift+Print exec no-startup-id "scrot -d 3" takes a screenshot of the desktop three in three seconds

This gives us this configuration:

<<generate-shortcuts(table=screenshot-sh)>>

Screen brightness

Here we have four commands for managing our screens brightness (this is useful for laptops, not so much with desktops), and two of them are actually duplicates of the other two in case a laptop doesnt have dedicated keys or we are using a keyboard which doesnt provide them.

shortcut command what it does
XF86MonBrightnessUp exec xbacklight -inc 5 Increase the brightness of the screen
$mod+$alt+Next exec xbacklight -inc 5 Increase the brightness of the screen
XF86MonBrightnessDown exec xbacklight -dec 5 Decrease the brightness of the screen
$mod+$alt+Prev exec xbacklight -dec 5 Decrease the brightness of the screen

This gives us this configuration:

<<generate-shortcuts(table=brightness-sh)>>

Media control

Some shortcuts are dedicated to media control, especially when it comes to controlling music. All of these media control shortcuts will be calls to mpc which will in turn send commands to mpd, which is the music server I use on my computers.

shortcut command what it does
XF86AudioNext exec mpc next Forward to the next track
$alt+XF86AudioRaiseVolume exec mpc next Forward to the next track
$mod+Next exec mpc next Forward to the next track
XF86AudioPrev exec mpc prev Backward to the previous track
$alt+XF86AudioLowerVolume exec mpc prev Backward to the previous track
$mod+Prior exec mpc prev Backward to the previous track
XF86AudioPlay exec mpc toggle Play or pause the music
$mod+p exec mpc toggle Play or pause the music
$mod+$alt+p exec mpc stop Completely stop the music
XF86AudioStop exec mpc stop Completely stop the music
$alt+XF86AudioPlay exec mpc stop Completely stop the music
$mod+$alt+7 exec mpc volume +5 Increase the volume from mpd
$mod+$alt+8 exec mpc volume -5 Decrease the volume from mpd

We also have two shortcuts for launching ncmpcpp, my mpd frontend, either with the playlist open by default, or the visualizes open.

shortcut command what it does
$mod+Shift+n exec $term ncmpcpp -q Launch ncmpcpps playlist editor
$mod+Shift+v exec $term ncmpcpp -qs visualizer Launch ncmpcpps visualizer

We also have more general shortcuts, like how to manipulate the general volume level.

shortcut command what it does
XF86AudioMute exec "amixer set Master 1+ toggle" Mute or unmute audio
Ctrl+$mod+Prior exec "amixer -q set Master 2%+ unmute" Raise volume
XF86AudioRaiseVolume exec "amixer -q set Master 2%+ unmute" Raise volume
Ctrl+$mod+Next exec "amixer -q set Master 2%- unmute" Reduce volume
XF86AudioLowerVolume exec "amixer -q set Master 2%- unmute" Reduce volume

This gives us this configuration:

<<generate-shortcuts(table=media-sh)>>
<<generate-shortcuts(table=ncmpcpp-sh)>>
<<generate-shortcuts(table=volume-sh)>>

Rofi utilities

We also have some utilities Ive written and which are interfaced with rofi. Here are said shortcuts.

shortcut command what it does
$mod+Shift+p exec rofi-pass type Types the selected password available from pass where the cursor is
$mod+Ctrl+Shift+p exec rofi-pass Copies in the clipboard the selected password from pass for 45 sec
$mod+Ctrl+m exec rofi-mount Volume mounting helper
$mod+Ctrl+u exec rofi-umount Volume unmounting helper
$mod+$alt+e exec rofi-emoji Emoji picker, copies it in the clipboard
$mod+w exec wacom-setup Sets my Wacom Bamboo tablet as being active on the selected screen

This gives us the following configuration:

<<generate-shortcuts(table=rofi-sh)>>

Miscellaneous

And last but not least, I have some other shortcuts for various software, some of them which I use quite a lot like the shortcut for launching Emacs.

shortcut command what it does
$mod+e exec $ec Launch Emacs client
$mod+n exec nemo Launch Nemo (file manager)
$mod+$alt+c exec speedcrunch Launch Speedcrunch (calculator)
$mod+F3 exec arandr Launch arandr

This gives us the following configuration:

<<generate-shortcuts(table=misc-sh)>>

Screen management

Additionally, we have a shortcut for entering presentation mode on the additional screen of the computer; on my main computer, Mila, the additional screen is HDMI-1, while it is VGA1 on my travel laptop. Well use yadms jinja2 syntax to manage that.

  {% if YADM_HOSTNAME == 'Marpa' -%}
  bindsym $mod+Ctrl+p xrandr --output HDMI-1 --mode 1024x768 --right-of eDP-1
  {% else %}
  bindsym $mod+Ctrl+p xrandr --output VGA1 --mode 1024x768 --right-of LVDS1
  {% endif -%}

Software autolaunch

When i3 is launched, I want it to also launch some software automatically. Here is what we will launch:

always execute it? command what it is
yes wal -i "$(< "${HOME}/.cache/wal/wal")" Sets the wallpaper from last session
no xss-lock i3lock -fol Launch power management
no dunst -config ~/.config/dunst/dunstrc Launch notification manager
no xrdb $HOME/.Xresources Load Xresources files
no compton -F opengl config ~/.config/compton.conf -e 1 Launch compton
yes polybar-launch Launch polybar
yes enable_touch Set correct touchpad values
no syndaemon -i 1.0 -t -k Set touchpad values
no mpd Launch music server
no mpc stop Stop music from mpd
no mpd_discord_richpresence no-idle fork Launch mpd status sharing with Discord
no nm-applet NetworkManager system tray

My travel laptop has a fingerprint reader which can be used as an authentification method when the root password is asked. Lets launch our policy kit manager if that is the case:

  {% if YADM_HOSTNAME == 'Gampo' -%}
  exec --no-startup-id /usr/lib/mate-polkit/polkit-mate-authentication-agent-1
  {% endif -%}
  <<generate-autolaunch()>>