summaryrefslogtreecommitdiff
path: root/.config/i3/config
blob: 402939ed9a99bcae8ad34d7bb435de87b54f8e88 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
# 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 #AA9E9F   #AA9E9F
client.unfocused        #000000 #E5E5E5 #000000 #AA9E9F   #AA9E9F
client.urgent           #000000 #702020 #FFFFF6 #AA9E9F   #AA9E9F
client.placeholder      #000000 #000000 #FFFFF6 #AA9E9F   #AA9E9F

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

# Key binding strategy:
#
# Use Ctrl+N and Mod1+Ctrl+N, which will never be bound in Emacs, for bindings
# I will often need to type more than once in a row.  Otherwise put the
# bindings under the C-i prefix map, which will never be bound by Emacs
# because text terminals typically can't distinguish between C-i and TAB.
# If we need it, we can bind C-i Ctrl+N, C-i Mod1+Ctrl+N to pass the keys
# through, like C-\ \ in tmux.
#
# Previously we used Mod4 modifying a key on the right side of the keyboard
# instead of Ctrl+N and Mod1+Ctrl+N; there are enough of these that we can
# still avoid any one-handed chording with only a single Super key.  However,
# this means using the weak little finger to hold down a modifier key for more
# than one keypress with the other hand, which is worth avoiding.

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 -ncw15, mode "default"

	# override the script's usual logic to start a fresh, non-debug daemon
	bindsym Ctrl+Mod1+e exec emacsclient -ncw8 --spw/installed, \
		mode "default"

	# special daemon instance for debugging primary instance & Gnus
	bindsym r exec emacsclient -ncw8 -sgdbmacs, 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 -ncw15 -e			 \
		"(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 Ctrl+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 Ctrl+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 a 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 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 Mod1+1 move container to workspace 1, mode "default"
        bindsym Mod1+2 move container to workspace 2, mode "default"
        bindsym Mod1+3 move container to workspace 3, mode "default"
        bindsym Mod1+4 move container to workspace 4, mode "default"
        bindsym Mod1+5 move container to workspace 5, mode "default"
        bindsym Mod1+6 move container to workspace 6, mode "default"
        bindsym Mod1+7 move container to workspace 7, mode "default"
        bindsym Mod1+8 move container to workspace 8, mode "default"
        bindsym Mod1+9 move container to workspace 9, mode "default"
        bindsym Mod1+0 move container to workspace 10, mode "default"
        bindsym Mod1+F1 move container to workspace 11:F1, mode "default"
        bindsym Mod1+F2 move container to workspace 12:F2, mode "default"
        bindsym Mod1+F3 move container to workspace 13:F3, mode "default"
        bindsym Mod1+F4 move container to workspace 14:F4, mode "default"
        bindsym Mod1+F5 move container to workspace 15:F5, mode "default"
        bindsym Mod1+F6 move container to workspace 16:F6, mode "default"
        bindsym Mod1+F7 move container to workspace 17:F7, mode "default"
        bindsym Mod1+F8 move container to workspace 18:F8, mode "default"
        bindsym Mod1+F9 move container to workspace 19:F9, mode "default"
        bindsym Mod1+F10 move container to workspace 20:F10, mode "default"
        bindsym Mod1+F11 move container to workspace 21:F11, mode "default"
        bindsym Mod1+F12 move container to workspace 22:F12, mode "default"
        bindsym Mod1+semicolon move container to workspace back_and_forth, \
                mode "default"
        bindsym Mod1+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 Mod1+j exec --no-startup-id \
                ~/src/dotfiles/scripts/desktop/fresh-workspace --send, \
                mode "default"
	# sends window to next unused and changes view
	bindsym Mod1+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 Ctrl+Mod1+c reload; \
                exec --no-startup-id ~/src/dotfiles/scripts/desktop/i3-startup-always, \
                mode "default"
        # restart i3 inplace (preserves your layout/session, can be
        # used to upgrade i3)
        bindsym Ctrl+Mod1+r restart, mode "default"
        # exit i3 (logs you out of your X session)
        bindsym Ctrl+Mod1+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-"

        bindsym n exec i3-msg '[title="\[mosh\] tmux default on athena"]' focus \
		|| xfce4-terminal -x ssh-and-tmux athena.silentflame.com, mode "default"

        bindsym Ctrl+g mode "default"
}
bindsym Ctrl+i mode "C-i-"

# change focus
bindsym Ctrl+7 focus left
bindsym Ctrl+0 focus right
bindsym Ctrl+8 focus down
bindsym Ctrl+9 focus up

# move focused window
bindsym Mod1+Ctrl+7 move left
bindsym Mod1+Ctrl+0 move right
bindsym Mod1+Ctrl+8 move down
bindsym Mod1+Ctrl+9 move up

bindsym Ctrl+5 kill
bindsym Ctrl+6 fullscreen toggle

bindsym Ctrl+apostrophe layout toggle splith splitv tabbed

# Cycle through all workspaces on monitor.
bindsym Ctrl+1 workspace prev_on_output
bindsym Ctrl+4 workspace next_on_output
bindsym Mod1+Ctrl+1 move container to workspace prev_on_output, \
        workspace prev_on_output
bindsym Mod1+Ctrl+4 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: <https://github.com/i3/i3/issues/2558>
# 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 Ctrl+2 focus output left
bindsym Mod1+Ctrl+2 move workspace to output left
bindsym Ctrl+3 focus output right
bindsym Mod1+Ctrl+3 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 #702020 #FFFFF6
            binding_mode       #000000 #EECD82 #000000
        }

        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@ +5%
bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -5%
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 emacsclient \
        -sgdbmacs --spw/no-start --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/scripts/desktop/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