1. 默認鍵位
給那些“太長不看”的人,以下圖片是默認熱鍵。
與$mod(Alt)一起按:
與Shift+$mod一起按:
紅色按鍵是你需要按的修飾鍵(默認配置),藍色按鍵是盲打鍵位。
要注意的是,若是沒有配置文件就啟動i3,i3-config-wizard 會幫助你創建一個配置文件,鍵位位置會跟上圖所示一樣,不管你是什么鍵盤布局。
如果你喜歡上圖的設置,可以拒絕 i3-config-wizard的引導,默認以 etc/i3/config 作為配置文件
2. 使用i3
貫穿整個使用文檔,關鍵字$mod將當作已配置好的修飾鍵,修飾鍵默認為Alt鍵(Mod1),windows(Mod4)鍵也是一個受歡迎的替換方案
2.1 打開虛擬終端和移動位置
打開一個新的虛擬終端是非常簡單的操作,默認情況下,這個操作的組合鍵是 $mod+Enter ,默認配置下是Alt+Enter。按下$mod+Enter,將會打開一個新的虛擬終端,它將占滿你屏幕的所有空間。
如果你現在打開另一個虛擬終端,i3會把屏幕空間一分為二,各占一半。新創建的窗口會被i3放在已有窗口的旁邊(寬屏)或者下面(豎屏)
要在兩個終端之間移動焦點,你可以使用vi編輯器風格的方向鍵。然而,在i3里,盲打鍵位就是方向鍵(vi編輯器里的方向鍵為了兼容大多數鍵盤布局,都向左移動了一個鍵位)。因此,$mod+j是向左,$mod+k是向上,$mod+l是向下,$mod+;是向右。像上圖的情況,用$mod+k或$mod+l在兩個終端之間切換。當然,你也可以使用箭頭方向鍵。
現在,你的workspace是按特定方向(默認水平方向)劃分(容器里包含兩個終端)。你可把每個window都再分離一次(水平或者垂直),就像workspace一樣?!皐indow”指一個容器包含一個X11窗口(如一個瀏覽器或者一個終端),“split container”指的是容器包含一個或多個窗口。
TODO:picture of the tree
垂直分割窗口,在創建新窗口前按$mod+v,水平分割窗口,按$mod+h。
2.2 改變容器布局
一個split container 可以設置成下面所列出的布局之一。
splith/splitv
容器里的每個窗口都獲得等量大小的空間。splith 控制每個窗口在彼此的左右方。splitv 控制每個窗口在彼此的上下方。
stacking
容器里只顯示一個正在活動的窗口。在容器上方得到一個窗口的列表。
tabbed
與stacking是一個原理,不過tabbed的窗口列表是單行顯示的標簽頁。
切換模式:$mod+e打開splith/splitv,$mod+s打開stacking,$mod+w打開tabbed
2.3 把一個窗口切換到全屏模式
把一個窗口全屏顯示或者退出全屏,按 $mod+f。
在i3里還有全局全屏模式,那么這個窗口將占據所有的顯示輸出(多屏顯示)(配置命令: fullscrren toggle global)
2.4 打開其他應用程序
除了通過終端打開應用程序,你也可以使用dmenu來打開程序,默認情況下通過$mod+d調出。只需要輸入你要打開的應用的名字(或者是名字的一部分),應用必須在$PATH中才能正常打開。
另外,如果你有一個需要經常打開的應用,你可以創建一個組合鍵來直接打開它,細節請看 配置 部分.
2.5 關閉窗口
如果一個程序未提供一個關閉的機制(很多程序都提供了一個關閉方案,Esc鍵或者一個快捷鍵,比如Ctrl+w),你可以按$mod+Shift+q 來殺掉這個窗口。對于支持 WM_DELETE 協議的應用程序,它將正確地關閉(保存任何修改或進行其他清理)。如果程序不支持 WM_DELETE 協議。X server 將殺掉這個程序并且之后的動作取決與此程序。
2.6 使用workspaces
使用工作空間是分組歸類一堆窗口的好方法。默認情況下,你處在第一個workspace,就像i3bar左下角所指示的一樣。要切換到其他workspace,按下$mod+數字鍵(你要切換到的workspace的數字)。如果工作空間不存在,它將被創建。
一個常見的例子是把網頁瀏覽器放在第一workspace,聊天工具放在另一個workspace,還有另一個你運行的其他軟件放在第三個workspace。當然,你可以不必照著做。
如果你擁有多個顯示屏,在啟動時將會在每個屏幕創建一個workspace。如果你打開一個新的workspace,他會綁定到你正在工作的顯示屏。當你切換一個在其他 顯示屏的workspace時,i3會把焦點設置到那個顯示屏。
2.7 移動一個window到另一個workspace
移動一個窗口到另一個工作空間,按$mod+Shift+目標工作區數字。跟切換workspaces時一樣的情況,如果目標工作空間不存在,它將被創建。
2.8 調整窗口大小
調整容器大小最簡單的辦法是用鼠標:拖拽邊框到想要的大小。
你也可以定義快捷鍵來調整,可以看看這個例子,default config--由i3提供
2.9 重啟i3
為了重啟i3你可以使用$mod+Shift+r(例如當有一個bug時,恢復到正常狀態,或者升級到一個新版本i3)。
2.10 退出i3
不關掉Xserver且利落地退出i3,你可以按$mod+shift+e。通常,會有一個對話向你確認是否退出。
2.11 浮動模式
浮動模式是相對于平鋪模式的。窗口的位置和大小不是由i3自動管理的,而是由你手工調整。使用這個模式有違于平鋪模式,但是他對一些案例如"Save as"對話窗口,或者toolbar窗口(GIMP或類似的)是有用的。這些窗口通常會設置恰當的提示和默認情況下被打開于浮動模式。
你可以通過按$mod+Shift+space來切換一個窗口的浮動模式。通過鼠標拖動標題欄,你可以移動這個窗口,通過拖動邊框,你可以調整窗口大小。你也可以通過使用floating_modifier來操作。另一個調整浮動窗口大小的方法是鼠標右擊標題欄并且拖拽。
關于用鍵盤來調整浮動窗口的大小,請看調整大小的綁定模式,由i3提供
default config
浮動窗口一直處于平鋪窗口的上方
3 樹
i3保存著所有關于 X11 output 的數據,workspace和窗口布局在里面是樹形圖的結構。根節點是X11根窗口,隨后是X11 putputs,然后是 dock areas 和一個 content container,隨后是workspace,最后是window本身。在舊版本的i3,每個workspace有多個list和table,這個方法的結果是難以使用(真的難),理解和實現。
3.1 樹是由容器組成的
我們把樹的組件叫做Containers。一個容器可以掌控一個窗口(意思是一個X11 window,你可以真正看到的,使用的,比如說一個瀏覽器)。另外,Containers可以再包含一個或者多個Containers。一個簡單的workspace例子是:當你在單個顯示器打開i3時,只有一個workspace,你這時打開了兩個終端,你最后得到的樹是:
3.2 定位和Split Containers
當以樹作為數據結構時,為了構建一個布局,使用所謂的 Split Containers 是很正常的。在i3里,每個容器都有屬于自己的方位(水平,垂直,或者未指定),并且定位取決于上一級容器的布局(垂直的有splitev和stacking,水平的有splith和tabbed)。所以我們以一個workspace作為例子,workspace 容器的默認布局是splith(如今很多顯示器是寬屏的)。如果你把布局切換成splitv(默認情況下按$mod+v)然后打開兩個終端,i3會把你的窗口設置成這個樣子:
從version 4開始,i3多了一個有趣的新特性,它能夠分割任何東西:讓我們假設你現在在workspace里打開了兩個終端(以splith布局打開,也就是水平定位)焦點處于右邊的終端,現在你想要要在當前終端下面打開另外一個終端。如果你直接打開新終端,它會被放在最右邊而不是下面。解決辦法是按$mod+v用splitv布局來分割容器(要打開Horizontal Split Container,用$mod+h)?,F在你可以在當前終端下面打開一個新終端了:
你可能已經猜到了:它能夠無限分割到下一層。
3.3 聚焦于父容器
$mod+a
我們繼續以上圖為例。我們在左邊有一個終端,右邊有兩個垂直分布的終端,焦點處在右下角的終端。當你又打開一個新終端,他會被放在右下角終端的下面。
所以說,要怎么把新終端放到右邊而不是下面呢,答案是使用focus parent,它會把焦點轉移到當前容器的父容器。在這種情況下,你會把焦點放在水平方向的workspace里的vertical split Container。因此,新窗口會被打開在Vertical Split Container的右邊:
3.4 隱式容器
在一些情況下,i3需要隱式地創建一個容器來完成你的命令。
一個例子如下:你在單個顯示器啟用i3,在單個workspace打開3個終端。workspace節點在i3的layout tree里,這些終端窗口直屬于workspace節點。默認workspace節點的方向設置是水平的。
現在你往下移動其中一個終端($mod+Shift+k by default)。那么workspace節點會被設置成垂直布局,你移動的這個終端就會出現在屏幕的下面并且直屬于workspace。一個新的容器被創建,用于容納另外兩個終端。當你切換到tabbed模式,你會注意到這個情況。你最終會得到一個有標簽頁容器,里面有兩個窗口(比如 "H[urxvt firefox]"),還有一個你剛才移動到下面的終端窗口。
4 配置i3
到這里,真正有趣的事情才剛剛開始;-)。很多東西都非常依賴于你樣要的工作環境,所以我們無法提供一個默認的且合理的配置。
雖然沒有使用編程語言來進行配置,i3在你希望讓窗口管理器怎么做的方面依然保持著靈活的特性。
例如,你可以配置一個綁定用來跳到指定的窗口,可以設置打開指定的應用程序到指定的workspace,可以自動啟動某個程序,可以改變i3的配色,還可以設置快捷鍵來做一些有用的事情。
要改變i3的配置,復制 /etc/i3/config 到 ~/.i3/config并且用一個文本編輯器來編輯它(或者是復制到~/.config/i3/config,如果你喜歡XDG目錄方案)
第一次啟動i3時,i3會引導你創建一個配置文件,你可以告訴向導程序在配置文件里設置Alt(Mod1)或windows(Mod4)鍵作為輔助按鍵。當然,創建的配置文件會使用你當前鍵盤布局的鍵盤符號。要啟動向導程序,請在終端輸入命令i3-config-wizard。
請確認你當前并沒有~/.i3/config/。否則向導程序將會退出。
4.1 備注
在配置文件里使用備注是可行的和推薦的,為了以后參考或修改,適當地記錄你的配置。備注以#開始,而且只能用在每行的開頭:
例子
# This is a comment
4.2 字體
i3支持以 X core字體和 FreeType 字體來渲染窗口標題
你可以使用xfontsel(1) 生成一個 X core字體類型。你需要使用一個支持ISO-10646編碼的字體來顯示特殊字符(Unicode)。
一個FreeType字體類型是由一個字體系列,風格,粗細,便提,伸延組成的,FreeType字體支持從右到左的渲染和往往比 X core字體支持更多的Unicode符號。
如果i3不能打開配置好的字體,i3會吧錯誤輸出到日志文件,退回到可以工作的字體
語法:
font <X core font description>
font pango:<family list> [<style options>] <size>
例子:
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
font pango:DejaVu Sans Mono 10
font pango:DejaVu Sans Mono, Terminus Bold Semi-Condensed 11
font pango:Terminus 11px
4.3 鍵盤綁定
一個鍵盤綁定會讓i3在按下特定的按鍵后執行一個命令。i3允許以keycode或keysym綁定(你可已隨便更改綁定,雖然i3并不會幫你解決鍵位沖突)
Keysym(key symbol)是指鍵盤上的符號。像是"A"或者"B",但是像是那些奇怪的"underscore"而不是"_"。這些符號是你們用Xmodmap重新映射的按鍵。要獲得當前鍵盤的映射,使用命令
xmodmap -pke
。要以交互方式輸入一個按鍵,查看它是被設置成什么keysym,使用命令xev
。Keycode 不需要擁有一個已賦值符號(方便某些筆記本熱鍵),而且他們即使在你換了鍵盤布局后,也不會改變keycode本身(當使用xmodmap)。
我的建議是:如果你經常更換鍵盤布局,但是不想改變綁定鍵位的物理位置,使用keycodes。如果你不改變鍵盤布局,而且想要一個簡單干凈的配置文件,使用keysyms。
某些工具(例如import或者xdotool)可能無法運行在一些KeyPress事件,因為鍵盤/指針被占用了。針對這些情況,可以使用 --release 標記,這將在按鍵被松開后執行命令。
語法:
bindsym [--release] [<Group>+][<Modifiers>+]<keysym> command
bindcode [--release] [<Group>+][<Modifiers>+]<keycode> command
例子:
# Fullscreen
bindsym $mod+f fullscreen toggle
# Restart
bindsym $mod+Shift+r restart
# Notebook-specific hotkeys
bindcode 214 exec --no-startup-id /home/michael/toggle_beamer.sh
# Simulate ctrl+v upon pressing $mod+x
bindsym --release $mod+x exec --no-startup-id xdotool key --clearmodifiers ctrl+v
# Take a screenshot upon pressing $mod+x (select an area)
bindsym --release $mod+x exec --no-startup-id import /tmp/latest-screenshot.png
可以使用的修飾鍵:
Mod1-mod5,Shift,Control
默認修飾請看 xmodmap(1)
Group1, Group2, Group3, Group4
當使用多個鍵盤布局(例如setxkbmap -layout us,ru)時,您可以指定哪個XKB組(也稱為“布局”)鍵盤綁定應處于活動狀態。默認的,鍵盤綁定會被轉換成Group1并且活躍在所有鍵盤布局。如果你想為其中一個鍵盤布局重寫鍵盤綁定,指定到相應的group。為了向后兼容,“Mode_switch” 是Group2的別名。
4.4 鼠標綁定
在容器范圍內按下一個已經綁定的鼠標按鍵,i3將會執行一個命令。你可以用綁定鍵盤的方法設置鼠標綁定。
語法:
bindsym [--release] [--border] [--whole-window] [<Modifiers>+]button<n> command
默認的,綁定只會在點擊到標題欄的時候運行。如果添加了--release標記,它會在按鍵松開時運行。
如果添加了--whole-window標記,綁定會在你點擊到窗口任何一個部位時運行,但是邊框除外。為了讓一個綁定在點擊到邊框時運行,指定一個--border標記。
例子:
# The middle button over a titlebar kills the window
bindsym --release button2 kill
# The middle button and a modifer over any part of the window kills the window
bindsym --whole-window $mod+button2 kill
# The right button toggles floating
bindsym button3 floating toggle
bindsym $mod+button3 floating toggle
# The side buttons move the window around
bindsym button9 move left
bindsym button8 move right
綁定模式
你可以擁有多套鍵位綁定模式,當你切換到其他綁定模式的時候,所有當前鍵位綁定會被釋放,并且只有你新切換的綁定模式生效。唯一的預設的綁定模式是defalut的,他伴隨i3的啟動,并且沒有定義任何指定的綁定模式。
使用綁定模式有以下兩部分組成:定義一個綁定模式和切換到它。為了做到這個,需要一個配置指令和一個命令,他們被稱為mode。配置指令被用來定義一組綁定并且把它放到一個綁定模式,而命令是用來切換到一個綁定模式。
建議與[variables]組合使用綁定模式,以便維護更容易。以下是一個簡單案例
請注意定義一個退回默認模式的綁定鍵
注意,可以使用[pango_markup]來設置綁定模式, 但是你需要通過添加 --pango_markup標記給定義模式來明確地開啟它。
語法
# config directive
mode [--pango_markup] <name>
# command
mode <name>
例子
# Press $mod+o followed by either f, t, Esc or Return to launch firefox,
# thunderbird or return to the default mode, respectively.
set $mode_launcher Launch: [f]irefox [t]hunderbird
bindsym $mod+o mode "$mode_launcher"
mode "$mode_launcher" {
bindsym f exec firefox
bindsym t exec thunderbird
bindsym Esc mode "default"
bindsym Return mode "default"
}
4.6 浮動調節
移動浮動窗口。你可以選擇其中一個方式,1拖動標題欄,2配置可以通過按鍵和鼠標點擊窗口來移動窗口的浮動調節器。最常見的設置是用與管理窗口相同的按鍵(例如Mod1)。也就是說,你可以按住Mod1,同時鼠標左鍵點擊拖動動窗口到你想要的方位。
當你按住浮動調節器時(Mod1),你可以通過按住鼠標右鍵并拖動,來調整那一個窗口的大小。如果你同時按住了Shift鍵,窗口將會按比例縮放(寬高比會保留)。
語法
floating_modifier <Modifier>
例子
floating_modifier Mod1
4.7 限制浮動窗口的大小
浮動窗口的最大最小面積可以被指定。如果其中的floating_maximum_size被指定為-1,那么對于窗口的最大值將不會被約束。如果其中的floating_maximum_size為定義,或者被制定為0,i3會使用默認值來限制窗口最大值。floating_minimum_size的處理方法一定程度上與floating_maximum_size的相同。
語法
floating_minimum_size <width> x <height>
floating_maximum_size <width> x <height>
例子
floating_minimum_size 75 x 50
floating_maximum_size -1 x -1
4.8 工作區的定位
新工作區有一個默認合適的定位:寬屏用水平定位,豎屏用垂直定位。
你可以重寫default_orientation的行為
語法
default_orientation horizontal|vertical|auto
例子
default_orientation vertical
4.9 新容器的布局模式
這個選項決定了工作區級別的容器該用什么布局模式
語法
workspace_layout default|stacking|tabbed
例子
workspace_layout tabbed
4.10 新窗口的邊框風格
此選項決定新窗口擁有什么樣的邊框風格。默認是normal。注意,new_float 僅應用于作為浮動窗口呼出的窗口。例如對話窗口,而不是到后來才被設置成浮動窗口的窗口。
語法
new_window normal|none|pixel
new_window normal|pixel <px>
new_float normal|none|pixel
new_float normal|pixel <px>
例子
new_window pixel
"normal" 和 "pixel" 邊框風格支持設置邊框像素大小的可選項。
例子
# The same as new_window none
new_window pixel 0
# A 3 px border
new_window pixel 3
4.11 隱藏靠近屏幕邊緣的邊框
你可以使用hide_edge_borders來隱藏與屏幕邊緣靠近的邊框。如果你使用滾動條的話這很有用,或者不想浪費甚至兩像素的顯示空間。"smart"選項是在工作區內只有一個可見窗口時才隱藏邊框,而在工作去內有多個窗口,他不會隱藏邊框。
語法
hide_edge_borders none|vertical|horizontal|both|smart
例子
hide_edge_borders vertical
4.12 指定窗口的任意命令(for window)
使用for_window指令,當i3碰到特定的窗口,你可以讓i3執行任何命令。它可以用在讓窗口浮動,改變他們的邊框的方面,等。
語法
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 pixel 1
# 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
有效的命令請command_criteria
4.13 不把焦點放在新建窗口
當一個新窗口出現時,焦點會移到它那里。no_focus 指令允許預防這種情況發生,而且它必須與command_criteria一起使用
注意,他不會在所有情景下生效,例如,當數據正輸送給一個運行中的程序,使得焦點必須移到它身上。設置這種情況的行為,參考focus_on_window_activation
在工作區的第一個窗口中,no_focus也會被忽略,在這種情況下,沒有理由不把焦點放在這個窗口。與workspace_layaout結合使用會有更好是可用性。
語法
no_focus <criteria>
例子
no_focus [window_role="pop-up"]
4.14 變量
正如您在有關鍵盤綁定的章節中了解到的,你將要配置許多包含修飾鍵的綁定,如果你想要保存一些輸入并能夠改變你之后要用的修飾鍵,那么變量就很方便了。
語法
set $<name> <value>
例子
set $m Mod1
bindsym $m+Shift+r restart
在解釋過程中,變量會在文件中被替換。變量擴張不是遞歸的,所以不可能用一個包含另一個變量的值來定義變量。對于這個沒有其他的想法,而且絕對沒有改變的計劃。如果你需要更多的動態配置,你應該創建一些用來生成配置文件在i3啟動之前運行的腳本。