2017-06-28 10 views
0

私はi3wmを使用しています。私は複数のウィンドウを論理的にグループ化する方法を探したい。私は使用してみました:mark、title_format。i3ユーザー定義のグループ化によってウィンドウをグループ化する方法

しかし、複数のウィンドウに同じマークを設定することはできません。 title_formatを使用して複数のウィンドウを照合することもできません。

私が定義した論理グループに属する選択されたウィンドウでいくつかのコマンドを実行したいだけです。

私はこれを達成できますか?

答えて

1

実際にはマークを使用できます。マークはユニークであるため、特定のマークは1つのウィンドウ上にしか存在できません。しかし、con_mark - i3を含む任意の基準に一致すると、常に正規表現が使用されます。

したがって、ウィンドウを単一の正規表現と一致させる方法でマークするだけで済みます。例

mark groupA_1 
mark groupA_2 
mark groupA_3 
mark groupB_7 
mark groupB_8 
mark groupB_9 

のために不注意別のウィンドウからマークを削除しないように、一度だけ各マークを使用するように世話をするために、当然のことながら、重要です。

グループAに属するすべてのウィンドウでコマンドを実行する場合は、条件[con_mark="^groupA_"]の前に付ける必要があります。例えば、サブストリングが一致する場合i3に一致する基準のために、それが十分であること

[con_mark="^groupA_"] move workspace A 
[con_mark="^groupA_"] kill 

注意。したがって、[con_mark='a']は、少なくとも1文字の「a」を含むマークと一致します。マーク "a"と正確に一致させたい場合は、マークの先頭に^、マークの最後に$を追加する必要があります。[con_mark='^a$']


現在設定されているマークのリストi3-msg -t get_marks(または他のi3はIPCの実装)で取得することができ

ここでは、増分ウィンドウをマークするi3-msgpythonを活用し、迅速かつ汚いスクリプトです:

#!/bin/sh 
i3-msg -t get_marks |                                       
python -c '                                    
import json 
import sys                                
group = sys.argv[1] + "_"                            
marks = json.load(sys.stdin); 
indices = [int(mark.lstrip(group)) for mark in marks if mark.startswith(group)] or [0] 
print(sorted(indices)[-1] + 1) 
' "$1" | xargs -I {} i3-msg mark "$1_"{} 

これは、現在のマークのリストをPythonインラインスクリプトに渡します。 Pythonスクリプトは、グループ名($1)を引数として取り、グループ名で始まるすべてのマークをフィルタリングし、グループ名を切り捨てて数字だけを残します。このグループのマークがまだない場合、リストには0だけが含まれます。次に、最も高い数字を取得し、1を加算して結果を出力します。結果はxargsに渡され、i3-msgを再度呼び出して新しいマークを作成します。

このように、これはすばやく汚れており、汚れを重視しています。おそらく、場合によってはそうです。グループに "foo"という名前を付けるには、すでに "foo_bar"という名前のマークがあります。解決のための

i3groupmark groupA 
+0

感謝: - i3groupmarkとして例えば - 最初のパラメータとして、グループ名でそれを呼び出してそれを実行可能にし、

スクリプトを保存し

。私はこれについて考えましたが、私は、このようなウィンドウの数が固定されていないので、いくつかのbindsymの代わりに1つのbindsymだけでマークをインクリメンタルに生成する方法を知らない。また、手動でマークを入力するためにi3入力を使用したくないのは、あまりにも面倒です。 –

+0

私は、これを達成することができますbashスクリプトを書くことを考え出した。 –

関連する問題