# i3 config file (v4) # # Please see http://i3wm.org/docs/userguide.html for a complete reference! # Font for window titles. Will also be used by the bar unless a different font # is used in the bar {} block below. font pango:Hack 10 # This font is widely installed, provides lots of unicode glyphs, right-to-left # text rendering and scalability on retina/hidpi displays (thanks to pango). #font pango:DejaVu Sans Mono 8 # Before i3 v4.8, we used to recommend this one as the default: # font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1 # The font above is very space-efficient, that is, it looks good, sharp and # clear in small sizes. However, its unicode glyph coverage is limited, the old # X core fonts rendering does not support right-to-left and this being a bitmap # font, it doesn’t scale on retina/hidpi displays. # class border bground text indicator child_border client.focused #000000 #B4EEB4 #000000 #B4EEB4 #000000 client.focused_inactive #000000 #FFFFF6 #000000 #BFBFBF #E5E5E5 client.unfocused #000000 #E5E5E5 #000000 #E5E5E5 #E5E5E5 client.urgent #000000 #900000 #FFFFF6 #900000 #900000 client.placeholder #000000 #000000 #FFFFF6 #000000 #000000 client.background #FFFFF6 # Use Mouse+Mod4 to drag floating windows to their wanted position floating_modifier Mod4 # default workspace layout workspace_layout tabbed # this is so that C-i o will stay within the same output; I have convenient # bindings to get to other outputs so no need for directional movement to # permit moving between outputs (it would be even better if we could just # toggle this setting around the execution of C-i o, however) focus_wrapping workspace mouse_warping output # Put bindings I don't need to repeat under C-i, so that we have enough keys # left on the right hand that caps lock can be our only Super modifier, yet we # do not need any one-handed chording. *Only* bindings I might want to hit more # than once in a row should be outside of this C-i map mode "C-i-" { # make a fresh Emacs frame -- typically this gets invoked only on # empty workspaces, as otherwise I use commands under `C-x 5` to get # more Emacs frames bindsym e exec emacsclient -nc, mode "default" # override the script's usual logic to start a fresh, non-debug daemon bindsym Shift+e exec emacsclient -nc --spw/installed, mode "default" # Fresh Emacs frame and get a shell in HOME. Without this it's # C-i e M-& which is too many keys esp. compared to C-i DEL bindsym Return exec emacsclient -nce \ "(let ((default-directory (expand-file-name "'"'~/'"'")) \ (display-buffer-overriding-action \ '(display-buffer-same-window \ . ((inhibit-same-window . nil))))) \ (transient-cycles-cmd-spw/eshell-jump-from-here))", \ mode "default" # start a terminal emulator bindsym BackSpace exec xfce4-terminal, mode "default" # make a fresh browser window bindsym b exec firefox -new-window, mode "default" # lock screen -- relies on xss-lock # note that this won't lock other VTs (lock-session*s* # requires root password) bindsym l exec loginctl lock-session \ && sleep 0.5 && xset dpms force standby, \ mode "default" # go to sleep -- xss-lock will lock screen bindsym Shift+l exec systemctl suspend, mode "default" # kill focused window # Unlike in sway config we don't send USR1 to i3status-wrapper because # under i3bar that causes i3status-wrapper to exit 0 for some reason. # For the time being there is no need to send the signal as # expensive() does nothing useful under i3. bindsym k kill, mode "default" # start dmenu (a program launcher) bindsym Shift+p exec dmenu_run \ -nf '#000000' -nb '#FFFFF6' -sb '#B4EEB4' -sf '#000000', \ mode "default" # There also is the (new) i3-dmenu-desktop which only displays applications # shipping a .desktop file. It is a wrapper around dmenu, so you need that # installed. bindsym p exec --no-startup-id i3-dmenu-desktop \ --dmenu="dmenu -i -nf '#000000' -nb '#FFFFF6' -sb '#B4EEB4' -sf '#000000'", \ mode "default" bindsym s exec ~/src/dotfiles/scripts/desktop/dmenu_ssh \ -nf '#000000' -nb '#FFFFF6' -sb '#B4EEB4' -sf '#000000', \ mode "default" # split in horizontal orientation bindsym h split h, mode "default" # split in vertical orientation bindsym v split v, mode "default" # enter fullscreen mode for the focused container bindsym f fullscreen toggle, mode "default" # change container layout (stacked, tabbed, toggle split) # bindsym s layout stacking, mode "default" bindsym w layout tabbed, mode "default" # make a container independently tabbed bindsym q split v, layout tabbed, mode "default" # toggle tiling / floating bindsym t floating toggle, mode "default" # change focus between tiling / floating windows bindsym Tab focus mode_toggle, mode "default" # focus the parent container bindsym a focus parent, mode "default" bindsym u focus parent, mode "default" # focus the child container bindsym d focus child, mode "default" # when screen is divided into two containers where at least one has # several tabs, as I usually have it on a small laptop screen, this # works well to go back and forth bindsym o focus parent, focus right, mode "default" # switch to workspace bindsym 1 workspace 1, mode "default" bindsym 2 workspace 2, mode "default" bindsym 3 workspace 3, mode "default" bindsym 4 workspace 4, mode "default" bindsym 5 workspace 5, mode "default" bindsym 6 workspace 6, mode "default" bindsym 7 workspace 7, mode "default" bindsym 8 workspace 8, mode "default" bindsym 9 workspace 9, mode "default" bindsym 0 workspace 10, mode "default" bindsym F1 workspace 11:F1, mode "default" bindsym F2 workspace 12:F2, mode "default" bindsym F3 workspace 13:F3, mode "default" bindsym F4 workspace 14:F4, mode "default" bindsym F5 workspace 15:F5, mode "default" bindsym F6 workspace 16:F6, mode "default" bindsym F7 workspace 17:F7, mode "default" bindsym F8 workspace 18:F8, mode "default" bindsym F9 workspace 19:F9, mode "default" bindsym F10 workspace 20:F10, mode "default" bindsym F11 workspace 21:F11, mode "default" bindsym F12 workspace 22:F12, mode "default" bindsym semicolon workspace back_and_forth, mode "default" # move focused container to workspace bindsym Shift+1 move container to workspace 1, mode "default" bindsym Shift+2 move container to workspace 2, mode "default" bindsym Shift+3 move container to workspace 3, mode "default" bindsym Shift+4 move container to workspace 4, mode "default" bindsym Shift+5 move container to workspace 5, mode "default" bindsym Shift+6 move container to workspace 6, mode "default" bindsym Shift+7 move container to workspace 7, mode "default" bindsym Shift+8 move container to workspace 8, mode "default" bindsym Shift+9 move container to workspace 9, mode "default" bindsym Shift+0 move container to workspace 10, mode "default" bindsym Shift+F1 move container to workspace 11:F1, mode "default" bindsym Shift+F2 move container to workspace 12:F2, mode "default" bindsym Shift+F3 move container to workspace 13:F3, mode "default" bindsym Shift+F4 move container to workspace 14:F4, mode "default" bindsym Shift+F5 move container to workspace 15:F5, mode "default" bindsym Shift+F6 move container to workspace 16:F6, mode "default" bindsym Shift+F7 move container to workspace 17:F7, mode "default" bindsym Shift+F8 move container to workspace 18:F8, mode "default" bindsym Shift+F9 move container to workspace 19:F9, mode "default" bindsym Shift+F10 move container to workspace 20:F10, mode "default" bindsym Shift+F11 move container to workspace 21:F11, mode "default" bindsym Shift+F12 move container to workspace 22:F12, mode "default" bindsym Shift+semicolon move container to workspace back_and_forth, \ mode "default" bindsym Shift+Ctrl+semicolon move container to workspace back_and_forth, \ workspace back_and_forth, mode "default" # next unused workspace bindsym j exec --no-startup-id \ ~/src/dotfiles/scripts/desktop/fresh-workspace, \ mode "default" # sends window to next unused but doesn't change view bindsym Shift+j exec --no-startup-id \ ~/src/dotfiles/scripts/desktop/fresh-workspace --send, \ mode "default" # sends window to next unused and changes view bindsym Shift+Ctrl+j exec --no-startup-id \ ~/src/dotfiles/scripts/desktop/fresh-workspace --take, \ mode "default" # go to windows for tasks without needing to know the workspace # bindsym slash exec --no-startup-id rofi -show window, mode "default" bindsym slash exec ~/src/dotfiles/scripts/desktop/dmenu_window \ -nf '#000000' -nb '#FFFFF6' -sb '#B4EEB4' -sf '#000000', \ mode "default" # reload the configuration file -- useful simply to reexecute # startup scripts bindsym c reload; \ exec --no-startup-id ~/src/dotfiles/bin/i3-startup-always, \ mode "default" # restart i3 inplace (preserves your layout/session, can be # used to upgrade i3) bindsym Ctrl+Shift+r restart, mode "default" # exit i3 (logs you out of your X session) bindsym Ctrl+Shift+e exec "i3-nagbar -t warning \ -m 'You pressed the exit shortcut. Do you really want to exit i3? This will end your X session.' \ -b 'Yes, exit i3' 'i3-msg exit'", mode "default" bindsym g mode "C-i g-" # chat bindsym Shift+n exec xfce4-terminal --title="irssi" -x \ /bin/sh -c "mosh athena /home/spwhitton/src/dotfiles/bin/ii", \ mode "default" bindsym n [class="^Xfce4-terminal$" title="^irssi$"] focus, \ mode "default" bindsym space mode "default" bindsym Ctrl+g mode "default" } # C-i is perfect for window manager bindings because it will never be # bound in my Emacs config, as text terminals typically cannot # distinguish between and C-i bindsym Ctrl+i mode "C-i-" # change focus bindsym Mod4+j focus left bindsym Mod4+k focus right bindsym Mod4+n focus down bindsym Mod4+p focus up # move focused window bindsym Mod4+Ctrl+j move left bindsym Mod4+Ctrl+k move right bindsym Mod4+Ctrl+n move down bindsym Mod4+Ctrl+p move up bindsym Mod4+apostrophe layout toggle split bindsym Mod1+Ctrl+i kill # Cycle through all workspaces on monitor. Unlike C-i j and C-i [0-9]+, these # move the container *and* switch view to the other workspace, because there # are more like Mod4+Ctrl+j/k than they are like the C-i bindings bindsym Mod4+comma workspace prev_on_output bindsym Mod4+period workspace next_on_output bindsym Mod4+Ctrl+less move container to workspace prev_on_output, \ workspace prev_on_output bindsym Mod4+Ctrl+greater move container to workspace next_on_output, \ workspace next_on_output # # move focus between monitors -- if we have more than one monitor, we # # probably have a numeric keypad available. # # subtleties: # bindsym Mod4+Mod2+KP_4 focus output left # bindsym Mod4+KP_Left focus output left # bindsym Mod4+Mod2+KP_6 focus output right # bindsym Mod4+KP_Right focus output right # # move focused workspace between monitors # bindsym Mod4+Ctrl+Mod2+KP_Left move workspace to output left # bindsym Mod4+Ctrl+KP_4 move workspace to output left # bindsym Mod4+Ctrl+Mod2+KP_Right move workspace to output right # bindsym Mod4+Ctrl+KP_6 move workspace to output right bindsym Mod4+i focus output left bindsym Mod4+Ctrl+i move workspace to output left bindsym Mod4+o focus output right bindsym Mod4+Ctrl+o move workspace to output right # Start i3bar to display a workspace bar (plus the system information i3status # finds out, if available) bar { # i3status is designed to be highly performant so it continues # to be refreshed when the system is under load; we're giving # up some of that with i3status-wrapper, but let's see if it # actually matters status_command ~/src/dotfiles/scripts/desktop/i3status-wrapper # default behaviour is to cycle through workspaces when scroll # wheel is used on the bar. However, don't think I've ever # used this deliberately, and often I do it by mistake, so # let's disable it bindsym button4 nop bindsym button5 nop colors { background #FFFFF6 statusline #000000 separator #000000 focused_workspace #000000 #B4EEB4 #000000 active_workspace #000000 #FFFFF6 #000000 inactive_workspace #000000 #E5E5E5 #000000 urgent_workspace #000000 #900000 #FFFFF6 binding_mode #000000 #900000 #FFFFF6 } position bottom strip_workspace_numbers yes tray_output primary } # single key launching mode "C-i g-" { # start a graphical file manager bindsym g exec thunar , mode "default" # launch xrandr graphical config bindsym x exec arandr , mode "default" # bindsym x exec xfce4-display-settings , mode "default" # # get a new VT from lightdm # bindsym g exec dm-tool switch-to-greeter , mode "default" # adjust volume bindsym v exec xfce4-terminal -e alsamixer , mode "default" # work around bugs -- this fixes Emacs suddenly not accepting any # keyboard input until a new frame is opened and then closed using # emacsclient(1) bindsym i exec ibus restart , mode "default" bindsym Ctrl+g mode "default" } # audio bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +10% bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -10% bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle exec --no-startup-id emacsclient --spw/update-environment exec --no-startup-id xss-lock --transfer-sleep-lock -- \ i3lock --nofork --ignore-empty-password --color=FFFFF6 exec --no-startup-id nm-applet exec --no-startup-id caffeine-indicator # relies on existence of ~/.config/redshift.conf with latitude and longitude exec --no-startup-id redshift-gtk # for brightness control exec --no-startup-id xfce4-power-manager # idempotent settings and tweaks script exec_always --no-startup-id ~/src/dotfiles/bin/i3-startup-always popup_during_fullscreen leave_fullscreen # windows that should always float for_window [title="^vokoscreen"] floating enable for_window [title="vokoscreen webcam"] border pixel 1 for_window [title="^Ediff"] floating enable # # i3 titlebars are not very useful for Emacs frames; let's have an extra line # # of buffer text # for_window [class="^Emacs"] border pixel 2