備忘録やめた

備忘録として使用していたけどやめた.このブログに載せてあるコードのライセンスは別途記載がない限りWTFPL OR NYSLです.

i3wm: 前回のセッションを復元する

コード

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-msgappend_layoutで使用することは出来ない(出力の第一行目がvimに関する設定だったり,swallowsの内部で何故か//が追加されているため).
i3-msg i3にメッセージを送信し,i3を操作する.workspace nameワークスペースnameに移る.append_layout filefileに記入されているレイアウト情報を元に,ウィンドウの枠を展開する.対応するアプリケーションが実行されると,そのアプリケーションが枠の中に入る.

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の文法としては正しくないため