i3wm使用笔记

前言

i3 windows
manager(简称i3)是小巧的可定制的linux桌面管理器,相当于compiz等,但是基本靠自己动手配置
属于平铺式窗口管理器(tiling window manager),窗口自动铺满屏幕,效率更高,省去不必要空间
使用自定义的 $mod 键与其他按键组合,实现一些功能
应该是仿照了 awesome,减少了一些需要自己设置的功能
本篇默认使用的环境为ubuntu16.04LTS,
由于环境与配置的不同,尤其是软件版本引起的问题,需要进行更多个定制

与桌面环境的区别

gnome,KDE等是桌面环境,提供整个的UI显示解决方案,比如使用什么字体等,以及附带的GUI界面
window manager只管窗口的位置等,范围稍小,
不是很理解,期待稍后了解

查看当前使用的wm

1
wmctrl -m

还没有安装的自己安装
ubuntu 16.04LTS默认使用的compiz(还以为是unity)

安装i3

1
sudo apt-get install i3

其他组件用到时自然会安装

初始使用

  • 注销
  • 重新登录,一般有登录管理器的选择i3作为窗口管理器即可
  • 初进入会有设置向导,设置好 $mod 键并使用默认设置即可,注意默认设置的位置
  • 使用 $mod+Enter 进入终端,开始对配置文件的改造
  • 使用 $mod+d 并输入应用名以启动浏览器

配置文件

相关配置文件及路径

i3配置文件 ~/.config/i3/config
i3status /etc/i3status.conf

配置文件

