好用的 Tiling wm——i3wm

** 简介 **

i3 是一款平铺式(tilling)窗口管理器,目标平台为 GNU/Linux 和 BSD 操作系统。i3 是自由开源软件(FOSS),遵循 BSD 协议。其主要目标人群为高级用户和开发者。

i3配置其实挺简单的,直接用默认的也可以,但是默认的移动是jkl;,不是hjkl。
我的i3搭配了i3ststus、dmenu、feh,大家可以参考下,话说加个tint2什么的也不错
下面给两张图片吧:




** 安装 **

可以直接用zypper安装,源里有,但是只有i3,像i3status之类的木有,还有dmenu也要再单独装。
想要编译安装的,源码到这里下 __http://i3wm.org/

** 简单的使用 **

i3 默认修饰键是 Alt。第一次启动时,i3 会创建一个配置文件。创建过程中,可以告诉配置向导在配置文件中使用 Alt(Mod1) 还是 Winkey(Mod4)作为修饰键。同时还会配置键盘布局。

** 配置文件 **

如果您要重新配置 i3,可将原配置文件删除,再启动该配置向导,命令为 i3-config-wizard,重新配置完成后可以使用$mod+Shift+C重新载入配置文件。提示:如果已有 ~/.i3/config 配置文件,向导会退出。
i3 配置文件采用纯文本格式,使用文本编辑器打开即可对 i3 进行配置,不需使用某个特定的编程语言。
配置文件位置:

~/.i3/config (or ~/.config/i3/config)

i3启动的时候会按以下顺序寻找配置文件:

  1. ~/.config/i3/config (or $XDG_CONFIG_HOME/i3/config if set)

  2. /etc/xdg/i3/config (or $XDG_CONFIG_DIRS/i3/config if set)

  3. ~/.i3/config

  4. /etc/i3/config

你也可以使用 -c选项指定配置文件。

** 中文支持 **

感谢erhandsome告知,i3可以使用xft,配置格式如下

font xft:Wen Quan Yi Zen Hei Mono 10

以下加有下划线的部分仅在尝试xft不成功时当做替补方案:

由于 i3 使用 xcb,而 Cairo 还没有在上游上支持 xcb 的缘故,i3 现在还是只能使用 X core fonts,而不支持 xft。因此窗口标题无法显示中文,想要使用中文需要把自己的字体目录加到xorg.conf文件里,现在多数发行版都已经用xorg.conf.d目录取代了xorg.conf。其实就是把xorg.conf拆成了一个个的小文件,配置方法跟以前还是一样的。
在xorg.conf中添加以下内容__

Section "Files"

FontPath "/usr/share/fonts/truetype/wqy"

EndSection

将FontPath后路径更换为自己的相应路径就可以了。
然后在i3的配置文件中更改字体设置,例如:

font -wenquanyi-wenquanyi bitmap song-bold-r-normal–-120-75-75-p--iso10646-1

使用$mod+Shift+C重新载入配置文件就可以正常显示中文了。

** 终端 **

打开终端:$mod+Enter
root权限打开终端:$mod+Shitf+Enter

继续按下这一组合键,就打开另一个终端窗口。

bindsym $mod+Return exec i3-sensible-terminal
bindsym $mod+Shift+Return exec kdesu i3-sensible-terminal

** 跟随启动 **
在配置文件中可以设置跟随i3一起启动的程序,例如:

exec feh --bg-scale /home/owen/3.jpg

** 窗口 **

在 i3 中,窗口布局分为:
默认(defualt):每个窗口都分配有一定量的空间。
叠加(stacking):只显示焦点窗口。其他窗口会在顶部以列表形式显示。
标签式(tabbed):与叠加原则一样,但顶部的窗口列表在垂直高度上只是单行显示。

$mod+e 默认, $mod+s 叠加式, $mod+w 显示标签式。

bindsym $mod+s layout stacking
bindsym $mod+w layout tabbed
bindsym $mod+e layout default

切换活动窗口全屏显示,可使用 $mod+f。

bindsym $mod+f fullscreen

** 浮动与平铺 **

i3支持将窗口切换为浮动模式,使用$mod+Shift+space进行切换,使用$mod+space在平铺窗口与浮动窗口之间切换。

bindsym $mod+Shift+space floating toggle
bindsym $mod+space focus mode_toggle

** 窗口分割方向 **

新建窗口时切割父窗口的方向,使用$mod+v或$mod+Shift+V.

bindsym $mod+Shift+V split h
bindsym $mod+v split v

** 调整窗口大小 **

按下$mod+r,然后使用hjkl或方向键进行调整,使用Shift+hjkl或方向键进行反向调整,调整结束按下回车键离开调整模式。

