i3 User’s Guide =============== Michael Stapelberg This document contains all the information you need to configure and use the i3 window manager. If it does not, please check https://www.reddit.com/r/i3wm/ first, then contact us on IRC (preferred) or post your question(s) on the mailing list. == Default keybindings For the "too long; didn’t read" people, here is an overview of the default keybindings (click to see the full-size image): *Keys to use with $mod (Alt):* image:keyboard-layer1.png["Keys to use with $mod (Alt)",width=600,link="keyboard-layer1.png"] *Keys to use with Shift+$mod:* image:keyboard-layer2.png["Keys to use with Shift+$mod",width=600,link="keyboard-layer2.png"] The red keys are the modifiers you need to press (by default), the blue keys are your homerow. Note that when starting i3 without a config file, i3-config-wizard will offer you to create a config file in which the key positions (!) match what you see in the image above, regardless of the keyboard layout you are using. If you prefer to use a config file where the key letters match what you are seeing above, just decline i3-config-wizard’s offer and base your config on +/etc/i3/config+. == Using i3 Throughout this guide, the keyword +$mod+ will be used to refer to the configured modifier. This is the Alt key (+Mod1+) by default, with the Windows key (+Mod4+) being a popular alternative that largely prevents conflicts with application-defined shortcuts. === Opening terminals and moving around One very basic operation is opening a new terminal. By default, the keybinding for this is +$mod+Enter+, that is Alt+Enter (+Mod1+Enter+) in the default configuration. By pressing +$mod+Enter+, a new terminal will be opened. It will fill the whole space available on your screen. image:single_terminal.png[Single terminal] If you now open another terminal, i3 will place it next to the current one, splitting the screen size in half. Depending on your monitor, i3 will put the created window beside the existing window (on wide displays) or below the existing window (rotated displays). image:two_terminals.png[Two terminals] To move the focus between the two terminals, you can use the direction keys which you may know from the editor +vi+. However, in i3, your homerow is used for these keys (in +vi+, the keys are shifted to the left by one for compatibility with most keyboard layouts). Therefore, +$mod+j+ is left, +$mod+k+ is down, +$mod+l+ is up and `$mod+;` is right. So, to switch between the terminals, use +$mod+k+ or +$mod+l+. Of course, you can also use the arrow keys. At the moment, your workspace is split (it contains two terminals) in a specific direction (horizontal by default). Every window can be split horizontally or vertically again, just like the workspace. The terminology is "window" for a container that actually contains an X11 window (like a terminal or browser) and "split container" for containers that consist of one or more windows. TODO: picture of the tree To split a window vertically, press +$mod+v+ before you create the new window. To split it horizontally, press +$mod+h+. === Changing the container layout A split container can have one of the following layouts: splith/splitv:: Windows are sized so that every window gets an equal amount of space in the container. splith distributes the windows horizontally (windows are right next to each other), splitv distributes them vertically (windows are on top of each other). stacking:: Only the focused window in the container is displayed. You get a list of windows at the top of the container. tabbed:: The same principle as +stacking+, but the list of windows at the top is only a single line which is vertically split. To switch modes, press +$mod+e+ for splith/splitv (it toggles), +$mod+s+ for stacking and +$mod+w+ for tabbed. image:modes.png[Container modes] === Toggling fullscreen mode for a window To display a window in fullscreen mode or to go out of fullscreen mode again, press +$mod+f+. There is also a global fullscreen mode in i3 in which the client will span all available outputs (the command is +fullscreen toggle global+). === Opening other applications Aside from opening applications from a terminal, you can also use the handy +dmenu+ which is opened by pressing +$mod+d+ by default. Just type the name (or a part of it) of the application which you want to open. The corresponding application has to be in your +$PATH+ for this to work. Additionally, if you have applications you open very frequently, you can create a keybinding for starting the application directly. See the section <> for details. === Closing windows If an application does not provide a mechanism for closing (most applications provide a menu, the escape key or a shortcut like +Control+w+ to close), you can press +$mod+Shift+q+ to kill a window. For applications which support the WM_DELETE protocol, this will correctly close the application (saving any modifications or doing other cleanup). If the application doesn’t support the WM_DELETE protocol your X server will kill the window and the behaviour depends on the application. === Using workspaces Workspaces are an easy way to group a set of windows. By default, you are on the first workspace, as the bar on the bottom left indicates. To switch to another workspace, press +$mod+num+ where +num+ is the number of the workspace you want to use. If the workspace does not exist yet, it will be created. A common paradigm is to put the web browser on one workspace, communication applications (+mutt+, +irssi+, ...) on another one, and the ones with which you work, on the third one. Of course, there is no need to follow this approach. If you have multiple screens, a workspace will be created on each screen at startup. If you open a new workspace, it will be bound to the screen you created it on. When you switch to a workspace on another screen, i3 will set focus to that screen. === Moving windows to workspaces To move a window to another workspace, simply press +$mod+Shift+num+ where +num+ is (like when switching workspaces) the number of the target workspace. Similarly to switching workspaces, the target workspace will be created if it does not yet exist. === Resizing The easiest way to resize a container is by using the mouse: Grab the border and move it to the wanted size. You can also use <> to define a mode for resizing via the keyboard. To see an example for this, look at the https://github.com/i3/i3/blob/next/etc/config.keycodes[default config] provided by i3. === Restarting i3 inplace To restart i3 in place (and thus get into a clean state if there is a bug, or to upgrade to a newer version of i3) you can use +$mod+Shift+r+. === Exiting i3 To cleanly exit i3 without killing your X server, you can use +$mod+Shift+e+. By default, a dialog will ask you to confirm if you really want to quit. === Floating Floating mode is the opposite of tiling mode. The position and size of a window are not managed automatically by i3, but manually by you. Using this mode violates the tiling paradigm but can be useful for some corner cases like "Save as" dialog windows, or toolbar windows (GIMP or similar). Those windows usually set the appropriate hint and are opened in floating mode by default. You can toggle floating mode for a window by pressing +$mod+Shift+Space+. By dragging the window’s titlebar with your mouse you can move the window around. By grabbing the borders and moving them you can resize the window. You can also do that by using the <>. Another way to resize floating windows using the mouse is to right-click on the titlebar and drag. For resizing floating windows with your keyboard, see the resizing binding mode provided by the i3 https://github.com/i3/i3/blob/next/etc/config.keycodes[default config]. Floating windows are always on top of tiling windows. == Tree i3 stores all information about the X11 outputs, workspaces and layout of the windows on them in a tree. The root node is the X11 root window, followed by the X11 outputs, then dock areas and a content container, then workspaces and finally the windows themselves. In previous versions of i3 we had multiple lists (of outputs, workspaces) and a table for each workspace. That approach turned out to be complicated to use (snapping), understand and implement. === The tree consists of Containers The building blocks of our tree are so-called +Containers+. A +Container+ can host a window (meaning an X11 window, one that you can actually see and use, like a browser). Alternatively, it could contain one or more +Containers+. A simple example is the workspace: When you start i3 with a single monitor, a single workspace and you open two terminal windows, you will end up with a tree like this: image::tree-layout2.png["layout2",float="right"] image::tree-shot4.png["shot4",title="Two terminals on standard workspace"] [[OrientationSplit]] === Orientation and Split Containers It is only natural to use so-called +Split Containers+ in order to build a layout when using a tree as data structure. In i3, every +Container+ has an orientation (horizontal, vertical or unspecified) and the orientation depends on the layout the container is in (vertical for splitv and stacking, horizontal for splith and tabbed). So, in our example with the workspace, the default layout of the workspace +Container+ is splith (most monitors are widescreen nowadays). If you change the layout to splitv (+$mod+v+ in the default config) and *then* open two terminals, i3 will configure your windows like this: image::tree-shot2.png["shot2",title="Vertical Workspace Orientation"] An interesting new feature of i3 since version 4 is the ability to split anything: Let’s assume you have two terminals on a workspace (with splith layout, that is horizontal orientation), focus is on the right terminal. Now you want to open another terminal window below the current one. If you would just open a new terminal window, it would show up to the right due to the splith layout. Instead, press +$mod+v+ to split the container with the splitv layout (to open a +Horizontal Split Container+, use +$mod+h+). Now you can open a new terminal and it will open below the current one: image::tree-layout1.png["Layout",float="right"] image::tree-shot1.png["shot",title="Vertical Split Container"] unfloat::[] You probably guessed it already: There is no limit on how deep your hierarchy of splits can be. === Focus parent Let’s stay with our example from above. We have a terminal on the left and two vertically split terminals on the right, focus is on the bottom right one. When you open a new terminal, it will open below the current one. So, how can you open a new terminal window to the *right* of the current one? The solution is to use +focus parent+, which will focus the +Parent Container+ of the current +Container+. In this case, you would focus the +Vertical Split Container+ which is *inside* the horizontally oriented workspace. Thus, now new windows will be opened to the right of the +Vertical Split Container+: image::tree-shot3.png["shot3",title="Focus parent, then open new terminal"] === Implicit containers In some cases, i3 needs to implicitly create a container to fulfill your command. One example is the following scenario: You start i3 with a single monitor and a single workspace on which you open three terminal windows. All these terminal windows are directly attached to one node inside i3’s layout tree, the workspace node. By default, the workspace node’s orientation is +horizontal+. Now you move one of these terminals down (+$mod+Shift+k+ by default). The workspace node’s orientation will be changed to +vertical+. The terminal window you moved down is directly attached to the workspace and appears on the bottom of the screen. A new (horizontal) container was created to accommodate the other two terminal windows. You will notice this when switching to tabbed mode (for example). You would end up having one tab with a representation of the split container (e.g., "H[urxvt firefox]") and the other one being the terminal window you moved down. [[configuring]] == Configuring i3 This is where the real fun begins ;-). Most things are very dependent on your ideal working environment so we can’t make reasonable defaults for them. While not using a programming language for the configuration, i3 stays quite flexible in regards to the things you usually want your window manager to do. For example, you can configure bindings to jump to specific windows, you can set specific applications to start on specific workspaces, you can automatically start applications, you can change the colors of i3, and you can bind your keys to do useful things. To change the configuration of i3, copy +/etc/i3/config+ to +\~/.i3/config+ (or +~/.config/i3/config+ if you like the XDG directory scheme) and edit it with a text editor. On first start (and on all following starts, unless you have a configuration file), i3 will offer you to create a configuration file. You can tell the wizard to use either Alt (+Mod1+) or Windows (+Mod4+) as modifier in the config file. Also, the created config file will use the key symbols of your current keyboard layout. To start the wizard, use the command +i3-config-wizard+. Please note that you must not have +~/.i3/config+, otherwise the wizard will exit. Since i3 4.0, a new configuration format is used. i3 will try to automatically detect the format version of a config file based on a few different keywords, but if you want to make sure that your config is read with the new format, include the following line in your config file: --------------------- # i3 config file (v4) --------------------- === Comments It is possible and recommended to use comments in your configuration file to properly document your setup for later reference. Comments are started with a # and can only be used at the beginning of a line: *Examples*: ------------------- # This is a comment ------------------- [[fonts]] === Fonts i3 has support for both X core fonts and FreeType fonts (through Pango) to render window titles. To generate an X core font description, you can use +xfontsel(1)+. To see special characters (Unicode), you need to use a font which supports the ISO-10646 encoding. A FreeType font description is composed by a font family, a style, a weight, a variant, a stretch and a size. FreeType fonts support right-to-left rendering and contain often more Unicode glyphs than X core fonts. If i3 cannot open the configured font, it will output an error in the logfile and fall back to a working font. *Syntax*: ------------------------------ font font pango: [