直接贴配置文件,胜过千言万语,也可能是表达能力不好

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
# This file has been auto-generated by i3-config-wizard(1).
# It will not be overwritten, so edit it as you like.
#
# Should you change your keyboard layout some time, delete
# this file and re-run i3-config-wizard(1).
#
# i3 config file (v4)
#
# Please see http://i3wm.org/docs/userguide.html for a complete reference!
set $mod Mod4
# Font for window titles. Will also be used by the bar unless a different font
# is used in the bar {} block below.
font pango:monospace 12
# This font is widely installed, provides lots of unicode glyphs, right-to-left
# text rendering and scalability on retina/hidpi displays (thanks to pango).
#font pango:DejaVu Sans Mono 12
# Before i3 v4.8, we used to recommend this one as the default:
# font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
# The font above is very space-efficient, that is, it looks good, sharp and
# clear in small sizes. However, its unicode glyph coverage is limited, the old
# X core fonts rendering does not support right-to-left and this being a bitmap
# font, it doesn’t scale on retina/hidpi displays.
# Use Mouse+$mod to drag floating windows to their wanted position
floating_modifier $mod
# start a terminal
bindsym $mod+Return exec --no-startup-id i3-sensible-terminal
bindsym Ctrl+Mod1+t exec --no-startup-id i3-sensible-terminal
# kill focused window
bindsym $mod+Shift+q kill
# start note emacs
bindsym --release Control+space exec --no-startup-id "emacs25 ~/Dropbox/E560_ubuntu/temp.org"
# start dmenu (a program launcher)
# bindsym $mod+d exec --no-startup-id dmenu_run -fn 'Ubuntu Mono:pixelsize=20'
bindsym $mod+d exec --no-startup-id i3-dmenu-desktop --dmenu="dmenu -i -fn 'Ubuntu Mono:pixelsize=20'"
# There also is the (new) i3-dmenu-desktop which only displays applications
# shipping a .desktop file. It is a wrapper around dmenu, so you need that
# installed.
# bindsym $mod+d exec --no-startup-id i3-dmenu-desktop
# change focus
# bindsym $mod+j focus left
# bindsym $mod+k focus down
# bindsym $mod+l focus up
# bindsym $mod+semicolon focus right
# for workman keyboard layout
bindsym $mod+n focus left
bindsym $mod+e focus down
bindsym $mod+o focus up
bindsym $mod+i focus right
# alternatively, you can use the cursor keys:
bindsym $mod+Left focus left
bindsym $mod+Down focus down
bindsym $mod+Up focus up
bindsym $mod+Right focus right
# move focused window
# bindsym $mod+Shift+j move left
# bindsym $mod+Shift+k move down
# bindsym $mod+Shift+l move up
# bindsym $mod+Shift+semicolon move right
#for workman keyboard layout
bindsym $mod+Shift+n move left
bindsym $mod+Shift+e move down
bindsym $mod+Shift+o move up
bindsym $mod+Shift+i move right
# alternatively, you can use the cursor keys:
bindsym $mod+Shift+Left move left
bindsym $mod+Shift+Down move down
bindsym $mod+Shift+Up move up
bindsym $mod+Shift+Right move right
# split in horizontal orientation
bindsym $mod+h split h
# split in vertical orientation
bindsym $mod+v split v
# enter fullscreen mode for the focused container
bindsym $mod+f fullscreen toggle
# change container layout (stacked, tabbed, toggle split)
bindsym $mod+s layout stacking
bindsym $mod+t layout tabbed
bindsym $mod+g layout toggle split
# toggle tiling / floating
bindsym $mod+Shift+space floating toggle
# change focus between tiling / floating windows
bindsym $mod+space focus mode_toggle
# focus the parent container
bindsym $mod+a focus parent
# focus the child container
#bindsym $mod+d focus child
# switch to workspace
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
# for other use
# bindsym $mod+0 workspace 10
# move focused container to workspace
bindsym $mod+Shift+1 move container to workspace 1
bindsym $mod+Shift+2 move container to workspace 2
bindsym $mod+Shift+3 move container to workspace 3
bindsym $mod+Shift+4 move container to workspace 4
bindsym $mod+Shift+5 move container to workspace 5
bindsym $mod+Shift+6 move container to workspace 6
bindsym $mod+Shift+7 move container to workspace 7
bindsym $mod+Shift+8 move container to workspace 8
bindsym $mod+Shift+9 move container to workspace 9
# for other use
bindsym $mod+Shift+0 move container to workspace 10
# reload the configuration file
bindsym $mod+Shift+c reload
# restart i3 inplace (preserves your layout/session, can be used to upgrade i3)
bindsym $mod+Shift+r restart
# exit i3 (logs you out of your X session)
bindsym $mod+Shift+p 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'"
# resize window (you can also use the mouse for that)
mode "resize" {
# These bindings trigger as soon as you enter the resize mode
# Pressing left will shrink the window’s width.
# Pressing right will grow the window’s width.
# Pressing up will shrink the window’s height.
# Pressing down will grow the window’s height.
# bindsym j resize shrink width 10 px or 10 ppt
# bindsym k resize grow height 10 px or 10 ppt
# bindsym l resize shrink height 10 px or 10 ppt
# bindsym semicolon resize grow width 10 px or 10 ppt
# for workman keyboard layout
bindsym n resize shrink width 10 px or 10 ppt
bindsym e resize grow height 10 px or 10 ppt
bindsym o resize shrink height 10 px or 10 ppt
bindsym i resize grow width 10 px or 10 ppt
# same bindings, but for the arrow keys
bindsym Left resize shrink width 10 px or 10 ppt
bindsym Down resize grow height 10 px or 10 ppt
bindsym Up resize shrink height 10 px or 10 ppt
bindsym Right resize grow width 10 px or 10 ppt
# back to normal: Enter or Escape
bindsym Return mode "default"
bindsym Escape mode "default"
}
bindsym $mod+r mode "resize"
# Start i3bar to display a workspace bar (plus the system information i3status
# finds out, if available)
bar {
# status_command i3status
# status_command exec ~/.config/i3/i3status10netspeed.sh
status_command exec ~/.config/i3/conky-i3bar.sh
tray_output primary
tray_padding 5
position top
font pango:DejaVu Sans Mono, FontAwesome 12
}
# 电源选项
set $mode_system 系统:锁屏(L) 注销(O) 关机(P) 重启(R) 取消(Esc)
bindsym $mod+l mode "$mode_system"
mode "$mode_system" {
# 锁屏 (尽管很遗憾只能在一个屏幕上显示锁屏图案,但是比i3lock看不见输入框强点)
bindsym l exec "gnome-screensaver-command --lock"
bindsym o exec i3-msg exit
bindsym p exec systemctl poweroff
bindsym r exec systemctl reboot
bindsym Escape mode "default"
}
# volume control
bindsym XF86AudioLowerVolume exec "amixer -q sset Master playback 5%- unmute"
bindsym XF86AudioRaiseVolume exec "amixer -q sset Master playback 5%+ unmute"
bindsym XF86AudioMute exec "pactl set-sink-mute 0 toggle"
# brightness control
bindsym XF86MonBrightnessUp exec "xbacklight -inc 10"
bindsym XF86MonBrightnessDown exec "xbacklight -dec 10"
# 计算器
bindsym XF86Calculator exec "gnome-calculator"
# 切换窗口 (Alt=Mod1)
# 不知为何向右不能循环
bindsym Mod1+Tab focus left
# 截图
#全屏
bindsym --release Print exec "gnome-screenshot -b"
#当前窗口
bindsym --release Mod4+Print exec "gnome-screenshot -wb"
#选取范围
bindsym --release Shift+Print exec "gnome-screenshot -a"
# 文件管理器
bindsym $mod+0 exec "nemo --no-desktop"
bindsym XF86MyComputer exec "nemo --no-desktop"
# 浏览器
bindsym XF86HomePage exec "vivaldi"
# 窗口配置
client.focused #1793D0 #1793D0 #FFFFFF
client.focused_inactive #000000 #333333 #FFFFFF
client.unfocused #000000 #333333 #FFFFFF
client.urgent #FF0000 #FF0000 #FF0000
# 设置默认浮动窗口
for_window [window_role="pop-up"] floating enable
for_window [window_role="task_dialog"] floating enable
for_window [class="TeamViewer"] floating enable
for_window [title="Preference$"] floating enable
for_window [title="Pages Unresponsive"] floating enable
for_window [class="Calise"] floating enable
for_window [class="whatpulse"] floating enable
# 新窗口边框样式
new_window normal
# new_window none
# new_window pixel
# 焦点不跟随鼠标
focus_follows_mouse no
# ----------------------------------------------------------------------
# 初始化设置
# gnome network manager panal
exec --no-startup-id nm-applet
# sound pannel
exec --no-startup-id volumeicon
# fcitx
# exec --no-starup-id fcitx
# 设置壁纸
exec "feh --bg-fill ~/Pictures/201510_sitting_here_making_fun_by_philipp_haegi.jpg"
# 启动护眼软件
exec --no-startup-id fluxgui
# 使用gnome主题
# exec --no-starup-id gnome-settings-daemon
# 未生效
# 设置屏幕分配
exec "xrandr --output VIRTUAL1 --off --output eDP1 --mode 1920x1080 --pos 2560x0 --rotate normal --output DP1 --off --output HDMI2 --off --output HDMI1 --primary --mode 2560x1440 --pos 0x0 --rotate normal --output DP2 --off"
# ----------------------------------------------------------------------

