i3
i3 是一種動態的平鋪式窗口管理器,其靈感來自於面向開發者與資深用戶的 wmii。
i3 的既定目標包括清晰可讀的文檔,完善的多顯示器支持,基於樹形結構的窗口管理,提供 vim 式的多種操作模式。
安裝[編輯 | 編輯原始碼]
通過安裝i3-wm包軟體包來安裝i3.
也可以安裝i3包組軟體包組。它包括了窗口管理器, 一個鎖屏器和兩個生成狀態欄並通過stdout與i3bar交互的程序。
啟動[編輯 | 編輯原始碼]
從tty啟動[編輯 | 編輯原始碼]
使用 xinit來啟動i3
從顯示管理器啟動[編輯 | 編輯原始碼]
i3-wm包 軟體包包括了 i3.desktop
,可以支持將 i3 作為 Xsession 啟動。i3-with-shmlog.desktop
這個入口則附加了日誌功能(對於調試很有用)。i3-gnomeAUR軟體包則把 i3-wm
集成到了 GNOME 中去。
使用[編輯 | 編輯原始碼]
通過官方文檔獲取全面的信息,基本使用方法見i3 User's Guide。
鍵盤映射[編輯 | 編輯原始碼]
在 i3 裡,一切命令均以「修飾鍵」開頭,即 $mod
. 默認上來說是 Alt 鍵 alt
(Mod1),但開始鍵 Super
(Mod4) 也更為廣泛接受。Super 鍵往往帶有 Windows 圖標,在蘋果鍵盤上則是 Command 鍵。
見 i3 偏好和 Using i3 以獲取默認映射表。見 Keyboard 綁定以獲取添加新快捷鍵的說明。
非Qwerty鍵盤布局的用戶可能會希望跳過以下所說的「配置助手」。
如果在多個窗口管理器之間切換,可以考慮使用sxhkd或者其它environment agnostic程序來管理鍵盤映射。更多信息可在Keyboard shortcuts#Xorg中找到。
容器和布局[編輯 | 編輯原始碼]
i3 以樹形結構的方式管理窗口,容器是最小的單位。這種結構可以被水平或豎式分割。容器默認是平鋪的,但也可以設置為標籤或堆疊式布局。它同樣也能設置為浮動式(適用於對話窗口)。浮動的窗口總是顯示在頂部。
參見 i3 Tree 和 Containers and the tree data structure 以了解更多信息。
程序啟動器[編輯 | 編輯原始碼]
i3 使用 dmenu 作為首席程序啟動器,鍵綁定默認為 $Mod+d
。在使用它之前必須先安裝可選依賴 dmenu包
i3-wm包 包含了 i3-dmenu-desktop——一個 "dmenu" 的Perl 包裝器,它通過Desktop entries創建一個已安裝應用的列表。 也可以使用j4-dmenu-desktop-gitAUR 作為替代。
rofi 是一個流行的dmenu替代品,它能列出更多的選項。
在KDE Plasma/i3中使用KRunner作為應用啟動器[編輯 | 編輯原始碼]
在KDE Plasma中使用i3也是可行的,參見 KDE#使用不同的窗口管理器.
當通過 KDEWM=/usr/bin/i3
運行Plasma時, 你可以添加以下內容到i3的config配置中將$mod+d
綁定到KRunner上來替代dmenu作為程序啟動器:
~/.config/i3/config
set $menu --no-startup-id qdbus org.kde.krunner /App display bindsym $mod+d exec $menu
配置[編輯 | 編輯原始碼]
見配置i3 以獲取更多細節。本文餘下部分假設 i3 的配置文件位於 ~/.config/
目錄。
配置助手和可選鍵盤布局[編輯 | 編輯原始碼]
當 i3 首次啟動時,它會啟動配置助手 i3-config-wizard。此工具會通過重寫位於 /etc/i3/config.keycodes
的模板配置文件來創建 ~/.config/i3/config
。他會對默認模板造成兩次修改。
- 它會詢問用戶以選擇默認的修飾建。它會在模板文件中添加一行,類似於
set $mod Mod1
; 然後 - 它會用用戶設置的鍵盤布局相應的 bindsyn 行替換所有 bindcode 行。
第二步是設計用於確保 Qwerty 鍵盤上的四個導航鍵 j
, k
, l
和 ;
on a Qwerty keyboard會被映射在擁有相同位置的按鍵上,舉例說,Dvorak 鍵盤上的 h
, t
, n
, s
。這個小戲法的副作用是 最多十五個按鍵會被以一種破話位置記憶的方式被映射 - 所以,對於 Dvorak 用戶, 「重啟」被綁定於 $mod1+p
而不是 $mod1+r
,「豎直分割」被綁定於 $mod1+d
而不是 $mod1+h
,類似的還有更多。
因此,其他鍵盤布局的用戶若是想要直截了當的,符合教程中給出的按鍵綁定的鍵盤綁定,可能更傾向於不去使用 "config wizard" 。這可以拷貝 /etc/i3/config
到 ~/.config/i3/config
(或 ~/.i3/config
),然後編輯此文件。
注意,用戶也可以建立一份以鍵碼為基礎的配置。例如,對於那些經常切換鍵盤布局,但是想要 i3 的鍵盤綁定保持相同的用戶。
自啟動程序[編輯 | 編輯原始碼]
添加一行 exec
命令到 ~/.config/i3/config
文件中。
例如:
exec terminator
你也可以使用 XDG Autostart來設置自啟動程序。
i3bar[編輯 | 編輯原始碼]
除了顯示工作區信息外,i3bar 也可以作為 i3status 或其替代品的輸入。下一章節會對此進行詳細描述。示例:
~/.config/i3/config
bar { output LVDS1 status_command i3status position top mode hide workspace_buttons yes tray_output none font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1 colors { background #000000 statusline #ffffff focused_workspace #ffffff #285577 active_workspace #ffffff #333333 inactive_workspace #888888 #222222 urgent_workspace #ffffff #900000 } }
更多細節,見設置i3bar 。
i3bar可選方案[編輯 | 編輯原始碼]
一些用戶可能更偏好於類似於常規桌面環境提供的面板。這可以通過在 i3 啟動時運行面板程序達成。
例如, 要使用 Xfce 面板 (xfce4-panel包), 把下面這行內容放到 ~/.config/i3/config
中的任何位置:
exec --no-startup-id xfce4-panel --disable-wm-check
i3bar 可以通過注釋掉 ~/.config/i3/config
中的 bar{ }
段落禁用,或者定義一個按鍵以切換 i3bar 顯示狀態:
~/.config/i3/config
# bar toggle, hide or show bindsym $mod+m bar mode toggle
獨立於桌面環境的替代品有:
- polybar — 一個快速並且易用的創建狀態欄的工具
- excalibar — 用C寫成的輕量可定製的狀態欄
i3status[編輯 | 編輯原始碼]
拷貝默認的配置文件到家目錄:
$ cp /etc/i3status.conf ~/.config/i3status/config
不是所有的插件都被在默認配置文件中被定義,一些配置值對於系統也可能是無效的,所以需要相應的更新。具體見 i3status(1) 。
i3status 可選方案[編輯 | 編輯原始碼]
- i3blocks — 通過 shell 腳本擴展。 它可以處理點擊事件,中斷,和定義或更在塊的基礎上更新間隔。
- i3pystatus — 默認帶有許多插件和選項的可擴展 Python 3 狀態欄
- j4status — 提供了狀態欄,可以通過插件擴展,且是用 C 寫成的。額外的插件來自j4status-plugins-gitAUR.
- goi3bar — Go語言 寫的 i3status 替代品。配置文件同時還有各種插件,並發選項和豐富的插件支持。
- goblocks — Go語言 寫的輕便快速的 i3status 替代品。
- bumblebee-status — 多主題的Python狀態欄生成器。
- ty3status — Typescript編寫的 i3status 替代品,
- i3status-rust — 使用Rust編寫的高效並且特性豐富的i3status替代品。能夠處理push更新, 單獨設置更新間隔, 支持主題和點擊事件
i3status 包裝器[編輯 | 編輯原始碼]
- i3cat — 基於go語言做的包裝器,它可以連結來自多個資源的輸入,也可以處理滑鼠操作來轉發用戶特定的信號到子程序。
- py3status — 一個可擴展的基於Python的 i3status 包裝器。
- YaGoStatus — Go編寫的另一個i3status替代品。.
狀態欄中的圖標字體[編輯 | 編輯原始碼]
安裝 i3-wm-iconpatchAUR來讓狀態欄支持圖標。你也可以使用下面的圖標字體。
- ttf-font-awesome — 可以通過 CSS定製的可縮放矩陣字體。[1]顯示了每個圖像的 Unicode 值。
- ttf-font-icons — 也提供了全面的圖像字符,包括彼此毫無重疊的 Awesome 和 Ionicons, 也很好地避免了 Awesome 與 DejaVu Sans 的微秒重疊。
- ttf-ionicons — Ionic Framework的獨特圖標
要配合這些字體使用,在配置文件中一種字體屬性的後綴用,
分割字體。示例:
~/.config/i3/config
bar { ... font pango:DejaVu Sans Mono, Icons 8 ... }
依照 pango語法, 在逗號分割的多個字體的後面,字體大小隻被設置一次,對每個字體都設置大小將會造成除了最後一個字體以外,其他的字體都被忽略。
在~/.config/i3status/config
中使用unicode數字添加圖標。輸入法將會在文本處理器間有所區分。 例如,插入心型圖標(unicode 數字 f004):
- 在多個圖形化的文本處理器(如 gedit, Leafpad) 和終端模擬器 (如 GNOME Terminal, xfce4-terminal)中:
Ctrl+Shift+u
,f004
,Enter
- Emacs:
C-x
,8
,RET
,f004
,RET
- Vim (在插入模式):
Ctrl+v
,uf004
- urxvt: 按住
Ctrl+Shift
, 鍵入f004
終端模擬器[編輯 | 編輯原始碼]
默認配置下按 $mod+Enter
會運行 i3-sensible-terminal
這個查找終端模擬器程序的腳本.參見i3-sensible-terminal(1)了解它查找終端模擬器的順序。
要想立即啟動自定義的終端模擬器, 編輯~/.config/i3/config
中的這一行:
bindsym $mod+Return exec i3-sensible-terminal
也可以通過設置 $TERMINAL
environment variable達到同樣效果.
禁用標題欄點擊動作[編輯 | 編輯原始碼]
添加 bindsym button1 nop
來禁止i3選中你點擊的標題欄對應的窗口。當你的默認布局是標籤式並且經常不小心誤點到窗口標籤時比較有用。
技巧與提示[編輯 | 編輯原始碼]
跳轉到打開的窗口[編輯 | 編輯原始碼]
- quickswitch-i3 — 一個可在 i3 的窗口之間快速跳轉,定位的 Python 實現
- i3-wm-scripts — 用正則表達式在窗口之間進行搜索並跳轉
- rofi — Search and jump to open and scratchpad window
- i3-easyfocus — Focus and select windows in i3
- wmfocus — Focus and select windows in i3 and other window managers
- i3-cycle-focus — Provides an Alt-Tab functionality for i3
- i3-winmotion — Focus and select visible windows in i3
跳轉到急需處理的窗口[編輯 | 編輯原始碼]
添加這行到 ~/.config/i3/config
: [2]
bindsym $mod+x [urgent=latest] focus
保存和恢復窗口布局[編輯 | 編輯原始碼]
從4.8版本起, i3能夠保存和恢復工作區布局。 要實現這個需要Official repositories中的這些包: perl-anyevent-i3包 和 perl-json-xs包
保存一個工作區的當前窗口布局[編輯 | 編輯原始碼]
要保存當前的窗口布局,按這幾步做:
- 首先, 在一個你喜歡的工作區內執行命令打開一些窗口,並根據需要調整它們的大小。 記下打開每個窗口所執行的命令
- 現在, 切換到一個新的工作區, 打開終端然後執行:
$ i3-save-tree --workspace N > ~/.config/i3/workspace_N.json
N是上一步的工作區號碼。 這將會保存N號工作區的布局到這個文件中~/.config/i3/workspace_N.json
. - 這個新創建的文件需要被編輯, 但是你可以用這個命令來完成:
$ sed -i 's|^\(\s*\)// "|\1"|g; /^\s*\/\//d' ~/.config/i3/workspace_N.json
恢復工作區的窗口布局[編輯 | 編輯原始碼]
有兩種方法恢復工作區的布局: 寫一個腳本, 或者編輯 ~/.config/i3/config
來自動載入布局. 這裡只討論第一種方法, 參考官方文檔了解第二種方法怎麼用。
要恢復在上一小節中保存的工作區布局, 寫一個叫 load_layout.sh
的文件,它包含以下內容:
- The starting lines:
~/load_layout.sh
#!/bin/bash i3-msg "workspace M; append_layout ~/.config/i3/workspace_N.json"
M是你想要載入布局的工作區編號,N是之前保存布局的那個工作區的編號
- 還有在之前你所使用的打開那些窗口的命令, 但它們必須被封閉在()內,並且在命令末尾加上&符號來讓它後台運行
例如,如果保存的布局包括3個 uxterm
窗口:
~/load_layout.sh
#!/bin/bash # First we append the saved layout of workspace N to workspace M i3-msg "workspace M; append_layout ~/.config/i3/workspace_N.json" # And finally we fill the containers with the programs they had (uxterm &) (uxterm &) (uxterm &)
然後把文件設為可執行的:
chmod u+x ~/load_layout.sh
最後,運行下面的命令將N號工作區的布局載入到M號工作區:
~/load_layout.sh
bindsym $mod+g exec ~/load_layout.sh
到 ~/.config/i3/config
並重啟i3將綁定Mod+g 到上面的腳本~/.config/i3/workspace_N.json
的swallows 部分需要被手動編輯Scratchpad容器[編輯 | 編輯原始碼]
默認地, scratchpads 只包括一個窗口. 但是,容器也能變成一個scratchpad
創建一個新的容器(例如, Mod+Enter
), 分割它 (Mod+v
) 然後創建另外一個容器。 聚焦到父窗口 (Mod+a
), 於另一方向上分割(Mod+h
), 然後重新創建。
聚焦到第一個容器 (並且聚焦到父窗口), 把窗口變為浮動式 (Mod+Shift+Space
),然後移動它到scratchpad (Mod+Shift+-
).現在你可以根據喜好拆分容器了
屏保和電源管理[編輯 | 編輯原始碼]
通過 Power management#xss-lock 你可以為你的i3會話註冊一個屏保。使用 xautolock 的-time
選項在給定時間後鎖定屏幕:
xautolock -time 10 -locker "i3lock -i 'background_image.png'" &
一個 systemd 服務文件能在系統將要進入睡眠或休眠狀態時用來鎖屏。參見 Power management#Suspend/resume service files,注意i3lock要求服務類型為 forking
.
另請參見 DPMS.
另一個方案是使用 xidlehookAUR 並配合 betterlockscreenAUR 或其它鎖屏器. xidlehook 是一個用Rust寫的 xautolock 替代品 , 帶有一些額外的功能。 它包括了在播放音頻或者全屏時禁用鎖屏的選項。 --timer
參數的單位是秒:
xidlehook --not-when-audio --not-when-fullscreen --timer 360 "betterlockscreen -l dim" "" &
關機,重啟和鎖屏[編輯 | 編輯原始碼]
關機,重啟和鎖屏的鍵位綁定可以添加到 ~/.config/i3/config
。接下來的例子假定你已經安裝了 polkit包 來允許非特權用戶執行電源管理命令。
set $Locker i3lock && sleep 1 set $mode_system System (l) lock, (e) logout, (s) suspend, (h) hibernate, (r) reboot, (Shift+s) shutdown mode "$mode_system" { bindsym l exec --no-startup-id $Locker, mode "default" bindsym e exec --no-startup-id i3-msg exit, mode "default" bindsym s exec --no-startup-id $Locker && systemctl suspend, mode "default" bindsym h exec --no-startup-id $Locker && systemctl hibernate, mode "default" bindsym r exec --no-startup-id systemctl reboot, mode "default" bindsym Shift+s exec --no-startup-id systemctl poweroff -i, mode "default" # back to normal: Enter or Escape bindsym Return mode "default" bindsym Escape mode "default" } bindsym $mod+Pause mode "$mode_system"
一旦配置好, 在任何時候按下 $mod+pause
將會看到一個提示。要實現更複雜的行為表現,使用一個獨立的腳本, 並在mode中引用它。 [3]
對於其它可用於替代的鎖屏器,參見 List of applications/Security#Screen lockers.
「吞噬」終端窗口[編輯 | 編輯原始碼]
和dwm相似, i3 能夠用新啟動的GUI窗口"吞噬"當前的終端窗口。這可以通過使用 i3-swallowAUR[損壞的連結:package not found] 或 i3-swallow-gitAUR 軟體包來實現。
例如, 要讓 mpv的窗口吞噬原始的終端:
$ i3-swallow mpv video.mp4
多顯示器手動管理[編輯 | 編輯原始碼]
感謝 xrandr的存在,有很多方法輕鬆管理系統顯示。 下面的例子在i3配置文件中集成了它, 和之前電源管理章節裡的做法差不多。
下面的例子是一個有VGA和HDMI輸出的筆記本使用一個菜單來切換顯示輸出的開關:
## Manual management of external displays # Set the shortcuts and what they do set $mode_display Ext Screen (v) VGA ON, (h) HDMI ON, (x) VGA OFF, (y) HDMI OFF mode "$mode_display" { bindsym v exec --no-startup-id xrandr --output VGA1 --auto --right-of LVDS1, mode "default" bindsym h exec --no-startup-id xrandr --output HDMI1 --auto --right-of LVDS1, mode "default" bindsym x exec --no-startup-id xrandr --output VGA1 --auto --off, mode "default" bindsym y exec --no-startup-id xrandr --output HDMI1 --auto --off, mode "default" # back to normal: Enter or Escape bindsym Return mode "default" bindsym Escape mode "default" } # Declare here the shortcut to bring the display selection menu bindsym $mod+x mode "$mode_display"
在一個關閉了的顯示器上打開的任何窗口將會自動回到活躍的顯示器上。
得到顯示器設備名最簡單的方法是連接上它們,然後執行:
$ xrandr --query
這將輸出可用的、已識別的設備及其系統內名稱,可以幫助你正確地設置配置文件。
參考 xrandr 頁面或者man page來獲取完整可使用的參數列表, 訪問i3 userguide 和/或 i3 FAQ on reddit了解更多信息.
標籤式或層疊式的網絡瀏覽器[編輯 | 編輯原始碼]
有些網絡瀏覽器並沒有實現 Tab, 因為原則上對 Tabs 的管理是由窗口管理器負責,而不是瀏覽器。
為了讓 i3 管理您的無 Tab 網絡瀏覽器,以 uzbl 為例,在 ~/.i3/config
添加以下:
for_window [class="Uzbl-core"] focus child, layout stacking, focus
這是層疊式瀏覽,即所有窗口為垂直地顯示。好處是任何 Tab 的標題都可見,哪怕開了很多瀏覽器窗口。
如果您更偏好標籤式瀏覽,即窗口在水平方向上顯示,用:
for_window [class="Uzbl-core"] focus child, layout tabbed, focus
工作區名稱變量[編輯 | 編輯原始碼]
由於工作區在i3配置文件中定義了多次, 自定義工作區名稱變量也許有幫助,例如:
set $WS1 term set $WS2 web set $WS3 misc set $WS4 media set $WS5 code
然後使用對應的名稱變量替代工作區名稱:
bindsym $mod+1 workspace $WS1 ... bindsym $mod+Shift+1 move container to workspace $WS1
參見Changing named workspaces獲取更多信息。
正確處理浮動對話框[編輯 | 編輯原始碼]
即使是默認情況下就該在浮動模式中打開的對話框 [6],也可能仍在平鋪模式中打開。要改變這個行為,用xorg-xprop包檢查對話框的 WM_WINDOW_ROLE
,然後添加正確的規則到 ~/.i3/config
(使用 pcre 語法):
for_window [window_role="pop-up"] floating enable for_window [window_role="task_dialog"] floating enable
還可以使用標題規則和正則表達式:
for_window [title="Preferences$"] floating enable
或者 WM_CLASS
:
for_window [class="(?i)mplayer"] floating enable
狀態欄網速顯示[編輯 | 編輯原始碼]
你可以試試上游的腳本, 要使用它:
- 根據你的系統重命名兩個網卡 (use
ip addr
) - 在
/sys/devices
找到它們,然後合適地替換掉:
$ find /sys/devices -name network_interface
/sys/class/net/interface/statistics/
來不依靠pci位置查找現在,保存腳本到一個合適的位置 (例如 ~/.config/i3
) ,然後讓你的狀態欄程序配合它工作
自動切換水平/垂直窗口分割方向[編輯 | 編輯原始碼]
這個 autotilingAUR軟體包能夠用來自動切換水平/垂直窗口分割方向以達到和bspwm螺旋平鋪相似的效果,安裝完成之後,把下面內容添加到~/.config/i3/config
,然後重啟i3。
exec_always --no-startup-id autotiling
疑難解答[編輯 | 編輯原始碼]
通用[編輯 | 編輯原始碼]
很多時候,你遇到的 bug 在開發版中被修復了。可以從 AUR 上的 i3-gitAUR 與 i3status-gitAUR 編譯安裝最新的開發版。上游(即 i3 項目開發者)希望你能用開發版再試試看能否重現問題 [7] 延伸閱讀:調試/獲取跟蹤數據#Compilation options.
不讓焦點一直跟隨滑鼠[編輯 | 編輯原始碼]
在~/.config/i3/config
中添加:
focus_follows_mouse no
i3 信息欄上的某些按鈕不能用[編輯 | 編輯原始碼]
舉例:i3-nagbar
上的「Edit Config」按鈕是要調用 i3-sensible-terminal
命令的。這就需要你的終端模擬器能夠被i3識別。
平鋪的終端窗口中出現折行錯亂[編輯 | 編輯原始碼]
從 v4.3 版本起,i3 會無視平鋪窗口的擴大提示(size increment hints)[8]。這就帶來了折行錯亂等問題。平鋪之前嘗試先把窗口改成浮動狀態,可以繞過這個問題。
滑鼠指針總處於忙碌狀態[編輯 | 編輯原始碼]
當啟動了某些並不支持啟動提醒的腳本或程序時,滑鼠指針會逗留在忙碌狀態六十秒左右。
為排除此現象,凡是 exec
命令都加 --no-startup-id
後綴,比如:
exec --no-startup-id ~/script bindsym $mod+d exec --no-startup-id dmenu_run
為了在全局禁用這個滑鼠動畫,查看:Cursor themes#Create links to missing cursors。
綁定快捷鍵不起作用[編輯 | 編輯原始碼]
像 scrot 這類工具,用普通的按鍵綁定方式(按下按鍵後,未鬆開按鍵前就立即執行)可能不會正常工作。可以試試綁定時加上 --release
參數,使命令在鬆開按鍵之後執行 [9]:
bindsym --release Print exec --no-startup-id scrot bindsym --release Shift+Print exec --no-startup-id scrot -s
畫面撕裂現象[編輯 | 編輯原始碼]
因為 i3 的雙倍緩衝實現得不到位,會出現畫面撕裂或閃爍。安裝並配置好 picom 可以解決這一問題。[10]
看不到系統托盤圖標[編輯 | 編輯原始碼]
為了讓 tray_output primary
這一行配置生效,有時需要用 xrandr 來指定一個主顯示輸出。你可以試試按照 tray_output 顯式地指定一個具體的輸出,或者乾脆刪掉這行配置[11]。 關於顯示輸出的細節可以參看 Xrandr 頁面. 自從 i3 4.12 版本起,由 i3-config-wizard 生成的默認配置已經不再包含這行配置了。
Spotify的默認工作區[編輯 | 編輯原始碼]
要為spotify窗口分配默認工作區,不能使用標準的assign
方法 ,而應該使用 for_window
命令, 例如
~/.config/i3/config
... for_window [class="Spotify"] move container to workspace $ws10
為了確保 for_window
不移動已經在 $ws10
的窗口, 可以使用 move --no-auto-back-and-forth
.
參見[編輯 | 編輯原始碼]
- 官方網站
- Funtoo:I3 Tiling Window Manager
- i3原始碼
- i3-extras - 腳本和補丁合集
- i3ipc-glib - 一個i3拓展插件庫
- i3ipc-ruby - An improved library for i3 extensions in Ruby
- j4tools - 為i3設計的非官方工具
Arch Linux Forums
- The i3 thread - i3的通用討論
- i3桌面截圖和配置分享
截屏與視頻