]> git.sur5r.net Git - i3/i3/blob - docs/userguide
Merge branch 'gitignore'
[i3/i3] / docs / userguide
1 i3 User’s Guide
2 ===============
3 Michael Stapelberg <michael+i3@stapelberg.de>
4 April 2012
5
6 This document contains all the information you need to configure and use the i3
7 window manager. If it does not, please contact us on IRC (preferred) or post your
8 question(s) on the mailing list.
9
10 == Default keybindings
11
12 For the "too long; didn’t read" people, here is an overview of the default
13 keybindings (click to see the full size image):
14
15 *Keys to use with mod (alt):*
16
17 image:keyboard-layer1.png["Keys to use with mod (alt)",width=600,link="keyboard-layer1.png"]
18
19 *Keys to use with Shift+mod:*
20
21 image:keyboard-layer2.png["Keys to use with Shift+mod",width=600,link="keyboard-layer2.png"]
22
23 The red keys are the modifiers you need to press (by default), the blue keys
24 are your homerow.
25
26 == Using i3
27
28 Throughout this guide, the keyword +mod+ will be used to refer to the
29 configured modifier. This is the alt key (Mod1) by default, with windows (Mod4)
30 being a popular alternative.
31
32 === Opening terminals and moving around
33
34 One very basic operation is opening a new terminal. By default, the keybinding
35 for this is mod+Enter, that is Alt+Enter in the default configuration. By
36 pressing mod+Enter, a new terminal will be opened.  It will fill the whole
37 space available on your screen.
38
39 image:single_terminal.png[Single terminal]
40
41 If you now open another terminal, i3 will place it next to the current one,
42 splitting the screen size in half. Depending on your monitor, i3 will put the
43 created window beside the existing window (on wide displays) or below the
44 existing window (rotated displays).
45
46 image:two_terminals.png[Two terminals]
47
48 To move the focus between the two terminals, you can use the direction keys
49 which you may know from the editor +vi+. However, in i3, your homerow is used
50 for these keys (in +vi+, the keys are shifted to the left by one for
51 compatibility with most keyboard layouts). Therefore, +mod+J+ is left, +mod+K+
52 is down, +mod+L+ is up and `mod+;` is right. So, to switch between the
53 terminals, use +mod+K+ or +mod+L+. Of course, you can also use the arrow keys.
54
55 At the moment, your workspace is split (it contains two terminals) in a
56 specific direction (horizontal by default). Every window can be split
57 horizontally or vertically again, just like the workspace. The terminology is
58 "window" for a container that actually contains an X11 window (like a terminal
59 or browser) and "split container" for containers that consist of one or more
60 windows.
61
62 TODO: picture of the tree
63
64 To split a window vertically, press +mod+v+. To split it horizontally, press
65 +mod+h+.
66
67 === Changing the container layout
68
69 A split container can have one of the following layouts:
70
71 default::
72 Windows are sized so that every window gets an equal amount of space in the
73 container.
74 stacking::
75 Only the focused window in the container is displayed. You get a list of
76 windows at the top of the container.
77 tabbed::
78 The same principle as +stacking+, but the list of windows at the top is only
79 a single line which is vertically split.
80
81 To switch modes, press +mod+e+ for default, +mod+s+ for stacking and
82 +mod+w+ for tabbed.
83
84 image:modes.png[Container modes]
85
86 === Toggling fullscreen mode for a window
87
88 To display a window in fullscreen mode or to go out of fullscreen mode again,
89 press +mod+f+.
90
91 There is also a global fullscreen mode in i3 in which the client will span all
92 available outputs (the command is +fullscreen global+).
93
94 === Opening other applications
95
96 Aside from opening applications from a terminal, you can also use the handy
97 +dmenu+ which is opened by pressing +mod+d+ by default. Just type the name
98 (or a part of it) of the application which you want to open. The corresponding
99 application has to be in your +$PATH+ for this to work.
100
101 Additionally, if you have applications you open very frequently, you can
102 create a keybinding for starting the application directly. See the section
103 <<configuring>> for details.
104
105 === Closing windows
106
107 If an application does not provide a mechanism for closing (most applications
108 provide a menu, the escape key or a shortcut like +Control+W+ to close), you
109 can press +mod+Shift+q+ to kill a window. For applications which support
110 the WM_DELETE protocol, this will correctly close the application (saving
111 any modifications or doing other cleanup). If the application doesn’t support
112 the WM_DELETE protocol your X server will kill the window and the behaviour
113 depends on the application.
114
115 === Using workspaces
116
117 Workspaces are an easy way to group a set of windows. By default, you are on
118 the first workspace, as the bar on the bottom left indicates. To switch to
119 another workspace, press +mod+num+ where +num+ is the number of the workspace
120 you want to use. If the workspace does not exist yet, it will be created.
121
122 A common paradigm is to put the web browser on one workspace, communication
123 applications (+mutt+, +irssi+, ...) on another one, and the ones with which you
124 work, on the third one. Of course, there is no need to follow this approach.
125
126 If you have multiple screens, a workspace will be created on each screen at
127 startup. If you open a new workspace, it will be bound to the screen you
128 created it on.  When you switch to a workspace on another screen, i3 will set
129 focus to that screen.
130
131 === Moving windows to workspaces
132
133 To move a window to another workspace, simply press +mod+Shift+num+ where
134 +num+ is (like when switching workspaces) the number of the target workspace.
135 Similarly to switching workspaces, the target workspace will be created if
136 it does not yet exist.
137
138 === Resizing
139
140 The easiest way to resize a container is by using the mouse: Grab the border
141 and move it to the wanted size.
142
143 See <<resizingconfig>> for how to configure i3 to be able to resize
144 columns/rows with your keyboard.
145
146 === Restarting i3 inplace
147
148 To restart i3 inplace (and thus get into a clean state if there is a bug, or
149 to upgrade to a newer version of i3) you can use +mod+Shift+r+.
150
151 === Exiting i3
152
153 To cleanly exit i3 without killing your X server, you can use +mod+Shift+e+.
154
155 === Floating
156
157 Floating mode is the opposite of tiling mode. The position and size of a window
158 are not managed by i3, but by you. Using this mode violates the tiling
159 paradigm but can be useful for some corner cases like "Save as" dialog
160 windows, or toolbar windows (GIMP or similar). Those windows usually set the
161 appropriate hint and are opened in floating mode by default.
162
163 You can toggle floating mode for a window by pressing +mod+Shift+Space+. By
164 dragging the window’s titlebar with your mouse you can move the window
165 around. By grabbing the borders and moving them you can resize the window. You
166 can also do that by using the <<floating_modifier>>.
167
168 For resizing floating windows with your keyboard, see <<resizingconfig>>.
169
170 Floating windows are always on top of tiling windows.
171
172 == Tree
173
174 i3 stores all information about the X11 outputs, workspaces and layout of the
175 windows on them in a tree. The root node is the X11 root window, followed by
176 the X11 outputs, then dock areas and a content container, then workspaces and
177 finally the windows themselves. In previous versions of i3 we had multiple lists
178 (of outputs, workspaces) and a table for each workspace. That approach turned
179 out to be complicated to use (snapping), understand and implement.
180
181 === The tree consists of Containers
182
183 The building blocks of our tree are so called +Containers+. A +Container+ can
184 host a window (meaning an X11 window, one that you can actually see and use,
185 like a browser). Alternatively, it could contain one or more +Containers+. A
186 simple example is the workspace: When you start i3 with a single monitor, a
187 single workspace and you open two terminal windows, you will end up with a tree
188 like this:
189
190 image::tree-layout2.png["layout2",float="right"]
191 image::tree-shot4.png["shot4",title="Two terminals on standard workspace"]
192
193 === Orientation and Split Containers
194
195 [[OrientationSplit]]
196
197 It is only natural to use so-called +Split Containers+ in order to build a
198 layout when using a tree as data structure. In i3, every +Container+ has an
199 orientation (horizontal, vertical or unspecified). So, in our example with the
200 workspace, the default orientation of the workspace +Container+ is horizontal
201 (most monitors are widescreen nowadays). If you change the orientation to
202 vertical (+mod+v+ in the default config) and *then* open two terminals, i3 will
203 configure your windows like this:
204
205 image::tree-shot2.png["shot2",title="Vertical Workspace Orientation"]
206
207 An interesting new feature of the tree branch is the ability to split anything:
208 Let’s assume you have two terminals on a workspace (with horizontal
209 orientation), focus is on the right terminal. Now you want to open another
210 terminal window below the current one. If you would just open a new terminal
211 window, it would show up to the right due to the horizontal workspace
212 orientation. Instead, press +mod+v+ to create a +Vertical Split Container+ (to
213 open a +Horizontal Split Container+, use +mod+h+). Now you can open a new
214 terminal and it will open below the current one:
215
216 image::tree-layout1.png["Layout",float="right"]
217 image::tree-shot1.png["shot",title="Vertical Split Container"]
218
219 unfloat::[]
220
221 You probably guessed it already: There is no limit on how deep your hierarchy
222 of splits can be.
223
224 === Focus parent
225
226 Let’s stay with our example from above. We have a terminal on the left and two
227 vertically split terminals on the right, focus is on the bottom right one. When
228 you open a new terminal, it will open below the current one.
229
230 So, how can you open a new terminal window to the *right* of the current one?
231 The solution is to use +focus parent+, which will focus the +Parent Container+ of
232 the current +Container+. In this case, you would focus the +Vertical Split
233 Container+ which is *inside* the horizontally oriented workspace. Thus, now new
234 windows will be opened to the right of the +Vertical Split Container+:
235
236 image::tree-shot3.png["shot3",title="Focus parent, then open new terminal"]
237
238 === Implicit containers
239
240 In some cases, i3 needs to implicitly create a container to fulfill your
241 command.
242
243 One example is the following scenario: You start i3 with a single monitor and a
244 single workspace on which you open three terminal windows. All these terminal
245 windows are directly attached to one node inside i3’s layout tree, the
246 workspace node. By default, the workspace node’s orientation is +horizontal+.
247
248 Now you move one of these terminals down (+mod+k+ by default). The workspace
249 node’s orientation will be changed to +vertical+. The terminal window you moved
250 down is directly attached to the workspace and appears on the bottom of the
251 screen. A new (horizontal) container was created to accomodate the other two
252 terminal windows. You will notice this when switching to tabbed mode (for
253 example). You would end up having one tab called "another container" and the
254 other one being the terminal window you moved down.
255
256 [[configuring]]
257 == Configuring i3
258
259 This is where the real fun begins ;-). Most things are very dependant on your
260 ideal working environment so we can’t make reasonable defaults for them.
261
262 While not using a programming language for the configuration, i3 stays
263 quite flexible in regards to the things you usually want your window manager
264 to do.
265
266 For example, you can configure bindings to jump to specific windows,
267 you can set specific applications to start on specific workspaces, you can
268 automatically start applications, you can change the colors of i3, and you
269 can bind your keys to do useful things.
270
271 To change the configuration of i3, copy +/etc/i3/config+ to +\~/.i3/config+
272 (or +~/.config/i3/config+ if you like the XDG directory scheme) and edit it
273 with a text editor.
274
275 On first start (and on all following starts, unless you have a configuration
276 file), i3 will offer you to create a configuration file. You can tell the
277 wizard to use either Alt (Mod1) or Windows (Mod4) as modifier in the config
278 file. Also, the created config file will use the key symbols of your current
279 keyboard layout. To start the wizard, use the command +i3-config-wizard+.
280 Please note that you must not have +~/.i3/config+, otherwise the wizard will
281 exit.
282
283 === Comments
284
285 It is possible and recommended to use comments in your configuration file to
286 properly document your setup for later reference. Comments are started with
287 a # and can only be used at the beginning of a line:
288
289 *Examples*:
290 -------------------
291 # This is a comment
292 -------------------
293
294 === Fonts
295
296 i3 uses X core fonts (not Xft) for rendering window titles. You can use
297 +xfontsel(1)+ to generate such a font description. To see special characters
298 (Unicode), you need to use a font which supports the ISO-10646 encoding.
299
300 If i3 cannot open the configured font, it will output an error in the logfile
301 and fall back to a working font.
302
303 *Syntax*:
304 ------------------------------
305 font <X core font description>
306 ------------------------------
307
308 *Examples*:
309 --------------------------------------------------------------
310 font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
311 --------------------------------------------------------------
312
313 [[keybindings]]
314
315 === Keyboard bindings
316
317 A keyboard binding makes i3 execute a command (see below) upon pressing a
318 specific key. i3 allows you to bind either on keycodes or on keysyms (you can
319 also mix your bindings, though i3 will not protect you from overlapping ones).
320
321 * A keysym (key symbol) is a description for a specific symbol, like "a"
322   or "b", but also more strange ones like "underscore" instead of "_". These
323   are the ones you use in Xmodmap to remap your keys. To get the current
324   mapping of your keys, use +xmodmap -pke+. To interactively enter a key and
325   see what keysym it is configured to, use +xev+.
326
327 * Keycodes do not need to have a symbol assigned (handy for custom vendor
328   hotkeys on some notebooks) and they will not change their meaning as you
329   switch to a different keyboard layout (when using +xmodmap+).
330
331 My recommendation is: If you often switch keyboard layouts but you want to keep
332 your bindings in the same physical location on the keyboard, use keycodes.
333 If you don’t switch layouts, and want a clean and simple config file, use
334 keysyms.
335
336 *Syntax*:
337 ----------------------------------
338 bindsym [Modifiers+]keysym command
339 bindcode [Modifiers+]keycode command
340 ----------------------------------
341
342 *Examples*:
343 --------------------------------
344 # Fullscreen
345 bindsym mod+f fullscreen
346
347 # Restart
348 bindsym mod+Shift+r restart
349
350 # Notebook-specific hotkeys
351 bindcode 214 exec /home/michael/toggle_beamer.sh
352 --------------------------------
353
354 Available Modifiers:
355
356 Mod1-Mod5, Shift, Control::
357 Standard modifiers, see +xmodmap(1)+
358
359 Mode_switch::
360 Unlike other window managers, i3 can use Mode_switch as a modifier. This allows
361 you to remap capslock (for example) to Mode_switch and use it for both: typing
362 umlauts or special characters 'and' having some comfortably reachable key
363 bindings. For example, when typing, capslock+1 or capslock+2 for switching
364 workspaces is totally convenient. Try it :-).
365
366 [[floating_modifier]]
367
368 === The floating modifier
369
370 To move floating windows with your mouse, you can either grab their titlebar
371 or configure the so called floating modifier which you can then press and
372 click anywhere in the window itself to move it. The most common setup is to
373 use the same key you use for managing windows (Mod1 for example). Then
374 you can press Mod1, click into a window using your left mouse button, and drag
375 it to the position you want.
376
377 When holding the floating modifier, you can resize a floating window by
378 pressing the right mouse button on it and moving around while holding it. If
379 you hold the shift button as well, the resize will be proportional (the aspect
380 ratio will be preserved).
381
382 *Syntax*:
383 --------------------------------
384 floating_modifier <Modifiers>
385 --------------------------------
386
387 *Example*:
388 --------------------------------
389 floating_modifier Mod1
390 --------------------------------
391
392 === Constraining floating window size
393
394 The maximum and minimum dimensions of floating windows can be specified. If
395 either dimension of +floating_maximum_size+ is specified as -1, that dimension
396 will be unconstrained with respect to its maximum value. If either dimension of
397 +floating_maximum_size+ is undefined, or specified as 0, i3 will use a default
398 value to constrain the maximum size. +floating_minimum_size+ is treated in a
399 manner analogous to +floating_maximum_size+.
400
401 *Syntax*:
402 ----------------------------------------
403 floating_minimum_size <width> x <height>
404 floating_maximum_size <width> x <height>
405 ----------------------------------------
406
407 *Example*:
408 --------------------------------------
409 floating_minimum_size 75 x 50
410 floating_maximum_size -1 x -1
411 --------------------------------------
412
413 === Orientation for new workspaces
414
415 New workspaces get a reasonable default orientation: Wide-screen monitors
416 (anything wider than high) get horizontal orientation, rotated monitors
417 (anything higher than wide) get vertical orientation.
418
419 With the +default_orientation+ configuration directive, you can override that
420 behaviour.
421
422 *Syntax*:
423 ----------------------------------------------
424 default_orientation <horizontal|vertical|auto>
425 ----------------------------------------------
426
427 *Example*:
428 ----------------------------
429 default_orientation vertical
430 ----------------------------
431
432 === Layout mode for new containers
433
434 This option determines in which mode new containers on workspace level will
435 start.
436 ///////////////////////////////
437 See also <<stack-limit>>.
438 //////////////////////////////
439
440 *Syntax*:
441 ---------------------------------------------
442 workspace_layout <default|stacking|tabbed>
443 ---------------------------------------------
444 /////////////////////////////////////////////
445 new_container stack-limit <cols|rows> <value>
446 /////////////////////////////////////////////
447
448 *Example*:
449 ---------------------
450 workspace_layout tabbed
451 ---------------------
452
453 === Border style for new windows
454
455 This option determines which border style new windows will have. The default is
456 "normal".
457
458 *Syntax*:
459 ---------------------------------------------
460 new_window <normal|1pixel|none>
461 ---------------------------------------------
462
463 *Example*:
464 ---------------------
465 new_window 1pixel
466 ---------------------
467
468 === Arbitrary commands for specific windows (for_window)
469
470 With the +for_window+ command, you can let i3 execute any command when it
471 encounters a specific window. This can be used to set windows to floating or to
472 change their border style, for example.
473
474 *Syntax*:
475 -----------------------------
476 for_window <criteria> command
477 -----------------------------
478
479 *Examples*:
480 ------------------------------------------------
481 # enable floating mode for all XTerm windows
482 for_window [class="XTerm"] floating enable
483
484 # Make all urxvts use a 1-pixel border:
485 for_window [class="urxvt"] border 1pixel
486
487 # A less useful, but rather funny example:
488 # makes the window floating as soon as I change
489 # directory to ~/work
490 for_window [title="x200: ~/work"] floating enable
491 ------------------------------------------------
492
493 The valid criteria are the same as those for commands, see <<command_criteria>>.
494
495 === Variables
496
497 As you learned in the section about keyboard bindings, you will have
498 to configure lots of bindings containing modifier keys. If you want to save
499 yourself some typing and be able to change the modifier you use later,
500 variables can be handy.
501
502 *Syntax*:
503 --------------
504 set $name value
505 --------------
506
507 *Example*:
508 ------------------------
509 set $m Mod1
510 bindsym $m+Shift+r restart
511 ------------------------
512
513 Variables are directly replaced in the file when parsing. There is no fancy
514 handling and there are absolutely no plans to change this. If you need a more
515 dynamic configuration you should create a little script which generates a
516 configuration file and run it before starting i3 (for example in your
517 +~/.xsession+ file).
518
519 === Automatically putting clients on specific workspaces
520
521 [[assign_workspace]]
522
523 To automatically make a specific window show up on a specific workspace, you
524 can use an *assignment*. You can match windows by using any criteria,
525 see <<command_criteria>>. It is recommended that you match on window classes
526 (and instances, when appropriate) instead of window titles whenever possible
527 because some applications first create their window, and then worry about
528 setting the correct title. Firefox with Vimperator comes to mind. The window
529 starts up being named Firefox, and only when Vimperator is loaded does the
530 title change. As i3 will get the title as soon as the application maps the
531 window (mapping means actually displaying it on the screen), you’d need to have
532 to match on 'Firefox' in this case.
533
534 *Syntax*:
535 ------------------------------------------------------------
536 assign <criteria> [→] workspace
537 ------------------------------------------------------------
538
539 *Examples*:
540 ----------------------
541 # Assign URxvt terminals to workspace 2
542 assign [class="URxvt"] 2
543
544 # Same thing, but more precise (exact match instead of substring)
545 assign [class="^URxvt$"] 2
546
547 # Same thing, but with a beautiful arrow :)
548 assign [class="^URxvt$"] → 2
549
550 # Assignment to a named workspace
551 assign [class="^URxvt$"] → work
552
553 # Start urxvt -name irssi
554 assign [class="^URxvt$" instance="^irssi$"] → 3
555 ----------------------
556
557 Note that the arrow is not required, it just looks good :-). If you decide to
558 use it, it has to be a UTF-8 encoded arrow, not `->` or something like that.
559
560 To get the class and instance, you can use +xprop+. After clicking on the
561 window, you will see the following output:
562
563 *xprop*:
564 -----------------------------------
565 WM_CLASS(STRING) = "irssi", "URxvt"
566 -----------------------------------
567
568 The first part of the WM_CLASS is the instance ("irssi" in this example), the
569 second part is the class ("URxvt" in this example).
570
571 Should you have any problems with assignments, make sure to check the i3
572 logfile first (see http://i3wm.org/docs/debugging.html). It includes more
573 details about the matching process and the window’s actual class, instance and
574 title when starting up.
575
576 === Automatically starting applications on i3 startup
577
578 By using the +exec+ keyword outside a keybinding, you can configure
579 which commands will be performed by i3 on initial startup. +exec+
580 commands will not run when restarting i3, if you need a command to run
581 also when restarting i3 you should use the +exec_always+
582 keyword. These commands will be run in order.
583
584 *Syntax*:
585 -------------------
586 exec [--no-startup-id] command
587 exec_always [--no-startup-id] command
588 -------------------
589
590 *Examples*:
591 --------------------------------
592 exec chromium
593 exec_always ~/my_script.sh
594
595 # Execute the terminal emulator urxvt, which is not yet startup-notification aware.
596 exec --no-startup-id urxvt
597 --------------------------------
598
599 The flag --no-startup-id is explained in <<exec>>.
600
601 [[workspace_screen]]
602
603 === Automatically putting workspaces on specific screens
604
605 If you assign clients to workspaces, it might be handy to put the
606 workspaces on specific screens. Also, the assignment of workspaces to screens
607 will determine which workspace i3 uses for a new screen when adding screens
608 or when starting (e.g., by default it will use 1 for the first screen, 2 for
609 the second screen and so on).
610
611 *Syntax*:
612 ----------------------------------
613 workspace <workspace> output <output>
614 ----------------------------------
615
616 The 'output' is the name of the RandR output you attach your screen to. On a
617 laptop, you might have VGA1 and LVDS1 as output names. You can see the
618 available outputs by running +xrandr --current+.
619
620 If you use named workspaces, they must be quoted:
621
622 *Examples*:
623 ---------------------------
624 workspace 1 output LVDS1
625 workspace 5 output VGA1
626 workspace "2: vim" output VGA1
627 ---------------------------
628
629 === Changing colors
630
631 You can change all colors which i3 uses to draw the window decorations.
632
633 *Syntax*:
634 --------------------------------------------
635 colorclass border background text indicator
636 --------------------------------------------
637
638 Where colorclass can be one of:
639
640 client.focused::
641         A client which currently has the focus.
642 client.focused_inactive::
643         A client which is the focused one of its container, but it does not have
644         the focus at the moment.
645 client.unfocused::
646         A client which is not the focused one of its container.
647 client.urgent::
648         A client which has its urgency hint activated.
649
650 You can also specify the color to be used to paint the background of the client
651 windows. This color will be used to paint the window on top of which the client
652 will be rendered.
653
654 *Syntax*:
655 -----------------------
656 client.background color
657 -----------------------
658
659 Only clients that do not cover the whole area of this window expose the color
660 used to paint it. If you use a color other than black for your terminals, you
661 most likely want to set the client background color to the same color as your
662 terminal program's background color to avoid black gaps between the rendered
663 area of the terminal and the i3 border.
664
665 Colors are in HTML hex format (#rrggbb), see the following example:
666
667 *Examples (default colors)*:
668 ---------------------------------------------------------
669 # class                 border  backgr. text    indicator
670 client.focused          #4c7899 #285577 #ffffff #2e9ef4
671 client.focused_inactive #333333 #5f676a #ffffff #484e50
672 client.unfocused        #333333 #222222 #888888 #292d2e
673 client.urgent           #2f343a #900000 #ffffff #900000
674 ---------------------------------------------------------
675
676 Note that for the window decorations, the color around the child window is the
677 background color, and the border color is only the two thin lines at the top of
678 the window.
679
680 The indicator color is used for indicating where a new window will be opened.
681 For horizontal split containers, the right border will be painted in indicator
682 color, for vertical split containers, the bottom border. This only applies to
683 single windows within a split container, which are otherwise indistinguishable
684 from single windows outside of a split container.
685
686 === Interprocess communication
687
688 i3 uses unix sockets to provide an IPC interface. This allows third-party
689 programs to get information from i3, such as the current workspaces
690 (to display a workspace bar), and to control i3.
691
692 The IPC socket is enabled by default and will be created in
693 +/tmp/i3-%u.XXXXXX/ipc-socket.%p+ where +%u+ is your UNIX username, +%p+ is
694 the PID of i3 and XXXXXX is a string of random characters from the portable
695 filename character set (see mkdtemp(3)).
696
697 You can override the default path through the environment-variable +I3SOCK+ or
698 by specifying the +ipc-socket+ directive. This is discouraged, though, since i3
699 does the right thing by default. If you decide to change it, it is strongly
700 recommended to set this to a location in your home directory so that no other
701 user can create that directory.
702
703 *Examples*:
704 ----------------------------
705 ipc-socket ~/.i3/i3-ipc.sock
706 ----------------------------
707
708 You can then use the +i3-msg+ application to perform any command listed in
709 the next section.
710
711 === Focus follows mouse
712
713 By default, window focus follows your mouse movements. However, if you have a
714 setup where your mouse usually is in your way (like a touchpad on your laptop
715 which you do not want to disable completely), you might want to disable 'focus
716 follows mouse' and control focus only by using your keyboard.  The mouse will
717 still be useful inside the currently active window (for example to click on
718 links in your browser window).
719
720 *Syntax*:
721 ----------------------------
722 focus_follows_mouse <yes|no>
723 ----------------------------
724
725 *Example*:
726 ----------------------
727 focus_follows_mouse no
728 ----------------------
729
730 === Popups during fullscreen mode
731
732 When you are in fullscreen mode, some applications still open popup windows
733 (take Xpdf for example). This is because these applications may not be aware
734 that they are in fullscreen mode (they do not check the corresponding hint).
735 There are two things which are possible to do in this situation:
736
737 1. Just ignore the popup (don’t map it). This won’t interrupt you while you are
738    in fullscreen. However, some apps might react badly to this (deadlock until
739    you go out of fullscreen).
740 2. Leave fullscreen mode. This is the default.
741
742 *Syntax*:
743 -------------------------------------------------
744 popup_during_fullscreen <ignore|leave_fullscreen>
745 -------------------------------------------------
746
747 *Example*:
748 ------------------------------
749 popup_during_fullscreen ignore
750 ------------------------------
751
752 === Focus wrapping
753
754 When being in a tabbed or stacked container, the first container will be
755 focused when you use +focus down+ on the last container -- the focus wraps. If
756 however there is another stacked/tabbed container in that direction, focus will
757 be set on that container. This is the default behaviour so you can navigate to
758 all your windows without having to use +focus parent+.
759
760 If you want the focus to *always* wrap and you are aware of using +focus
761 parent+ to switch to different containers, you can use the
762 +force_focus_wrapping+ configuration directive. After enabling it, the focus
763 will always wrap.
764
765 *Syntax*:
766 -----------------------------
767 force_focus_wrapping <yes|no>
768 -----------------------------
769
770 *Example*:
771 ------------------------
772 force_focus_wrapping yes
773 ------------------------
774
775 === Forcing Xinerama
776
777 As explained in-depth in <http://i3wm.org/docs/multi-monitor.html>, some X11
778 video drivers (especially the nVidia binary driver) only provide support for
779 Xinerama instead of RandR. In such a situation, i3 must be told to use the
780 inferior Xinerama API explicitly and therefore don’t provide support for
781 reconfiguring your screens on the fly (they are read only once on startup and
782 that’s it).
783
784 For people who do cannot modify their +~/.xsession+ to add the
785 +--force-xinerama+ commandline parameter, a configuration option is provided:
786
787 *Syntax*:
788 -----------------------
789 force_xinerama <yes|no>
790 -----------------------
791
792 *Example*:
793 ------------------
794 force_xinerama yes
795 ------------------
796
797 Also note that your output names are not descriptive (like +HDMI1+) when using
798 Xinerama, instead they are counted up, starting at 0: +xinerama-0+, +xinerama-1+, …
799
800 === Automatic back-and-forth when switching to the current workspace
801
802 This configuration directive enables automatic +workspace back_and_forth+ (see
803 <<back_and_forth>>) when switching to the workspace that is currently focused.
804
805 For instance: Assume you are on workspace "1: www" and switch to "2: IM" using
806 mod+2 because somebody sent you a message. You don’t need to remember where you
807 came from now, you can just press mod+2 again to switch back to "1: www".
808
809 *Syntax*:
810 --------------------------------------
811 workspace_auto_back_and_forth <yes|no>
812 --------------------------------------
813
814 *Example*:
815 ---------------------------------
816 workspace_auto_back_and_forth yes
817 ---------------------------------
818
819 == Configuring i3bar
820
821 The bar at the bottom of your monitor is drawn by a separate process called
822 i3bar. Having this part of "the i3 user interface" in a separate process has
823 several advantages:
824
825 1. It is a modular approach. If you don’t need a workspace bar at all, or if
826    you prefer a different one (dzen2, xmobar, maybe even gnome-panel?), you can
827    just remove the i3bar configuration and start your favorite bar instead.
828 2. It follows the UNIX philosophy of "Make each program do one thing well".
829    While i3 manages your windows well, i3bar is good at displaying a bar on
830    each monitor (unless you configure it otherwise).
831 3. It leads to two separate, clean codebases. If you want to understand i3, you
832    don’t need to bother with the details of i3bar and vice versa.
833
834 That said, i3bar is configured in the same configuration file as i3. This is
835 because it is tightly coupled with i3 (in contrary to i3lock or i3status which
836 are useful for people using other window managers). Therefore, it makes no
837 sense to use a different configuration place when we already have a good
838 configuration infrastructure in place.
839
840 Configuring your workspace bar starts with opening a +bar+ block. You can have
841 multiple bar blocks to use different settings for different outputs (monitors):
842
843 *Example*:
844 ---------------------------
845 bar {
846     status_command i3status
847 }
848 ---------------------------
849
850 === i3bar command
851
852 By default i3 will just pass +i3bar+ and let your shell handle the execution,
853 searching your +$PATH+ for a correct version.
854 If you have a different +i3bar+ somewhere or the binary is not in your +$PATH+ you can
855 tell i3 what to execute.
856
857 The specified command will be passed to +sh -c+, so you can use globbing and
858 have to have correct quoting etc.
859
860 *Syntax*:
861 ----------------------
862 i3bar_command command
863 ----------------------
864
865 *Example*:
866 -------------------------------------------------
867 bar {
868     i3bar_command /home/user/bin/i3bar
869 }
870 -------------------------------------------------
871
872 [[status_command]]
873 === Statusline command
874
875 i3bar can run a program and display every line of its +stdout+ output on the
876 right hand side of the bar. This is useful to display system information like
877 your current IP address, battery status or date/time.
878
879 The specified command will be passed to +sh -c+, so you can use globbing and
880 have to have correct quoting etc.
881
882 *Syntax*:
883 ----------------------
884 status_command command
885 ----------------------
886
887 *Example*:
888 -------------------------------------------------
889 bar {
890     status_command i3status --config ~/.i3status.conf
891 }
892 -------------------------------------------------
893
894 === Display mode
895
896 You can have i3bar either be visible permanently at one edge of the screen
897 (+dock+ mode) or make it show up when you press your modifier key (+hide+
898 mode). The modifier key can be configured using the +modifier+ option.
899
900 The hide mode maximizes screen space that can be used for actual windows. Also,
901 i3bar sends the +SIGSTOP+ and +SIGCONT+ signals to the statusline process to
902 save battery power.
903
904 The default is dock mode; in hide mode, the default modifier is Mod4 (usually
905 the windows key).
906
907 *Syntax*:
908 ----------------
909 mode <dock|hide>
910 modifier <Modifier>
911 ----------------
912
913 *Example*:
914 ----------------
915 bar {
916     mode hide
917     modifier Mod1
918 }
919 ----------------
920
921 Available modifiers are Mod1-Mod5, Shift, Control (see +xmodmap(1)+).
922
923 [[i3bar_position]]
924 === Position
925
926 This option determines in which edge of the screen i3bar should show up.
927
928 The default is bottom.
929
930 *Syntax*:
931 ---------------------
932 position <top|bottom>
933 ---------------------
934
935 *Example*:
936 ---------------------
937 bar {
938     position top
939 }
940 ---------------------
941
942 === Output(s)
943
944 You can restrict i3bar to one or more outputs (monitors). The default is to
945 handle all outputs. Restricting the outputs is useful for using different
946 options for different outputs by using multiple 'bar' blocks.
947
948 To make a particular i3bar instance handle multiple outputs, specify the output
949 directive multiple times.
950
951 *Syntax*:
952 ---------------
953 output <output>
954 ---------------
955
956 *Example*:
957 -------------------------------
958 # big monitor: everything
959 bar {
960     # The display is connected either via HDMI or via DisplayPort
961     output HDMI2
962     output DP2
963     status_command i3status
964 }
965
966 # laptop monitor: bright colors and i3status with less modules.
967 bar {
968     output LVDS1
969     status_command i3status --config ~/.i3status-small.conf
970     colors {
971         background #000000
972         statusline #ffffff
973     }
974 }
975 -------------------------------
976
977 === Tray output
978
979 i3bar by default provides a system tray area where programs such as
980 NetworkManager, VLC, Pidgin, etc. can place little icons.
981
982 You can configure on which output (monitor) the icons should be displayed or
983 you can turn off the functionality entirely.
984
985 *Syntax*:
986 -------------------------
987 tray_output <none|primary|output>
988 -------------------------
989
990 *Example*:
991 -------------------------
992 # disable system tray
993 bar {
994     tray_output none
995 }
996
997 # show tray icons on the primary monitor
998 tray_output primary
999
1000 # show tray icons on the big monitor
1001 bar {
1002     tray_output HDMI2
1003 }
1004 -------------------------
1005
1006 Note that you might not have a primary output configured yet. To do so, run:
1007 -------------------------
1008 xrandr --output <output> --primary
1009 -------------------------
1010
1011 === Font
1012
1013 Specifies the font (again, X core font, not Xft, just like in i3) to be used in
1014 the bar.
1015
1016 *Syntax*:
1017 ---------------------
1018 font <font>
1019 ---------------------
1020
1021 *Example*:
1022 --------------------------------------------------------------
1023 bar {
1024     font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
1025 }
1026 --------------------------------------------------------------
1027
1028 === Workspace buttons
1029
1030 Specifies whether workspace buttons should be shown or not. This is useful if
1031 you want to display a statusline-only bar containing additional information.
1032
1033 The default is to show workspace buttons.
1034
1035 *Syntax*:
1036 --------------------------
1037 workspace_buttons <yes|no>
1038 --------------------------
1039
1040 *Example*:
1041 --------------------
1042 bar {
1043     workspace_buttons no
1044 }
1045 --------------------
1046
1047 === Colors
1048
1049 As with i3, colors are in HTML hex format (#rrggbb). The following colors can
1050 be configured at the moment:
1051
1052 background::
1053         Background color of the bar.
1054 statusline::
1055         Text color to be used for the statusline.
1056 focused_workspace::
1057         Border, background and text color for a workspace button when the workspace
1058         has focus.
1059 active_workspace::
1060         Border, background and text color for a workspace button when the workspace
1061         is active (visible) on some output, but the focus is on another one.
1062         You can only tell this apart from the focused workspace when you are
1063         using multiple monitors.
1064 inactive_workspace::
1065         Border, background and text color for a workspace button when the workspace
1066         does not have focus and is not active (visible) on any output. This
1067         will be the case for most workspaces.
1068 urgent_workspace::
1069         Border, background and text color for a workspace button when the workspace
1070         window with the urgency hint set.
1071
1072 *Syntax*:
1073 ----------------------------------------
1074 colors {
1075     background <color>
1076     statusline <color>
1077
1078     colorclass <border> <background> <text>
1079 }
1080 ----------------------------------------
1081
1082 *Example (default colors)*:
1083 --------------------------------------
1084 bar {
1085     colors {
1086         background #000000
1087         statusline #ffffff
1088
1089         focused_workspace  #4c7899 #285577 #ffffff
1090         active_workspace   #333333 #5f676a #ffffff
1091         inactive_workspace #333333 #222222 #888888
1092         urgent_workspace   #2f343a #900000 #ffffff
1093     }
1094 }
1095 --------------------------------------
1096
1097 == List of commands
1098
1099 Commands are what you bind to specific keypresses. You can also issue commands
1100 at runtime without pressing a key by using the IPC interface. An easy way to
1101 do this is to use the +i3-msg+ utility:
1102
1103 *Example*:
1104 --------------------------
1105 # execute this on your shell to make the current container borderless
1106 i3-msg border none
1107 --------------------------
1108
1109 Commands can be chained by using +;+ (a semicolon). So, to move a window to a
1110 specific workspace and immediately switch to that workspace, you can configure
1111 the following keybinding:
1112
1113 *Example*:
1114 --------------------------------------------------------
1115 bindsym mod+x move container to workspace 3; workspace 3
1116 --------------------------------------------------------
1117
1118 [[command_criteria]]
1119
1120 Furthermore, you can change the scope of a command, that is, which containers
1121 should be affected by that command, by using various criteria. These are
1122 prefixed in square brackets to every command. If you want to kill all windows
1123 which have the class Firefox, use:
1124
1125 *Example*:
1126 ------------------------------------
1127 bindsym mod+x [class="Firefox"] kill
1128
1129 # same thing, but case-insensitive
1130 bindsym mod+x [class="(?i)firefox"] kill
1131 ------------------------------------
1132
1133 The criteria which are currently implemented are:
1134
1135 class::
1136         Compares the window class (the second part of WM_CLASS)
1137 instance::
1138         Compares the window instance (the first part of WM_CLASS)
1139 window_role::
1140         Compares the window role (WM_WINDOW_ROLE).
1141 id::
1142         Compares the X11 window ID, which you can get via +xwininfo+ for example.
1143 title::
1144         Compares the X11 window title (_NET_WM_NAME or WM_NAME as fallback).
1145 urgent::
1146         Compares the urgent state of the window. Can be "latest" or "oldest".
1147         Matches the latest or oldest urgent window, respectively.
1148         (The following aliases are also available: newest, last, recent, first)
1149 con_mark::
1150         Compares the mark set for this container, see <<vim_like_marks>>.
1151 con_id::
1152         Compares the i3-internal container ID, which you can get via the IPC
1153         interface. Handy for scripting.
1154
1155 The criteria +class+, +instance+, +role+, +title+ and +mark+ are actually
1156 regular expressions (PCRE). See +pcresyntax(3)+ or +perldoc perlre+ for
1157 information on how to use them.
1158
1159 [[exec]]
1160
1161 === Executing applications (exec)
1162
1163 What good is a window manager if you can’t actually start any applications?
1164 The exec command starts an application by passing the command you specify to a
1165 shell. This implies that you can use globbing (wildcards) and programs will be
1166 searched in your $PATH.
1167
1168 *Syntax*:
1169 ------------------------------
1170 exec [--no-startup-id] command
1171 ------------------------------
1172
1173 *Example*:
1174 ------------------------------
1175 # Start the GIMP
1176 bindsym mod+g exec gimp
1177
1178 # Start the terminal emulator urxvt which is not yet startup-notification-aware
1179 bindsym mod+Return exec --no-startup-id urxvt
1180 ------------------------------
1181
1182 The +--no-startup-id+ parameter disables startup-notification support for this
1183 particular exec command. With startup-notification, i3 can make sure that a
1184 window appears on the workspace on which you used the exec command. Also, it
1185 will change the X11 cursor to +watch+ (a clock) while the application is
1186 launching. So, if an application is not startup-notification aware (most GTK
1187 and Qt using applications seem to be, though), you will end up with a watch
1188 cursor for 60 seconds.
1189
1190 === Splitting containers
1191
1192 The split command makes the current window a split container. Split containers
1193 can contain multiple windows. Every split container has an orientation, it is
1194 either split horizontally (a new window gets placed to the right of the current
1195 one) or vertically (a new window gets placed below the current one).
1196
1197 If you apply this command to a split container with the same orientation,
1198 nothing will happen. If you use a different orientation, the split container’s
1199 orientation will be changed (if it does not have more than one window).
1200
1201 *Syntax*:
1202 ---------------------------
1203 split <vertical|horizontal>
1204 ---------------------------
1205
1206 *Example*:
1207 ------------------------------
1208 bindsym mod+v split vertical
1209 bindsym mod+h split horizontal
1210 ------------------------------
1211
1212 === Manipulating layout
1213
1214 Use +layout default+, +layout stacking+ or +layout tabbed+ to change the
1215 current container layout to default, stacking or tabbed layout, respectively.
1216
1217 To make the current window (!) fullscreen, use +fullscreen+, to make
1218 it floating (or tiling again) use +floating enable+ respectively +floating disable+
1219 (or +floating toggle+):
1220
1221 *Examples*:
1222 --------------
1223 bindsym mod+s layout stacking
1224 bindsym mod+l layout default
1225 bindsym mod+w layout tabbed
1226
1227 # Toggle fullscreen
1228 bindsym mod+f fullscreen
1229
1230 # Toggle floating/tiling
1231 bindsym mod+t floating toggle
1232 --------------
1233
1234 === Focusing/Moving containers
1235
1236 To change the focus, use the focus command: +focus left+, +focus right+, +focus
1237 down+ and +focus up+.
1238
1239 There are a few special parameters you can use for the focus command:
1240
1241 parent::
1242         Sets focus to the +Parent Container+ of the current +Container+.
1243 child::
1244         The opposite of +focus parent+, sets the focus to the last focused
1245         child container.
1246 floating::
1247         Sets focus to the last focused floating container.
1248 tiling::
1249         Sets focus to the last focused tiling container.
1250 mode_toggle::
1251         Toggles between floating/tiling containers.
1252 output::
1253         Followed by a direction or an output name, this will focus the
1254         corresponding output.
1255
1256 For moving, use +move left+, +move right+, +move down+ and +move up+.
1257
1258 *Syntax*:
1259 -----------------------------------
1260 focus <left|right|down|up>
1261 focus <parent|child|floating|tiling|mode_toggle>
1262 focus output <<left|right|down|up>|output>
1263 move <left|right|down|up> [<px> px]
1264 move [absolute] position [[<px> px] [<px> px]|center]
1265 -----------------------------------
1266
1267 Note that the amount of pixels you can specify for the +move+ command is only
1268 relevant for floating containers. The default amount is 10 pixels.
1269
1270 *Examples*:
1271 ----------------------
1272 # Focus container on the left, bottom, top, right:
1273 bindsym mod+j focus left
1274 bindsym mod+k focus down
1275 bindsym mod+l focus up
1276 bindsym mod+semicolon focus right
1277
1278 # Focus parent container
1279 bindsym mod+u focus parent
1280
1281 # Focus last floating/tiling container
1282 bindsym mod+g focus mode_toggle
1283
1284 # Focus the output right to the current one
1285 bindsym mod+x focus output right
1286
1287 # Focus the big output
1288 bindsym mod+x focus output HDMI-2
1289
1290 # Move container to the left, bottom, top, right:
1291 bindsym mod+j move left
1292 bindsym mod+k move down
1293 bindsym mod+l move up
1294 bindsym mod+semicolon move right
1295
1296 # Move container, but make floating containers
1297 # move more than the default
1298 bindsym mod+j move left 20 px
1299
1300 # Move floating container to the center
1301 # of all outputs
1302 bindsym mod+c move absolute position center
1303 ----------------------
1304
1305 === Changing (named) workspaces/moving to workspaces
1306
1307 To change to a specific workspace, use the +workspace+ command, followed by the
1308 number or name of the workspace. To move containers to specific workspaces, use
1309 +move container to workspace+.
1310
1311 You can also switch to the next and previous workspace with the commands
1312 +workspace next+ and +workspace prev+, which is handy, for example, if you have
1313 workspace 1, 3, 4 and 9 and you want to cycle through them with a single key
1314 combination. To restrict those to the current output, use +workspace
1315 next_on_output+ and +workspace prev_on_output+. Similarly, you can use +move
1316 container to workspace next+ and +move container to workspace prev+ to move a
1317 container to the next/previous workspace.
1318
1319 [[back_and_forth]]
1320 To switch back to the previously focused workspace, use +workspace
1321 back_and_forth+.
1322
1323 To move a container to another xrandr output such as +LVDS1+ or +VGA1+, you can
1324 use the +move container to output+ command followed by the name of the target
1325 output. You may also use +left+, +right+, +up+, +down+ instead of the xrandr
1326 output name to move to the next output in the specified direction.
1327
1328 To move a whole workspace to another xrandr output such as +LVDS1+ or +VGA1+,
1329 you can use the +move workspace to output+ command followed by the name of the
1330 target output. You may also use +left+, +right+, +up+, +down+ instead of the
1331 xrandr output name to move to the next output in the specified direction.
1332
1333 *Examples*:
1334 -------------------------
1335 bindsym mod+1 workspace 1
1336 bindsym mod+2 workspace 2
1337 ...
1338
1339 bindsym mod+Shift+1 move container to workspace 1
1340 bindsym mod+Shift+2 move container to workspace 2
1341 ...
1342
1343 # switch between the current and the previously focused one
1344 bindsym mod+b workspace back_and_forth
1345
1346 # move the whole workspace to the next output
1347 bindsym mod+x move workspace to output right
1348 -------------------------
1349
1350 ==== Named workspaces
1351
1352 Workspaces are identified by their name. So, instead of using numbers in the
1353 workspace command, you can use an arbitrary name:
1354
1355 *Example*:
1356 -------------------------
1357 bindsym mod+1 workspace mail
1358 ...
1359 -------------------------
1360
1361 If you want the workspace to have a number *and* a name, just prefix the
1362 number, like this:
1363
1364 *Example*:
1365 -------------------------
1366 bindsym mod+1 workspace 1: mail
1367 bindsym mod+2 workspace 2: www
1368 ...
1369 -------------------------
1370
1371 Note that the workspace will really be named "1: mail". i3 treats workspace
1372 names beginning with a number in a slightly special way. Normally, named
1373 workspaces are ordered the way they appeared. When they start with a number, i3
1374 will order them numerically. Also, you will be able to use +workspace number 1+
1375 to switch to the workspace which begins with number 1, regardless of which name
1376 it has. This is useful in case you are changing the workspace’s name
1377 dynamically.
1378
1379 === Renaming workspaces
1380
1381 You can rename workspaces. This might be useful to start with the default
1382 numbered workspaces, do your work, and rename the workspaces afterwards to
1383 reflect what’s actually on them.
1384
1385 *Syntax*:
1386 ----------------------------------------------------
1387 rename workspace <old_name> to <new_name>
1388 ----------------------------------------------------
1389
1390 *Examples*:
1391 ------------------------------------------------
1392 i3-msg 'rename workspace 5 to 6'
1393 i3-msg 'rename workspace 1 to "1: www"'
1394 i3-msg 'rename workspace "1: www" to "10: www"'
1395 ------------------------------------------------
1396
1397 [[resizingconfig]]
1398
1399 === Resizing containers/windows
1400
1401 If you want to resize containers/windows using your keyboard, you can use the
1402 +resize+ command:
1403
1404 *Syntax*:
1405 ---------------------------------------------------------
1406 resize <grow|shrink> <direction> [<px> px] [or <ppt> ppt]
1407 ---------------------------------------------------------
1408
1409 Direction can either be one of +up+, +down+, +left+ or +right+. Or you can be
1410 less specific and use +width+ or +height+, in which case i3 will take/give
1411 space from all the other containers. The optional pixel argument specifies by
1412 how many pixels a *floating container* should be grown or shrunk (the default
1413 is 10 pixels). The ppt argument means percentage points and specifies by how
1414 many percentage points a *tiling container* should be grown or shrunk (the
1415 default is 10 percentage points).
1416
1417 I recommend using the resize command inside a so called +mode+:
1418
1419 .Example: Configuration file, defining a mode for resizing
1420 ----------------------------------------------------------------------
1421 mode "resize" {
1422         # These bindings trigger as soon as you enter the resize mode
1423
1424         # Pressing left will shrink the window’s width.
1425         # Pressing right will grow the window’s width.
1426         # Pressing up will shrink the window’s height.
1427         # Pressing down will grow the window’s height.
1428         bindsym j           resize shrink width 10 px or 10 ppt
1429         bindsym k           resize grow height 10 px or 10 ppt
1430         bindsym l           resize shrink height 10 px or 10 ppt
1431         bindsym semicolon   resize grow width 10 px or 10 ppt
1432
1433         # same bindings, but for the arrow keys
1434         bindsym Left        resize shrink width 10 px or 10 ppt
1435         bindsym Down        resize grow height 10 px or 10 ppt
1436         bindsym Up          resize shrink height 10 px or 10 ppt
1437         bindsym Right       resize grow width 10 px or 10 ppt
1438
1439         # back to normal: Enter or Escape
1440         bindsym Return mode "default"
1441         bindsym Escape mode "default"
1442 }
1443
1444 # Enter resize mode
1445 bindsym mod+r mode "resize"
1446 ----------------------------------------------------------------------
1447
1448 === Jumping to specific windows
1449
1450 Often when in a multi-monitor environment, you want to quickly jump to a
1451 specific window. For example, while working on workspace 3 you may want to
1452 jump to your mail client to email your boss that you’ve achieved some
1453 important goal. Instead of figuring out how to navigate to your mailclient,
1454 it would be more convenient to have a shortcut. You can use the +focus+ command
1455 with criteria for that.
1456
1457 *Syntax*:
1458 ----------------------------------------------------
1459 [class="class"] focus
1460 [title="title"] focus
1461 ----------------------------------------------------
1462
1463 *Examples*:
1464 ------------------------------------------------
1465 # Get me to the next open VIM instance
1466 bindsym mod+a [class="urxvt" title="VIM"] focus
1467 ------------------------------------------------
1468
1469 === VIM-like marks (mark/goto)
1470
1471 [[vim_like_marks]]
1472
1473 This feature is like the jump feature: It allows you to directly jump to a
1474 specific window (this means switching to the appropriate workspace and setting
1475 focus to the windows). However, you can directly mark a specific window with
1476 an arbitrary label and use it afterwards.  You do not need to ensure that your
1477 windows have unique classes or titles, and you do not need to change your
1478 configuration file.
1479
1480 As the command needs to include the label with which you want to mark the
1481 window, you cannot simply bind it to a key.  +i3-input+ is a tool created
1482 for this purpose: It lets you input a command and sends the command to i3. It
1483 can also prefix this command and display a custom prompt for the input dialog.
1484
1485 *Syntax*:
1486 ------------------------------
1487 mark identifier
1488 [con_mark="identifier"] focus
1489 ------------------------------
1490
1491 *Example (in a terminal)*:
1492 ------------------------------
1493 $ i3-msg mark irssi
1494 $ i3-msg '[con_mark="irssi"] focus'
1495 ------------------------------
1496
1497 ///////////////////////////////////////////////////////////////////
1498 TODO: make i3-input replace %s
1499 *Examples*:
1500 ---------------------------------------
1501 # Read 1 character and mark the current window with this character
1502 bindsym mod+m exec i3-input -p 'mark ' -l 1 -P 'Mark: '
1503
1504 # Read 1 character and go to the window with the character
1505 bindsym mod+g exec i3-input -p 'goto ' -l 1 -P 'Goto: '
1506 ---------------------------------------
1507
1508 Alternatively, if you do not want to mess with +i3-input+, you could create
1509 seperate bindings for a specific set of labels and then only use those labels.
1510 ///////////////////////////////////////////////////////////////////
1511
1512 === Changing border style
1513
1514 To change the border of the current client, you can use +border normal+ to use the normal
1515 border (including window title), +border 1pixel+ to use a 1-pixel border (no window title)
1516 and +border none+ to make the client borderless.
1517
1518 There is also +border toggle+ which will toggle the different border styles.
1519
1520 *Examples*:
1521 ----------------------------
1522 bindsym mod+t border normal
1523 bindsym mod+y border 1pixel
1524 bindsym mod+u border none
1525 ----------------------------
1526
1527 [[stack-limit]]
1528
1529 ///////////////////////////////////////////////////////////////////////////////
1530 TODO: not yet implemented
1531 === Changing the stack-limit of a container
1532
1533 If you have a single container with a lot of windows inside it (say, more than
1534 10), the default layout of a stacking container can get a little unhandy.
1535 Depending on your screen’s size, you might end up with only half of the title
1536 lines being actually used, wasting a lot of screen space.
1537
1538 Using the +stack-limit+ command, you can limit the number of rows or columns
1539 in a stacking container. i3 will create columns or rows (depending on what
1540 you limited) automatically as needed.
1541
1542 *Syntax*:
1543 --------------------------------
1544 stack-limit <cols|rows> <value>
1545 --------------------------------
1546
1547 *Examples*:
1548 -------------------
1549 # I always want to have two window titles in one line
1550 stack-limit cols 2
1551
1552 # Not more than 5 rows in this stacking container
1553 stack-limit rows 5
1554 -------------------
1555
1556 image:stacklimit.png[Container limited to two columns]
1557 ///////////////////////////////////////////////////////////////////////////////
1558
1559 === Reloading/Restarting/Exiting
1560
1561 You can make i3 reload its configuration file with +reload+. You can also
1562 restart i3 inplace with the +restart+ command to get it out of some weird state
1563 (if that should ever happen) or to perform an upgrade without having to restart
1564 your X session. To exit i3 properly, you can use the +exit+ command,
1565 however you don’t need to (simply killing your X session is fine as well).
1566
1567 *Examples*:
1568 ----------------------------
1569 bindsym mod+Shift+r restart
1570 bindsym mod+Shift+w reload
1571 bindsym mod+Shift+e exit
1572 ----------------------------
1573
1574 === Scratchpad
1575
1576 There are two commands to use any existing window as scratchpad window. +move
1577 scratchpad+ will move a window to the scratchpad workspace. This will make it
1578 invisible until you show it again. There is no way to open that workspace.
1579 Instead, when using +scratchpad show+, the window will be shown again, as a
1580 floating window, centered on your current workspace (using +scratchpad show+ on
1581 a visible scratchpad window will make it hidden again, so you can have a
1582 keybinding to toggle).
1583
1584 As the name indicates, this is useful for having a window with your favorite
1585 editor always at hand. However, you can also use this for other permanently
1586 running applications which you don’t want to see all the time: Your music
1587 player, alsamixer, maybe even your mail client…?
1588
1589 *Syntax*:
1590 ---------------
1591 move scratchpad
1592
1593 scratchpad show
1594 ---------------
1595
1596 *Examples*:
1597 ------------------------------------------------
1598 # Make the currently focused window a scratchpad
1599 bindsym mod+Shift+minus move scratchpad
1600
1601 # Show the first scratchpad window
1602 bindsym mod+minus scratchpad show
1603
1604 # Show the sup-mail scratchpad window, if any.
1605 bindsym mod4+s [title="^Sup ::"] scratchpad show
1606 ------------------------------------------------
1607
1608 [[multi_monitor]]
1609
1610 == Multiple monitors
1611
1612 As you can see in the goal list on the website, i3 was specifically developed
1613 with support for multiple monitors in mind. This section will explain how to
1614 handle multiple monitors.
1615
1616 When you have only one monitor, things are simple. You usually start with
1617 workspace 1 on your monitor and open new ones as you need them.
1618
1619 When you have more than one monitor, each monitor will get an initial
1620 workspace.  The first monitor gets 1, the second gets 2 and a possible third
1621 would get 3. When you switch to a workspace on a different monitor, i3 will
1622 switch to that monitor and then switch to the workspace. This way, you don’t
1623 need shortcuts to switch to a specific monitor, and you don’t need to remember
1624 where you put which workspace. New workspaces will be opened on the currently
1625 active monitor.  It is not possible to have a monitor without a workspace.
1626
1627 The idea of making workspaces global is based on the observation that most
1628 users have a very limited set of workspaces on their additional monitors.
1629 They are often used for a specific task (browser, shell) or for monitoring
1630 several things (mail, IRC, syslog, …). Thus, using one workspace on one monitor
1631 and "the rest" on the other monitors often makes sense. However, as you can
1632 create an unlimited number of workspaces in i3 and tie them to specific
1633 screens, you can have the "traditional" approach of having X workspaces per
1634 screen by changing your configuration (using modes, for example).
1635
1636 === Configuring your monitors
1637
1638 To help you get going if you have never used multiple monitors before, here is
1639 a short overview of the xrandr options which will probably be of interest to
1640 you. It is always useful to get an overview of the current screen configuration.
1641 Just run "xrandr" and you will get an output like the following:
1642 -------------------------------------------------------------------------------
1643 $ xrandr
1644 Screen 0: minimum 320 x 200, current 1280 x 800, maximum 8192 x 8192
1645 VGA1 disconnected (normal left inverted right x axis y axis)
1646 LVDS1 connected 1280x800+0+0 (normal left inverted right x axis y axis) 261mm x 163mm
1647    1280x800       60.0*+   50.0
1648    1024x768       85.0     75.0     70.1     60.0
1649    832x624        74.6
1650    800x600        85.1     72.2     75.0     60.3     56.2
1651    640x480        85.0     72.8     75.0     59.9
1652    720x400        85.0
1653    640x400        85.1
1654    640x350        85.1
1655 --------------------------------------------------------------------------------------
1656
1657 Several things are important here: You can see that +LVDS1+ is connected (of
1658 course, it is the internal flat panel) but +VGA1+ is not. If you have a monitor
1659 connected to one of the ports but xrandr still says "disconnected", you should
1660 check your cable, monitor or graphics driver.
1661
1662 The maximum resolution you can see at the end of the first line is the maximum
1663 combined resolution of your monitors. By default, it is usually too low and has
1664 to be increased by editing +/etc/X11/xorg.conf+.
1665
1666 So, say you connected VGA1 and want to use it as an additional screen:
1667 -------------------------------------------
1668 xrandr --output VGA1 --auto --left-of LVDS1
1669 -------------------------------------------
1670 This command makes xrandr try to find the native resolution of the device
1671 connected to +VGA1+ and configures it to the left of your internal flat panel.
1672 When running "xrandr" again, the output looks like this:
1673 -------------------------------------------------------------------------------
1674 $ xrandr
1675 Screen 0: minimum 320 x 200, current 2560 x 1024, maximum 8192 x 8192
1676 VGA1 connected 1280x1024+0+0 (normal left inverted right x axis y axis) 338mm x 270mm
1677    1280x1024      60.0*+   75.0
1678    1280x960       60.0
1679    1152x864       75.0
1680    1024x768       75.1     70.1     60.0
1681    832x624        74.6
1682    800x600        72.2     75.0     60.3     56.2
1683    640x480        72.8     75.0     66.7     60.0
1684    720x400        70.1
1685 LVDS1 connected 1280x800+1280+0 (normal left inverted right x axis y axis) 261mm x 163mm
1686    1280x800       60.0*+   50.0
1687    1024x768       85.0     75.0     70.1     60.0
1688    832x624        74.6
1689    800x600        85.1     72.2     75.0     60.3     56.2
1690    640x480        85.0     72.8     75.0     59.9
1691    720x400        85.0
1692    640x400        85.1
1693    640x350        85.1
1694 -------------------------------------------------------------------------------
1695 Please note that i3 uses exactly the same API as xrandr does, so it will see
1696 only what you can see in xrandr.
1697
1698 See also <<presentations>> for more examples of multi-monitor setups.
1699
1700 === Interesting configuration for multi-monitor environments
1701
1702 There are several things to configure in i3 which may be interesting if you
1703 have more than one monitor:
1704
1705 1. You can specify which workspace should be put on which screen. This
1706    allows you to have a different set of workspaces when starting than just
1707    1 for the first monitor, 2 for the second and so on. See
1708    <<workspace_screen>>.
1709 2. If you want some applications to generally open on the bigger screen
1710    (MPlayer, Firefox, …), you can assign them to a specific workspace, see
1711    <<assign_workspace>>.
1712 3. If you have many workspaces on many monitors, it might get hard to keep
1713    track of which window you put where. Thus, you can use vim-like marks to
1714    quickly switch between windows. See <<vim_like_marks>>.
1715
1716 == i3 and the rest of your software world
1717
1718 === Displaying a status line
1719
1720 A very common thing amongst users of exotic window managers is a status line at
1721 some corner of the screen. It is an often superior replacement to the widget
1722 approach you have in the task bar of a traditional desktop environment.
1723
1724 If you don’t already have your favorite way of generating such a status line
1725 (self-written scripts, conky, …), then i3status is the recommended tool for
1726 this task. It was written in C with the goal of using as few syscalls as
1727 possible to reduce the time your CPU is woken up from sleep states. Because
1728 i3status only spits out text, you need to combine it with some other tool, like
1729 i3bar. See <<status_command>> for how to display i3status in i3bar.
1730
1731 Regardless of which application you use to display the status line, you
1732 want to make sure that it registers as a dock window using EWMH hints. i3 will
1733 position the window either at the top or at the bottom of the screen, depending
1734 on which hint the application sets. With i3bar, you can configure its position,
1735 see <<i3bar_position>>.
1736
1737 === Giving presentations (multi-monitor)
1738
1739 When giving a presentation, you typically want the audience to see what you see
1740 on your screen and then go through a series of slides (if the presentation is
1741 simple). For more complex presentations, you might want to have some notes
1742 which only you can see on your screen, while the audience can only see the
1743 slides.
1744
1745 [[presentations]]
1746 ==== Case 1: everybody gets the same output
1747 This is the simple case. You connect your computer to the video projector,
1748 turn on both (computer and video projector) and configure your X server to
1749 clone the internal flat panel of your computer to the video output:
1750 -----------------------------------------------------
1751 xrandr --output VGA1 --mode 1024x768 --same-as LVDS1
1752 -----------------------------------------------------
1753 i3 will then use the lowest common subset of screen resolutions, the rest of
1754 your screen will be left untouched (it will show the X background). So, in
1755 our example, this would be 1024x768 (my notebook has 1280x800).
1756
1757 ==== Case 2: you can see more than your audience
1758 This case is a bit harder. First of all, you should configure the VGA output
1759 somewhere near your internal flat panel, say right of it:
1760 -----------------------------------------------------
1761 xrandr --output VGA1 --mode 1024x768 --right-of LVDS1
1762 -----------------------------------------------------
1763 Now, i3 will put a new workspace (depending on your settings) on the new screen
1764 and you are in multi-monitor mode (see <<multi_monitor>>).
1765
1766 Because i3 is not a compositing window manager, there is no ability to
1767 display a window on two screens at the same time. Instead, your presentation
1768 software needs to do this job (that is, open a window on each screen).