注意

  • 配置文件虽然使用=#=作为注释标识符,但是只有在行首才算,行内会被认为是颜色而当做设置
  • exec后面还是推荐使用引号括起,然是命令中又有引号的还是先放弃吧

单独设置项目

相当于i3本身的设置

  1. 热键

    windows键,是为Mod4
    ALT键,是为Mod1
    其实两个都不顺手

  2. 字体/字号

    1
    2
    3
    # Font for window titles. Will also be used by the bar unless a different font
    # is used in the bar {} block below.
    font pango:monospace 12

    后面设置字号,影响了边框以及i3bar的字号大小,对于程序自身的东西,并没有什么用
    并不想在字体上下功夫,凑活看

  3. 焦点不跟随鼠标

    1
    2
    # 焦点不跟随鼠标
    focus_follows_mouse no

按键事件响应系统

可以使用 bindsymbindcode 定义使用特定的按键触发的事件,音量调节,亮度调节等都在这里
基本用法:

1
bindsym --release Control+Space exec "emacs ~/Document/temp.org"
  • release 选项表示在按键放开时才使用,
    在这个选项用于音量调节时,将不能持续改变音量,但或许能让本来不能生效的函数开始生效
  • 后面是按键,按键的名字可以使用 xmodmap -xpe 或者 xev 等查看,
    值得注意的是,在为i3设置好事件后,i3将拦截按键,导致 xev 不能获得按键信息,
    因此想要确认一个按键是否能被按下时,先排除i3本身的干扰,
    另外, compiz 下按键不被拦截或是重新被释放.
    • xmodmap -xpe部分结果

    • #+begin~example~
      > xmodmap -pke | grep Audio
      keycode 121 = XF86AudioMute NoSymbol XF86AudioMute
      keycode 122 = XF86AudioLowerVolume NoSymbol XF86AudioLowerVolume
      keycode 123 = XF86AudioRaiseVolume NoSymbol XF86AudioRaiseVolume
      keycode 171 = XF86AudioNext NoSymbol XF86AudioNext
      keycode 172 = XF86AudioPlay XF86AudioPause XF86AudioPlay XF86AudioPause
      keycode 173 = XF86AudioPrev NoSymbol XF86AudioPrev
      keycode 174 = XF86AudioStop XF86Eject XF86AudioStop XF86Eject
      keycode 175 = XF86AudioRecord NoSymbol XF86AudioRecord
      keycode 176 = XF86AudioRewind NoSymbol XF86AudioRewind
      keycode 198 = XF86AudioMicMute NoSymbol XF86AudioMicMute
      keycode 208 = XF86AudioPlay NoSymbol XF86AudioPlay
      keycode 209 = XF86AudioPause NoSymbol XF86AudioPause
      keycode 215 = XF86AudioPlay NoSymbol XF86AudioPlay
      keycode 216 = XF86AudioForward NoSymbol XF86AudioForward
      keycode 234 = XF86AudioMedia NoSymbol XF86AudioMedia

  • 后面使用 exec 调用命令