mode "resize" { 

bindsym h resize shrink left 10 px or 10 ppt
bindsym Shift+H resize grow left 10 px or 10 ppt
bindsym j resize shrink down 10 px or 10 ppt
bindsym Shift+J resize grow down 10 px or 10 ppt
bindsym k resize shrink up 10 px or 10 ppt
bindsym Shift+K resize grow up 10 px or 10 ppt
bindsym l resize shrink right 10 px or 10 ppt
bindsym Shift+L resize grow right 10 px or 10 ppt

bindsym Left resize shrink left 10 px or 10 ppt
bindsym Shift+Left resize grow left 10 px or 10 ppt
bindsym Down resize shrink down 10 px or 10 ppt
bindsym Shift+Down resize grow down 10 px or 10 ppt
bindsym Up resize shrink up 10 px or 10 ppt
bindsym Shift+Up resize grow up 10 px or 10 ppt
bindsym Right resize shrink right 10 px or 10 ppt 
bindsym Shift+Right resize grow right 10 px or 10 ppt

bindsym Return mode "default"
bindsym Escape mode "default"

}

bindsym $mod+r mode "resize"

** 调整窗口边框 **

无边框:$mod+u
普通模式:$mod+t
单像素边框:$mod+y

bindsym $mod+t border normal
bindsym $mod+y border 1pixel
bindsym $mod+u border none

新窗口边框类型

new_window 1pixel

** 特殊窗口 **

使用for_window command可以定义新建窗口时的窗体风格、浮动/平铺等特性。 语法:

for_window <criteria> command

例子:

# enable floating mode for all XTerm windows
for_window [class="XTerm"] floating enable

# Make all urxvts use a 1-pixel border:
for_window [class="urxvt"] border 1pixel

# A less useful, but rather funny example:
# makes the window floating as soon as I change
# directory to ~/work
for_window [title="x200: ~/work"] floating enable

** 启动应用程序 **

除了在终端使用命令打开应用程序、绑定快捷键之外,可以按下 $mod+d 启动 dmenu,输入您要打开应用程序的名称即可。应用程序命令路径也必须在您的 $PATH 之内才能查找到相应命令。

bindsym $mod+d exec dmenu_run

有些程序需要超级管理员的权限,但是通过上边的方法启动程序不会出现权限请求的界面,所以:

bindsym $mod+Shift+D exec kdesu dmenu_run

这样在出现dmenu的时候就会权限请求,提示用户输入密码了。

** 关闭程序窗口 **

不提供相关退出机制的应用程序(应用程序大多数应用支持如 ESC 或 Ctrl+W),可使用$mod+Shift+Q 关闭窗口。

bindsym $mod+Shift+Q kill

** 重新加载 **

如果 i3 升级到了一个新版本,不必注销,可以按下 $mod+Shift+R 就可以重新加载 i3。

bindsym $mod+Shift+R restart

当更新了 i3 配置文件,可以按下$mod+Shift+C重新加载i3的配置文件。

bindsym $mod+Shift+C reload

当然,如果要退出 i3 会话(非杀死 X 服务器),可以使用 $mod+Shift+E 组合键。

bindsym $mod+Shift+E exit

提示 :查看 ~/.i3/config 配置文件,就可以得到一个当前 i3 操作大全。

** 工作区 **

在 i3 下可以建立 10 个之多工作区(0~9)。只要按下 $mod+num 就切换到相应数字的工作区,如果存在该工作区则显示该工作区,如无,则新建工作区。

bindsym $mod+1 workspace 1
bindsym $mod+2 workspace 2
bindsym $mod+3 workspace 3
bindsym $mod+4 workspace 4
bindsym $mod+5 workspace 5
bindsym $mod+6 workspace 6
bindsym $mod+7 workspace 7
bindsym $mod+8 workspace 8
bindsym $mod+9 workspace 9
bindsym $mod+0 workspace 10

除$mod+num外,还可以使用快捷键依次切换工作区,可以在config中加入以下内容后使用$mod+Tab/$mod+Shift+Tab进行切换。

bindsym $mod+Tab workspace next

bindsym $mod+Shift+Tab workspace prev

如果要想将当前工作区的活动窗口移到其他工作区内,可按下 $mod+Shift+num。

bindsym $mod+Shift+exclam move workspace 1
bindsym $mod+Shift+at move workspace 2
bindsym $mod+Shift+numbersign move workspace 3
bindsym $mod+Shift+dollar move workspace 4
bindsym $mod+Shift+percent move workspace 5
bindsym $mod+Shift+asciicircum move workspace 6
bindsym $mod+Shift+ampersand move workspace 7
bindsym $mod+Shift+asterisk move workspace 8
bindsym $mod+Shift+parenleft move workspace 9
bindsym $mod+Shift+parenright move workspace 10

