i3の操作とコンテナ/ツリー
先だっての i3 タイル型ウィンドウマネージャを使う は簡単な使い方までだったので、その続き。
目次
i3 の基本操作
前回 と重複するけれども基本的な操作を以下に。
起動・終了 / 端末起動
i3 は $mod+Enter
で端末エミュレータが起動する。どんどん押すとどんどん増えていく。
ウィンドウを閉じるには Shift+$mod+q
。
ログアウトするには Shift+$mod+e
、「Yes, exit i3」をクリック。
メニュー (dmenu) の起動は $mod+d
。最上部に現れ、アプリの名前を入力するとインクリメンタルに検索してくれる。 Enter
でそのアプリを起動。
i3 の再起動は Shift+$mod+r
で行う。i3 が upgrade したり、設定ファイルを書き換えたときなどに。
キー | 動作 |
---|---|
$mod+Enter |
端末エミュレータを起動する |
Shift+$mod+q |
ウィンドウを閉じる |
$mod+d |
アプリの起動メニュー (dmenu) |
Shift+$mod+e |
ログアウト |
Shift+$mod+r |
i3 の再起動 |
ウィンドウの選択
ウィンドウのフォーカスを移す(処理対象を切り替える)には $mod
+ j
/ k
/ l
/ ;
の各キーの組み合わせ。
実は、ウィンドウの選択(フォーカス)はマウスポインタを動かして目的のウィンドウに重ねるだけでもいい。
キー | 動作 |
---|---|
$mod+j |
左のウィンドウにフォーカス |
Smod+k |
下 |
$mod+l |
上 |
$mod+; |
右 |
ウィンドウを開く方向
ウィンドウを開く方向を決めるには、 $mod+h
あるいは $mod+v
を押してからウィンドウを作成する。
例えば、ウィンドウがひとつある時に $mod+v
を押してから $mod+Enter
を押すと、もとのウィンドウの下側に新しい端末が開く。
キー | 動作 |
---|---|
$mod+h (+ウィンドウ作成) |
horizontal (水平方向つまり右側) にウィンドウを作成する |
$mod+v (+ウィンドウ作成) |
vertical (垂直方向つまり下側) にウィンドウを作成する |
ウィンドウの移動
以下のキーでウィンドウを動かせる。例えばウィンドウが二つ左右に並んでいて左を選択している時、 Shift+$mod+;
で左右が入れ替わる。
キー | 動作 |
---|---|
Shift+$mod+j |
ウィンドウを左に移動 |
Shift+$mod+k |
下 |
Shift+$mod+l |
上 |
Shift+$mod+; |
右 |
ウィンドウのリサイズ
マウスでウィンドウの境界をドラッグするとウィンドウをリサイズできる。タイル型なので、例えば左を大きくすれば右が小さくなり、という具合だけれども。
キーボードで行うには $mod+r でリサイズモードに入って操作する。
キー | 動作 |
---|---|
$mod+r |
リサイズモードへ |
リサイズモードに入ったらあとは方向キーか j
k
l
;
で。 ENTER
や ESC
でリサイズモードを終了する。
$mod+r mode | 動作 |
---|---|
j または ← |
水平方向に縮小 |
k または ↓ |
垂直方向に拡大 |
l または ↑ |
垂直方向に縮小 |
; または → |
水平方向に拡大 |
ENTER |
終了 |
ワークスペース
ワークスペース機能は他のウィンドウマネージャでもよくある、デスクトップを幾つも作って切り替える機能。仮想デスクトップなどともよばれる。GnuScreen や tmux のタブ機能もこれだ。
Ubuntu (Unity) も仮想デスクトップ機能を持っているけれども、デフォルトではオフにされてあったかと思う。この機能を望む人がそう多くはないのだろうか。しかし、タイル型ウィンドウマネージャの i3 では、この機能はかなり重宝する。
左下に 1
と表示されているが、これは ワークスペース#1
を使用していることを示している。
デフォルトではフルキー最上段左より 1
〜 0
までの数字キーに10個のワークスペースへの切り替えがあてられている。
$mod+2
を押すと左下に 2
と表示され、 ワークスペース#2
に切り替わる。ここで $mod+Enter
として端末を開いてから、 $mod+1
で ワークスペース#1
に戻ってみる。すると、左下には 2
という表示が残っているだろう。
このように、処理対象のワークスペース以外でウィンドウが開かれているワークスペースは左下に示され、使用中であることがわかる。
なお、この数字のところをマウスでクリックして切り替えてもいい。
既に開かれているウィンドウを、他のワークスペースへ動かしたいときは、 Shift+$mod+数字
のキー。処理対象のウインドウが、指定したワークスペースへと飛んでいく。表示はもとのワークスペースのままなので、必要ならば切り替える。
キー | 動作 |
---|---|
$mod+数字キー |
数字番号のワークスペースに切り替える |
Shift+$mod+数字キー |
数字番号のワークスペースにウィンドウを移動する |
特殊なウィンドウ表示、フローティングとフルスクリーン
驚愕の「フローティング」
$mod+d
から lxappearance を起動してみる。すると、なんだかウィンドウが不自然に大きかったり縦長だったりするかもしれない。
こういうダイアログタイプのは真ん中でもっとちっちゃめに表示してくれるのがいい、そう思うだろう。けれどもタイル型ウィンドウマネージャはウィンドウをタイルにあてはめるものなのだから、当然の表示結果とも言える。けど、なんだかやるせない。
そこで Shift+$mod+Space
を押してみると、驚愕の事実が明らかになる。
なんとウィンドウを重ねてきた。
タイル型がこんなことをしてしまうなんて言語道断じゃないか、という向きもあろう。だがGtkやらのウィンドウシステムに向けて作られたアプリは、この方が扱いやすいことが多いのだ。CLI、CLI言ってても、普通のウィンドウ型アプリを使った方が楽なことも多いだろう。それが操作しにくかったりできなかったりするのでは意味がない。作者は非常に良いチョイスをしたと感心した。
なお、いくらかのアプリのダイアログやツールウィンドウについては最初からフローティングウィンドウになるよう配慮してあるらしい。Gimpはそのままでいけた。 lxappearance は手動で切り替える必要があったけれども、設定ファイルに記すことによって自動的にフローティングさせることもできる。
キー | 動作 |
---|---|
Shift+$mod+Space |
フローティング表示/タイル表示の切り替え |
フルスクリーン表示
もう一つのウィンドウ表示機能が ‘フルスクリーン’ だ。 $mod+f
で対象のウィンドウが全画面表示になる。 Firefox の F11
の機能だ。ウィンドウタイトル欄もステータスバーも、そして枠までも消してくれる。没入モードとでも言おうか。ビデオの再生なんかこれがいいと思った。
なお、フルスクリーン表示中はウィンドウの切り替えができないが、ワークスペースの切り替えはできる。
キー | 動作 |
---|---|
$mod+f |
フルスクリーン表示/タイル表示の切り替え |
レイアウトモード
これまでのところ、ウィンドウ作成というのは、画面が水平あるいは垂直方向に分割されて増えていくというものだった。これをスプリットレイアウトと呼ぶ(水平分割を スプリットH、 垂直分割をスプリットV という)。
実は i3 にはほかに、分割せずに表示するレイアウト方法が2つある。それぞれ タブ (tabbed) と スタック (stacking) という。これらは、ウィンドウをカードのように重ねてレイアウトしてくれる。
‘タブ’ は、フルスクリーン表示では表示されないタイトルをさながらブラウザのタブのように表示してくれる。 $mod+w
で切り替わる。
‘スタック’ も同じくウィンドウのタイトルを並べるが、こちらはリスト形式で表示する。長いウィンドウタイトルを確認したい時に便利だ。 $mod+s
。
‘スプリット’ へ戻るには $mod+e
。
なお、スプリットについては、キーを押す毎にスプリットHとスプリットVを切り替えてくれる。
キー | レイアウトモード | 動作 |
---|---|---|
$mod+w |
タブ (tabbed) | 重ねて表示 (タイトルをタブ表示) |
$mod+s |
スタック (stacking) | 重ねて表示 (タイトルをリスト表示) |
$mod+e |
スプリットH/V (splith/splitv) | 分割表示 (押す毎に水平/垂直を切り替え) |
i3のコンテナとツリー概念
i3のウィンドウシステムにはコンテナとツリーといった概念があり、 i3 のユーザーズガイド に説明がある。
ちょっと複雑で私は難しく感じた。それで、自分が捉えたことを自分なりの説明にしてみる。
コンテナとツリー
コンテナとは簡単に言ってしまえば「表示要素を入れ子で管理する単位」ということのようだ。つまり、アプリを起動すると、そのウィンドウ要素はコンテナに包まれて管理され、表示される。ワークスペースもコンテナの一種である。
ユーザの操作に伴って、必要なコンテナが随時作成される。
コンテナは複数のウィンドウやコンテナを含むことができる。つまり、いってみれば、親コンテナにウィンドウや子コンテナが含まれ、子供コンテナも子供(孫)を持てる、といった具合に階層構造(ツリー)を持つことになる。
コンテナは自分の中にあるウィンドウや子コンテナをどの方向(水平か垂直)に並ばせるかを決める「子を従わせる方向属性」を持っている。子が生まれると必ずこの方向性に従って並んでいく。
例えば、なにもないワークスペースで $mod+Enter
$mod+Enter
$mod+v
$mod+Enter
と押すと、画面の左側に1つ、右側に上下2つの合計3つの端末エミュレータという画面構成になる。
これを上記に従って説明すると次のようになる。
ワークスペースコンテナは最初に子を水平方向に配置させる属性を持っている。だから $mod+Enter
を2回押すと端末エミュレータのウィンドウが左右に2つ作成される。次に、右側のウィンドウが選ばれている状態で $mod+v
をおして垂直方向にウィンドウを作成する準備をする。そして $mod+Enter
で端末エミュレータを起動しようとすると、垂直方向の属性を持った子コンテナが作成されて、その中の上段にもとの端末が表示され、下段に新しい端末のウィンドウが表示される。
コンテナ作成と親コンテナ選択
では、具体的にどのような操作でコンテナを構成していけばいいか。
基本操作のところで $mod+h
あるいは $mod+v
は「ウィンドウをその方向に作成云々」とだけしたけれど、ツリーとコンテナの概念を知ったうえで操作するのであれば、 $mod+h
あるいは $mod+v
を押すということは、その方角属性をセットした子コンテナを作成する準備、といえる。
キー | 動作 |
---|---|
$mod+h (+ウィンドウ作成) |
水平方向属性の子コンテナを作成して再構成 |
$mod+v (+ウィンドウ作成) |
垂直方向属性の子コンテナを作成して再構成 |
コンテナは、便利のため暗黙裡に作成されることも多い。公式ドキュメントの例をもうひとつ引いてみよう。
$mod+Enterを3回押すと3本並ぶように端末が起動され、右端の端末エミュレータのにフォーカスがあたっている状態。
ここで Shift+mod+k
(下移動)を押すと、上段にはコンテナの中に2つの端末ウィンドウ、下段には動かした端末のウィンドウ、という構成になる。
もともとワークスペースコンテナの中に端末ウィンドウが3つあっただけだが、ウィンドウひとつを垂直方向に移動した結果、ワークスペースコンテナの方向属性が垂直に変化してしまったのだ。このままでは残り2つのコンテナも垂直属性の影響を受けてしまう。そこで i3 が新しく水平属性のコンテナを上段に作って、そこに2つのウィンドウを再配置したのである。
もうひとつ、公式からそのまま引っ張るだけではつまらないので、ちょっとだけ違う例を。
何もないワークスペースで $mod+v
$mod+Enter
$mod+Enter
$mod+h
$mod+Enter
とすると上段に横長がひとつ、下段に左右2つの端末ウィンドウが開く。
この状態で、さらに一番下に横長のウィンドウをつくりたいが、どうすればいいか。
右下のウィンドウにフォーカスしている状態で$mod+vあるいは$mod+hを押しても、右下への作成を指定するだけである。これはつまり、ウィンドウの作成はフォーカスがあたっているものの兄弟として作られるからである。ではどうすればいいのか。(うーん)。これは、親、つまりフォーカスウィンドウを擁するコンテナを選択した状態なら作れるのではないか。
親コンテナを選択するには $mod+a を押す。すると親コンテナ以下のウィンドウタイトルが全てハイライトされる。
キー | 動作 |
---|---|
$mod+a |
親コンテナ選択(フォーカス) |
$mod+a
を押した後で $mod+Enter
とすれば、みごと最下段に横長の端末が表示されるはずだ。
ツリーとレイアウトモード
先ほどの例は、上段が横長ウィンドウ、中段が左右2つのウィンドウ、そして下段がこれまた横長ウィンドウという構成になったが、中段の左右どちらかにフォーカスした状態でスタックレイアウトへ切り替え、すなわち $mod+s
を押してみる。すると、中段だけでスタック表示になるのがわかる。 $mod+w
でタブにしても同様だ。
下段の横長のウィンドウはワークスペースコンテナに属する。だからこのウィンドウにフォーカスがある状態で $mod+w
としてみると、全体がタブ表示に切り替わる。 $mod+j
で左にフォーカスを移動すると、中段に属する2つのウィンドウがさらにタブ表示となっており、タブが2段になっているだろう。つまりはこういうことなのだ。
このようにレイアウトモードはフォーカスウィンドウが属する親コンテナごとに働くということらしい。