常用多媒体按键以及相关设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# volume control
bindsym XF86AudioLowerVolume exec "amixer -q sset Master playback 5%- unmute"
bindsym XF86AudioRaiseVolume exec "amixer -q sset Master playback 5%+ unmute"
bindsym XF86AudioMute exec "pactl set-sink-mute 0 toggle"
# brightness control
bindsym XF86MonBrightnessUp exec "xbacklight -inc 10"
bindsym XF86MonBrightnessDown exec "xbacklight -dec 10"
# 计算器
bindsym XF86Calculator exec "gnome-calculator"
# 截图
#全屏
bindsym --release Print exec "gnome-screenshot -b"
#当前窗口
bindsym --release Mod4+Print exec "gnome-screenshot -wb"
#选取范围
bindsym --release Shift+Print exec "gnome-screenshot -a"
# 文件管理器
bindsym $mod+0 exec "nemo --no-desktop"
bindsym XF86MyComputer exec "nemo --no-desktop"
# 浏览器
bindsym XF86HomePage exec "vivaldi"
  • 音量管理使用了但不限于 amixer
  • 计算器,截屏等也不限于 gnome 套件,还有其他可以使用
  1. 按键遗留问题

    • 设置Ctrl+grove(反引号)没能响应,不知道什么原因

自启动进程

  • exec 登录i3时启动的进程
    • exec~always~ 每次重启i3时启动的进程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# ----------------------------------------------------------------------
# 初始化设置
# gnome network manager panal
exec --no-startup-id nm-applet
# sound pannel
exec --no-startup-id volumeicon
# fcitx
# exec --no-starup-id fcitx
# 设置壁纸
exec "feh --bg-fill ~/Pictures/201510_sitting_here_making_fun_by_philipp_haegi.jpg"
# 启动护眼软件
exec --no-startup-id fluxgui
# 使用gnome主题
exec gnome-settings-daemon
# 设置屏幕分配
exec "xrandr --output VIRTUAL1 --off --output eDP1 --mode 1920x1080 --pos 2560x0 --rotate normal --output DP1 --off --output HDMI2 --off --output HDMI1 --primary --mode 2560x1440 --pos 0x0 --rotate normal --output DP2 --off"
# ----------------------------------------------------------------------
  • nm-applet,network manager
    applet的简称,非常方便的网络GUI配置工具,就在系统托盘上
  • volumeicon,虽然没有gnome系列的applet好看,外观统一,但是能实现音量设置功能,至于为什么使用
    • 用来做状态看输出的conky没有自带一个正常的音量监控控件,还要使用 exec 调用shell,觉得负荷重
  • fcitx好像本身就能自动启动
  • feh是个小巧的看图工具,但是好像不响应鼠标动作,
    那显示一张覆盖屏幕的图并且不相应按键不就是壁纸了吗
    • 使用 --bg-fill 设置图片在大小不标准时填充屏幕
  • fluxgui,呵护眼睛,自己点亮
  • xrandr,配置多屏幕的命令,后面的参数可以使用 arandr 应用自动生成的配置文件提取得到,
    动手5分钟,安心10小时
    • 有时feh会不能铺满屏幕,不知道是feh的问题还是xrandr的问题,还是两个软件启动顺序的问题
  • gnome主题设置对于文字的全体文字的放大至关重要,
    在unity下设置的文字放大倍数想要在i3下也生效,
    就需要使用 gnome-settings-daemon,并且该程序不是已经安装有的,需要手动安装.
    • gnome升级到3.2之后将大而全的 gnome-settings-daemon 分成了多个部分放在了
      /usr/lib/gnome-settings-daemon/ 文件下成为多个细碎的小工具,
      其中有关字号设置的为 gsd-xsettings,
      使用 exec /usr/lib/gnome-settings-daemon/gsd-xsettings 启动,
      此时使用 --no-startup-id 可能会导致无法启动

    • 另外设置文字放大倍数的命令为

      1
      2
      dconf read /org/gnome/desktop/interface/text-scaling-factor
      dconf write /org/gnome/desktop/interface/text-scaling-factor 1.25

      或者

      1
      2
      gsettings get org.gnome.desktop.interface.text-scaling-factor
      gsettings set org.gnome.desktop.interface.text-scaling-factor 1.25

      或者使用 dconf-editor 到指定路径修改

模式

使用模式的功能打造windows xp般的关机选项界面

1
2
3
4
5
6
7
8
9
10
11
# 电源选项
set $mode_system 系统:锁屏(L) 注销(O) 关机(P) 重启(R) 取消(Esc)
bindsym $mod+l mode "$mode_system"
mode "$mode_system" {
# 锁屏 (尽管很遗憾只能在一个屏幕上显示锁屏图案,但是比i3lock看不见输入框强点)
bindsym l exec "gnome-screensaver-command --lock"
bindsym o exec i3-msg exit
bindsym p exec systemctl poweroff
bindsym r exec systemctl reboot
bindsym Escape mode "default"
}
  • 模式的声明及提示设置
  • 定义模式入口
  • 定义模式(必要定义退出模式的方式)

其他模式

  • default
  • fullscreen
  • focus mode(浮动窗口)
  • resize
    • 可以自定义调节按键

遗憾的是i3并没有区分模式与其他命令比如 layout xxx,有可能分不清到底哪个是模式

i3bar