就先写这么多吧,想起什么再来补充。

感谢erhandsome,现补充一点:

自动把打开的程序放到指定工作区
例如:

assign [class="(?i)firefox"] → 1
assign [class="(?i)pidgin"] → 3
assign [class="(?i)transmission-gtk"] → 10

i3bar
关于i3bar,简单的说一下吧

官网是这么介绍的:
It is a modular approach.
It follows the UNIX philosophy of “Make each program do one thing well”.
It leads to two separate, clean codebases.
大体就是模块化,不喜欢可以删掉什么的,符合Unix每个程序做好一件事的理念。

i3bar配置 是类似这样的:

bar {
        status_command i3status
        mode hide
        position top
        workspace_buttons yes
    }

如果你的i3bar不在$PATH里,用下面的语句指定:

i3bar_command command

i3bar可以运行一个程序,可以输出当前的IP地址,电池状态等信息。

status_command command

Example:
status_command i3status --config ~/.i3status.conf

至于i3status,这个配置很简单,直接贴下配置,基本上看一眼就明白

general {
       
        colors = true
        interval = 5
}

order += "disk /"
order += "run_watch DHCP"
order += "wireless wlan0"
order += "ethernet eth0"
order += "battery 0"
order += "cpu_temperature 0"
order += "load"
order += "time"

wireless wlan0 {
        format_up = "W: (%quality at %essid, %bitrate) %ip"
        format_down = "W: down"
}

ethernet eth0 {
        # if you use %speed, i3status requires the cap_net_admin capability
        format_up = "↑↓: %ip (%speed)"
        format_down = "≠: down"
}

battery 0 {
        format = "%status %percentage %remaining %emptytime"
        path = "/sys/class/power_supply/BAT%d/uevent"
        low_threshold = 10
}

run_watch DHCP {
        pidfile = "/var/run/dhclient*.pid"
}


time {
        format = "%Y-%m-%d %H:%M:%S"
}


load {
        format = "%5min"
}

cpu_temperature 0 {
        format = "T: %degrees °C"
        path = "/sys/devices/platform/coretemp.0/temp1_input"
}

disk "/" {
        format = "%free"
}

显示模式
就是可以定义i3bar是一直显示还是自动隐藏,按下$mod的时候才会显示,可以设置按下某个键唤出

mode <dock|hide>
modifier <Modifier>

modifier可以定义的按键是Mod1~5,Shift, Control

显示位置

就是设置bar显示在屏幕上边还是下边,我设置的是在上边

position <top|bottom>

托盘输出
就是系统托盘,可以显示pidgin、fcitx、vlc之类的图标什么的

tray_output <none|primary|output>

这个可以关闭,也可以设置为在某一个显示器显示

字体
这个是跟上边的配置一样的

font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
font pango:DejaVu Sans Mono 10

工作区按钮
这个就是左边显示现在是第几个工作区的那个东西,默认是开启的,这个一般不用设置吧

workspace_buttons <yes|no>

颜色

恩,黑黑的bar看起来是不是太单调了点呢,其实可以配置下颜色的啦,是用十六进制表示的指定像素的RGB值#rrggbb的哈

可以配置的有这几项
background
statusline
separator
focused_workspace
active_workspace
inactive_workspace
urgent_workspace

话说这个单看字面意思就可以知道是代表什么了,就不详细讲了,配置的时候是这样用:

colors {
    background <color>
    statusline <color>
    separator <color>

    colorclass <border> <background> <text>
}

给个例子参考下:

bar {
    colors {
        background #000000
        statusline #ffffff
        separator #666666

        focused_workspace  #4c7899 #285577 #ffffff
        active_workspace   #333333 #5f676a #ffffff
        inactive_workspace #333333 #222222 #888888
        urgent_workspace   #2f343a #900000 #ffffff
    }
}

编辑的比较仓促,可能会有些错误,欢迎指正。

再补充一点东西吧

暂存器

这个就是一个特殊的workspace,可以把窗口移动到里面起,想用的时候再召唤出来~~
可以设定快捷键把当前窗口移动到暂存器中,然后快捷键唤出,有点像yakuake之类的下拉终端那样子,不过这个是任意程序都可以~~
从暂存器中召出的时候是浮动模式,想要从暂存器中删除就把他切换成平铺模式就好了
也可以为特定的程序设置快捷键

