コード
save_layout.sh
#!/bin/bash for i in $(seq 1 10) do i3-save-tree --workspace $i|sed '1d'|sed -r '/^ *\/\// {/"class"/!d}'|sed 's/\/\///g'|sed '/"class"/ s/,$//g' > ~/.config/i3/workspace_$i.json done
load_layout.sh
#!/bin/bash i=1 # -v option to sort by number for file in $(\ls -v ~/.config/i3/workspace_*.json) do i3-msg "workspace $i; append_layout $file" grep class $file|awk '{print $2}'|sed 's/[^a-zA-Z0-9]//g'|tr [:upper:] [:lower:]|while read apps do echo $apps & done ((i++)) done i3-msg "workspace 1;"
~/.config/i3/config
以下を追記します.
exec ~/path/to/load_layout.sh
save_layout.sh
の呼び出し
シャットダウンをする直前等にこのスクリプトを呼ぶ必要があります.
解説
コマンド
コマンド | 説明 |
---|---|
i3-save-tree |
現在開いているウィンドウのレイアウトをJSON形式で出力.--workspace name でワークスペースname のレイアウトを出力.このコマンドで得たJSON情報を直ちにi3-msg のappend_layout で使用することは出来ない(出力の第一行目がvimに関する設定だったり,swallows の内部で何故か//が追加されているため). |
i3-msg |
i3にメッセージを送信し,i3を操作する.workspace name でワークスペースname に移る.append_layout file でfile に記入されているレイアウト情報を元に,ウィンドウの枠を展開する.対応するアプリケーションが実行されると,そのアプリケーションが枠の中に入る. |
save_layout.sh
ワークスペース1から10に対してi3-save-tree
を行ないます.出力されたJSONファイルに対して,以下の操作を行ないます.
操作 | 理由 |
---|---|
第一行目を削除 | vimの設定行削除 |
swallows におけるclass 属性以外の行を削除 |
class 属性以外の情報が含まれていると,正しくアプリケーションが枠に移動しないため. |
余分なスラッシュを削除 | 文法エラー修正 |
class 属性の最後のカンマを削除 |
文法エラー修正*1 |
操作を行なったら,結果をファイルに保存します.
load_layout.sh
i3-msg
を利用して各ワークスペースに移動した後,append_layout
で枠を展開します.その後,対応するアプリケーションを実行し,枠に当てはめます.
注意:アプリケーションの実行名は基本小文字だろうという前提の元,tr
を使用してclass
属性の値を小文字にしてから同名のアプリケーションを実行するため,大文字を実行名に含むアプリケーションに対しては修正が必要です.
*1:これを修正せずとも実行可能だが,JSONの文法としては正しくないため