相当与状态栏,能够使用json的方式接收输入

  • 作者认为内容与形式要分开
  • 也导致许多软件的输出需要经过字符串处理成为json格式,消耗部分资源
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Start i3bar to display a workspace bar (plus the system information i3status
# finds out, if available)
bar {
# 使用原生的i3status,不支持网速显示
# status_command i3status
# 脚本监控网速并加上i3status的输出
# status_command exec ~/.config/i3/i3status10netspeed.sh
# 使用conky的输出,但为了支持颜色使用脚本编辑成json的效果
status_command exec ~/.config/i3/conky-i3bar.sh
tray_output primary
tray_padding 5
position top
font pango:DejaVu Sans Mono, FontAwesome 12
}
  • 设置上游消息源
  • 设置显示位置为主显示器
    • 在使用=conky=时貌似两个屏幕都显示了
  • 设置不同项目的间隔
  • 设置状态栏显示位置(top|bottom)
  • 设置装概览使用字体
  1. FontAwesome

    一个设计好的点阵字体,以字的形式表现图标
    FontAwesome主页可以下载文件
    解压后在=use-on-desktop=文件夹下有字体文件,鼠标点击打开并安装
    然后在i3bar上将能够正常显示(虽然终端中与emacs中依然有一部分不能正常显示)
    缺点就是在终端中看不出来内容是什么,推荐使用注释,不然只能脑补

  2. i3status

    i3推荐的状态栏输出应用,配置文件在 /etc/i3status.conf

    • 使用文本式的配置文件,只管理非常有限数量的变量
    • 但是能够以长间隔刷新并同时对按键进行即刻响应
    • 可以使用脚本显示更多信息(比如网速),
    • 可以设置为json的输出格式,免去添加其他功能的脚本中更多的字符串处理
      • 即使不设置json输出格式,在默认使用配置时仍然能够显示彩色内容,
        原因不明,可能是i3内部的朋友交易
      • 事实上只有在将新加的项目放在最前面或者最后面才是,想放在中间就要多费心思了

    配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    # i3status configuration file.
    # see "man i3status" for documentation.
    # It is important that this file is edited as UTF-8.
    # The following line should contain a sharp s:
    # ß
    # If the above line is not correctly displayed, fix your editor first!
    general {
    output_format = "i3bar"
    colors = true
    interval = 5
    }
    # order += "ipv6"
    order += "disk /"
    order += "wireless _first_"
    order += "ethernet _first_"
    order += "battery all"
    # order += "load"
    order += "cpu_usage"
    order += "volume master"
    order += "tztime local"
    ipv6 {
    format_up = "%ip"
    format_down = "no IPv6"
    }
    wireless _first_ {
    # format_up = ": (%quality at %essid) %ip"
    format_up = ": (%quality at %essid) "
    format_down = ": down"
    }
    ethernet _first_ {
    # if you use %speed, i3status requires root privileges
    # format_up = "E: %ip (%speed)"
    # format_down = "E: down"
    format_up = ": %ip (%speed)"
    format_down = ": down"
    }
    battery all {
    format = "%status %percentage %remaining"
    format_down = "No battery"
    # status_chr = "⚡ CHR"
    # status_bat = "🔋 BAT"
    # status_unk = "? UNK"
    # status_full = "☻ FULL"
    status_chr = " "
    status_bat = " "
    status_unk = "? "
    status_full = " "
    path = "/sys/class/power_supply/BAT%d/uevent"
    low_threshold = 10
    }
    cpu_usage {
    format = ": %usage"
    max_threshold = 75
    format_above_threshold = ": %usage"
    degraded_threshold = 25
    format_above_degraded_threshold = ": %usage"
    }
    volume master {
    format = ": %volume"
    format_muted = ": (%volume)"
    device = "default"
    mixer = "Master"
    mixer_idx = 0
    }
    tztime local {
    format = " %Y-%m-%d  %H:%M"
    # format = "%Y-%m-%d %H:%M:%S"
    }
    load {
    format = "%1min"
    }
    disk "/" {
    format = " %avail"
    }
    • 一开始指定了输出格式,单独在终端运行时就能看出来

      • 不指定格式时在i3bar上也能显示颜色,非常神奇
    • 默认没有网速显示功能

      • 也没有内存使用的显示,作者认为看那些是迷信(你在手机上时常关心内存吗?)
      • 同样受此影响,本人决定在conky中不实现音量的效果(但不表示没有设置过)
    • 设置简单一看就会

    • 网速显示的实现

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      #!/bin/sh
      # Authors:
      # - Moritz Warning <[email protected]> (2016)
      # - Zhong Jianxin <[email protected]> (2014)
      #
      # See file LICENSE at the project root directory for license information.
      #
      # i3status.conf should contain:
      # general {
      # output_format = i3bar
      # }
      #
      # i3 config looks like this:
      # bar {
      # status_command exec /usr/share/doc/i3status/contrib/net-speed.sh
      # }
      #
      # Single interface:
      # ifaces="eth0"
      #
      # Multiple interfaces:
      # ifaces="eth0 wlan0"
      #
      # Auto detect interfaces
      ifaces="enp0s31f6 wlp1s0"
      last_time=0
      last_rx=0
      last_tx=0
      rate=""
      readable() {
      local bytes=$1
      local kib=$(( bytes >> 10 ))
      if [ $kib -lt 0 ]; then
      echo "? K"
      elif [ $kib -gt 1024 ]; then
      local mib_int=$(( kib >> 10 ))
      local mib_dec=$(( kib % 1024 * 976 / 10000 ))
      if [ "$mib_dec" -lt 10 ]; then
      mib_dec="0${mib_dec}"
      fi
      echo "${mib_int}.${mib_dec} M"
      else
      echo "${kib} K"
      fi
      }
      update_rate() {
      local time=$(date +%s)
      local rx=0 tx=0 tmp_rx tmp_tx
      for iface in $ifaces; do
      read tmp_rx < "/sys/class/net/${iface}/statistics/rx_bytes"
      read tmp_tx < "/sys/class/net/${iface}/statistics/tx_bytes"
      rx=$(( rx + tmp_rx ))
      tx=$(( tx + tmp_tx ))
      done
      local interval=$(( $time - $last_time ))
      if [ $interval -gt 0 ]; then
      rate="  $(readable $(( (rx - last_rx) / interval )))  $(readable $(( (tx - last_tx) / interval )))"
      else
      rate=""
      fi
      last_time=$time
      last_rx=$rx
      last_tx=$tx
      }
      i3status | (read line && echo "$line" && read line && echo "$line" && read line && echo "$line" && update_rate && while :
      do
      read line
      update_rate
      echo ",[{\"full_text\":\"${rate}\" },${line#,\[}" || exit 1
      done)
      • 使用脚本指定了本地的网卡并将结果相加

      • 不知道对系统负载如何

      • 结尾的 ${line#,\[]} 并不清楚

      • 最后三次 read line && echo "$line" 原因是i3status的输出格式可能是i3bar-protocol说的,
        出现在一开始的一些初始化的部分(read应该是只能读一行)

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        -[
        - [],
        +[
        + {
        + "full_text": "E: 10.0.0.1 (1000 Mbit/s)",
        + "color": "#00ff00"
        + },
        + {
        + "full_text": "2012-01-05 20:00:01"
        + }
        +],
        [
        {
        "full_text": "E: 10.0.0.1 (1000 Mbit/s)",
        "color": "#00ff00"
        },
        {
        "full_text": "2012-01-05 20:00:02"
        }
        ],

        json的开头输出,红色是开始以及初始化(网速结果可能不想往这里添加),
        绿色是一次输出(注意以逗号结尾).
        每一个指标基本模式是 {"full_text":"","color":""},
        i3bar-protocol中还介绍了其他的属性,暂时没有用到

      • 在i3bar的设置中使用

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        # Start i3bar to display a workspace bar (plus the system information i3status
        # finds out, if available)
        bar {
        # 脚本监控网速并加上i3status的输出
        status_command exec ~/.config/i3/i3status10netspeed.sh
        tray_output primary
        tray_padding 5
        position top
        font pango:DejaVu Sans Mono, FontAwesome 12
        }

        注意字体设置不要丢

  3. conky

    增加了众多指标检测,但是突然不支持音量显示是为什么,但是通过调用shell可以检测音量
    在i3bar中启用:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # Start i3bar to display a workspace bar (plus the system information i3status
    # finds out, if available)
    bar {
    # 使用conky的输出,但为了支持颜色使用脚本编辑成json的效果
    status_command exec ~/.config/i3/conky-i3bar.sh
    tray_output primary
    tray_padding 5
    position top
    font pango:DejaVu Sans Mono, FontAwesome 12
    }

    配置文件:
    conky-i3bar.sh

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/sh
    # Send the header so that i3bar knows we want to use JSON:
    echo '{"version":1}'
    # Begin the endless array.
    echo '['
    # We send an empty first array of blocks to make the loop simpler:
    echo '[],'
    # Now send blocks with information forever:
    exec conky -c ~/.config/i3/conkyrc_bar.lua

    conkyrc~bar~.lua

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    -- ===================================================================
    -- conky_bar
    -- Date : 12/12/2015
    -- Author : Allen_Qiu
    -- Version : v1.1
    --
    -- 这份配置文件适用于conky1.10之后版本
    -- conky1.10之后配置文档采用lua语法
    -- 原作者音量显示
    -- {"full_text":${execi 1 amixer | grep -A10 'Master' | sed -rn 's/.*\[([0-9]+%)\].*\[(on|off)\]/\2 \1/p' | sed -n '1p' | sed 's/off.*/ /' | sed -r 's/on( [01234]?[0-9]%)/\1/' | sed -r 's/(on|) 0%/ 0%/' | sed -r 's/on//'}},
    -- 修改后音量显示
    -- {"full_text":" ${execi 1 amixer sget Master | grep -Eo "[0-9]+%"}","color":${if_match "${execi 1 amixer sget Master | grep -oP "(on|off)(?=\])"}" == "off"}"\#FFFF00"${else}"\#FFFFFF"${endif}},
    -- 本以为这样的音量显示可以
    -- {"full_text":"${mixer}"},
    -- ===================================================================
    conky.config = {
    -- 不输出到X
    out_to_x = false,
    out_to_console = true,
    background = false,
    double_buffer = true,
    -- 刷新时间
    update_interval = 1,
    -- 运行时间,0为一直运行
    total_run_times = 0,
    -- 强制uft8编码,需xft支持
    override_utf8_locale = false,
    -- 缩写字符单位
    short_units = true,
    -- 监视端口
    if_up_strictness = 'address',
    -- cpu数据监测模式,一般选2
    cpu_avg_samples = 2,
    default_color = 'green',
    color0 = '00DD00',
    color1 = "what",
    color2 = 'FFFFFF',
    color3 = 'FF8C00',
    color4 = '#FF0000',
    }
    -- conky.text = "[{"full_text":" ${fs_free /}"}],
    conky.text = [[
    [{"full_text":" ${fs_free /}"},
    {"full_text":"${if_up wlp1s0}: (${wireless_link_qual wlp1s0}% at ${wireless_essid})${endif}","color":${if_match ${wireless_link_qual wlp1s0} <= 30}"\#FF0000"
    ${else}
    ${if_match ${wireless_link_qual wlp1s0}>=60}"\#00FF00"
    ${else}"\#FFFFFF"
    ${endif}
    ${endif}},
    {"full_text":"${if_up eth0}  ${endif}","color":"\#00FF00"},
    {"full_text":${if_up wlp1s0}" ${downspeed wlp1s0}/s  ${upspeed wlp1s0}/s"
    ${else}
    ${if_up eth0}" ${downspeed eth0}/s  ${upspeed eth0}/s"
    ${else}" 0 B/s  0 B/s"
    ${endif}
    ${endif}},
    {"full_text":" ${cpu cpu0}%","color":${if_match ${cpu cpu0}<=30}"\#00FF00"
    ${else}
    ${if_match ${cpu cpu0}>=80}"\#FF0000"
    ${else}"\#FFFFFF"
    ${endif}
    ${endif}},
    {"full_text":" ${mem}","color":${if_match ${memperc}<=30}"\#00FF00"
    ${else}
    ${if_match ${memperc}>=80}"\#FF0000"
    ${else}"\#FFFFFF"
    ${endif}
    ${endif}},
    {"full_text":" ${battery_percent}%","color":${if_match ${battery_percent}<=30}"\#FF0000"
    ${else}"\#FFFFFF"
    ${endif}},
    {"full_text":"${if_mounted /media/chougousui/MAX29} ${endif}"},
    {"full_text":"${color1}","color":"${color4}"},
    {"full_text":" ${time %Y年%m月%d日 周%a}"},
    {"full_text":" ${time %k:%M}"}
    ],
    ]]
    • oh-my-i3配置文件基础上改进,原先的音量脚本过于晦涩
    • conky.text 后的值中需要使用 [[ ]] 包装,不然会出错
    • 同一个属性之间可以使用换行以提高可读性,不同属性之间不能使用换行
    • 定义部分可以预定义,但是在下面的输出部分没能正常使用
  1. dmenu

    • i3默认的开始菜单程序,在=$PATH=路径下搜索程序
    • 也会导致搜索到根本没有界面输出的命令比如=sed=等

    启用

    1
    bindsym $mod+d exec --no-startup-id dmenu_run -fn 'Ubuntu Mono:pixelsize=20'

    后面的参数设置字体,还可以使用=-i=忽略大小写

  2. i3-dmenu-desktop

    使用perl包装的dmenu,可以在 $XDG_DATA_HOME/applications,
    $XDG_DATA_DIRS/applications 路径下搜索桌面快捷方式文件.
    启用i3-dmenu-desktop

    1
    bindsym $mod+d exec --no-startup-id i3-dmenu-desktop --dmenu="dmenu -i -fn 'Ubuntu Mono:pixelsize=20'"
    • 后面可以使用参数来继承dmenu的选项
    • 可见引号冲突时可以使用双引号和单引号
  3. j4-dmenu-desktop

    程序世界中有趣的找事现象,j4主页专门说明比 i3-dmenu-desktop 快,
    并且贴出了比较速度的方式,命名上也是 j4i3 正好每个都往后一个.
    虽然现在并没有宣称的25倍,但是8倍还是有的.
    所以干脆使用j4

    1
    bindsym $mod+d exec --no-startup-id j4-dmenu-desktop --dmenu="dmenu -i -fn 'Ubuntu Mono:pixelsize=20'" --display-binary

    在选项上完全兼容 i3-dmenu-desktop,并且在打开binary名称显示之后能够看到网易云音乐的入口,
    使用 i3-dmenu-desktop 是看不到的,不知道为什么看不到二进制名称就连入口也看不到是什么设定

窗口及工作区

应该算是i3的精髓所在,但是平常并不被重视

  1. 窗口布局方式

    • stacking,堆叠
      • 纵向排列的标签式
    • tabbed,标签
      • 就像浏览器一样
      • 话说浏览器本身不需要设置成标签式,那是窗口管理器的任务,
        但是一般窗口管理器不管,浏览器自力更生
    • split,平铺
    • floating,浮动(浮动时可以使用鼠标右键拖动以改变大小)
      • 适合弹窗提示,设置窗口等

    设置默认浮动窗口

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 设置默认浮动窗口
    for_window [window_role="pop-up"] floating enable
    for_window [window_role="task_dialog"] floating enable
    for_window [class="TeamViewer"] floating enable
    for_window [title="Preference$"] floating enable
    for_window [title="Pages Unresponsive"] floating enable
    for_window [class="Calise"] floating enable
    for_window [class="whatpulse"] floating enable
    for_window [title="Electronic WeChat"] floating enable
    • 这里的 floating enable 有可能让人摸不着头脑,没人说这是个命令啊
  2. 工作区提高效率

    • 可以将暂时不使用的窗口(比如用终端开了一个音乐播放器,
      网易云音乐等,懒得关终端又不想看见)放在 完全看不见 的地方,需要的时候再打开
    • 也可为不同类型的窗口放在设置好的特定工作区中,节省手动搬运时间同时显得有条理
  3. 树结构窗口管理与容器

    i3
    以树形结构的方式管理窗口,容器是最小的单位。这种结构可以被水平或竖式分割。

    因此可以实现以下效果

    1
    2
    [--------]        [--------]      [--------]
    [--------] [---][---]
    • 在顶层按=$mod+v=分开上下,新建窗口
    • 切换到下面的*容器*
    • 按=$mod+h=分开左右,新建窗口
    1
    [--------]        (--------)(--------)    (--------)((--)(--))
    • 顶层使用 tabbed
    • 第二个tab使用 HSplit

    重要提示

    • 在按下设置键盘布局的按键后,一个容器就已经产生,此后新开的窗口就是在该容器中的
      • 所以i3是手动分配布局的
    • 在已经分好的三个同级别的窗口中,单独选其中两个更换布局方式似乎不可行,
      需要在打开窗口之前就想好谁与谁是同一个布局,
      但这样在分级上明显分离的窗口在移动时却能自由按照方向直接切换,是不是不平等呢
    • 回到父窗口可以使用快捷键 $mod+a

    循环切换窗口
    因为窗口的特殊管理方式,切换窗口推荐使用的是四个方向的按键,
    而不是 Ctrl+Tab 这种循环的形式,因为可能循环不到(顶多只能在同一级别的窗口就间循环)
    后者这样模拟

    1
    bindsym Mod1+Tab focus left

    不知道为什么往右不能完成循环

    • 双屏幕,主要在左,放了workspace2,次要在右,放了workspace1(在arandr中的设置)

    其他配置
    冻皮的i3配置里讲了一些窗口相关的配置
    笔记本的workspace没有敢设置成2,毕竟有可能带出去,不使用外接屏幕
    还没有看两个屏幕的默认配置下拔掉外接屏幕是什么现象

体会

ubuntu是一个商业公司定制好的操作系统.(基本上音量,亮度等等,无所不包),
别人写的自己自然不费心思,并且也挺好的,稳定性好点.
i3正好是需要自己动手配的,音量控制等原本认为系统自己就带的东西,
事实上这是对操作系统有太宽泛的理解.
看到i3朴素的边框,才发现原来边框什么的都是身外之物(除了少数应用如 vivalid浏览器),
都与应用本身无关.
下载他人最新版conky后,发现最新版的conky依赖的c++库文件版本要求太新,
在ubuntu17.04以上才有支持,要想使用conky最新版,要么自己从其他源下载新版依赖文件,
并且解决因此带来的所有其他冲突问题,
要么使用Arch,每次都能使用最新版,并且在每一天的使用中都面临依赖文件的问题,并适应之.
在自己编译conky过程中,体会到Arch社区的一种思想,
别人写的,基本不能拿来自己用,还要靠自己打补丁,
好的话提交分享,也没有什么官方主页,都是用户自己的分享,就这样建立起了一个开源开发者的乐园.
或许用ubuntu久了转向Arch是趋势,为自己能开始中级的linux之路而开心
写英语不是为了追求什么,是为了在出问题谷歌的时候有准确的关键词,多么痛的领悟.
最后引用一段i3status开发者的话,别总闲得蛋疼看什么内存占用,看了也不能快,慢了看也没用.

参考网页

  1. oh-my-i3
  2. i3 arch wiki
  3. i3status
  4. 冻皮的i3配置