#Make the currently focused window a scratchpad
bindsym $mod+Shift+minus move scratchpad

#Show the first scratchpad window
bindsym $mod+minus scratchpad show

# Show the sup-mail scratchpad window, if any.
bindsym mod4+s [title="^Sup ::"] scratchpad show

标记跳转
熟悉vim的话对这个功能应该不会陌生

# Mark a container with a single character
bindsym $mod+m exec i3-input -f pango:mono -F 'mark %s' -l 1 -P 'Mark: '

# Go to the container marked
bindsym $mod+g exec i3-input -f pango:mono -F '[con_mark="%s"] focus' -l 1 -P 'Goto: '

i3lock
这个是一个锁屏工具,可以设置锁屏壁纸啦什么
用法:

$ i3lock --help
i3lock: Syntax: i3lock -v] -n] -b] -d] -c color] -u] -p win|default] -i image.png] -t]

在i3的config设置

# i3lock
mode "i3lock: Return to lock/Escape to Cancel" {
        bindsym Return mode "default" exec i3lock -i /home/owen/image/jpsc_logo.png
        bindsym Escape mode "default" 
}

bindsym Mod1+Control+l mode "i3lock: Return to lock/Escape to Cancel"

然后使用快捷键即可~

4赞

试用了一下,感觉不错。 :1:

话说都没什么人看啊~

Sent from my ST18i using Tapatalk 2

搭配点别的东西会更好用~~

Sent from my ST18i using Tapatalk 2

都是去 titlebar 啊。。个人比较喜欢保留 titlebar 然后 stack/tab mode 的样子。。。

恩,可以保留的,但是我比较喜欢这样~~

Sent from my ST18i using Tapatalk 2

没用过 :smirk:

对于看不懂的标题都巧妙的避开了

今天在官网看下载了 demo 视频,感觉太棒了。谢谢楼主的教程,有空我回去试试

先把 kde 用明白了在玩这个

介绍得很详细呀
貌似可以用xft字体,你配置文件里font那行这样试试?
font xft:Wen Quan Yi Zen Hei Mono 10
貌似还有一个功能你没介绍,自动把打开的程序放到指定工作区
如:
assign [class="(?i)firefox"] → 1
assign [class="(?i)pidgin"] → 3
assign [class="(?i)transmission-gtk"] → 10

为防止手滑退出i3,还可以这样:

exit i3 (logs you out of your X session)

bindsym $mod+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’”

好吧,就补充这么多

1赞

恩,一直没用到这个放到特定工作区的功能,所以写的时候忘记了
这篇帖子是好久之前写的,几乎是直接copy过来,没做多少修改,记得之前的时候好像是不支持xft来着~~
谢谢补充哈

@OwenJia Thanks for sharing, it is more humanity than awesome which need to reconfig when everytime updated.

But it can be more customed, like configging i3bar and i3lock. Why don’t you share your config?

恩,我是想起什么来写什么的,最近是有一点忙,i3bar等下补充一下,i3lock我没怎么用,所以暂时没法补充

当然,如果你想要补充的话,热烈欢迎!

I had config my i3 via offcial user’s guide already. It is very detailed…

I will study i3bar later. There are too many alternatives.

How to open terminal which have root authority? I found that $Mod+Shift+Return can’t work.

你的系统有装kdesu或者是gksu之类的东西吗?
上文中的$Mod+Shift+Return是要用到那些来提升权限的

@Owenjia Got it. But I think the code is not right, it should be: bindsym $mod+Shift+Return exec kdesu i3-sensible-terminal

However, you can try and recommend dzen in the post. The i3status bar is too simple and crude.

恩,刚刚发现忘记加上 kdesu 或 gksu 了,本来的帖子里是 gksu 的,到这里想换成 kdesu 的,结果知识删掉了 gksu 忘记加上了,疏忽~~

已经配置得差不多了,我的 i3 配置放在 Github 了,示范图为

!](https://lh3.googleusercontent.com/-u-v1eYjAmTI/UYEh-F8HO1I/AAAAAAAACrw/zpWxBJWGRlw/w870-h837/2013-05-01-220732_1920x1848_scrot.png)

不过仍有二个细节需要进一步改良:

  1. 考虑用 dzen 代替 i3status,前者的输出更为丰富且养眼得许多,可用 i3-dzen2-bridge 辅助。
  2. 使 Windows 之间有空隙,就像这样

!](http://i.imgur.com/3kPdu.jpg)

其用户是通过修改 awesome 的 layout 布局实现的。

针对二点,我试过在配置里给 border 很大的参数且 hideborder=both,但边界并没像预期的那样变透明。各位有什么好办法吗?