Herbstluftwm

提供: ArchWiki
移動先: 案内検索

Herbstluftwm は Xlib と Glib を使用する X11 向けの手動タイル型ウィンドウマネージャです。

インストール

Herbstluftwm は herbstluftwm パッケージや herbstluftwm-gitAUR パッケージでインストールできます。

はじめに

お気に入りのターミナルエミュレータでオンラインで herbstluftwm や herbstclient の man ページをよく読んでください (herbstluftwm, herbstclient)。レイアウトが保存されるバイナリツリーの説明から、設定ファイルのオプションと設定値まで、様々な情報が載っているので、時間をとってドキュメントを全て一読することを推奨します。

設定

/etc/xdg/herbstluftwm/autostart ファイルを $HOME/.config/herbstluftwm/autostart にコピーしてください。コピーしたファイルは必要に応じて編集できます。autostart ファイルには実行可能属性を付与してください。そうしないとキーバインドが機能しません。

herbstluftwm の設定は herbstclient reload を実行するか、reload コマンドに対応するキーバインドを使うことで即座に反映されます (コマンドセクションを参照)。リロードされるたびに Autostart が呼び出されるので、まず autostart の中にある既存の設定を解除するようにするのが普通です。

マルチモニターのサポート

Herbstluftwm はマルチモニターを仮想概念でサポートしています。herbstluftwm におけるモニターは xrandr で確認できる実際のモニターの構成とは一致しません。柔軟にモニターを配置を制御することができるようになっています。herbstclient detect_monitors を使うことで自動的に物理的なセットアップに適応できます。モニターを追加・削除・リサイズする方法は man ページを見てください。マルチモニターのタグはモニターによって"占有"されることがありません。既に他のモニターで使われているタグを別のモニターで使用すると、モニターはそれぞれのタグを交換します。

コマンド

Herbstclient はコマンドラインからウィンドウマネージャを完全に制御することができる強力なツールです。

herbstclient のパラメータはタブ補完が効きます。herbstclient list_commands で全てのパラメータを確認してください

間違ったパラメータをコマンドで使ってもエラーメッセージは表示されません。代わりにゼロ以外の返り値がきます。($SHELL プロンプトの設定で) コマンドの返り値を表示しないようにしている場合、echo $? で最後に実行したコマンドの返り値を確認できます。

スクリプトとフック

herbstluftwm を制御するときは herbstclient のコマンドを使うのがメインになりますが、herbstclient はどんなスクリプトからも呼び出せるので、スクリプトを使うことで柔軟に herbstluftwm を制御することが可能です。さらに、ウィンドウ管理のイベントに反応して制御を行うこともできます。

次の empty タグに切り替えるスクリプト

以下の Ruby スクリプトを使うことで (次あるいは前の full または empty) タグを切り替えることができます。(+1 または -1) と (full または empty) の引数を付けて実行してください。例えば、スクリプトを herbst-move.rb と保存した場合、次のコマンドを実行することで次の full タグに移動します:

$ ruby herbst-move.rb +1 full

キーバインドでスクリプトを呼び出すこともできます:

hc keybind $Mod-Left  spawn ruby /home/carl/Ruby/herbst-move.rb -1 empty
hc keybind $Mod-Right spawn ruby /home/carl/herbst-move.rb +1 empty
hc keybind $Mod-Up spawn ruby /home/carl/Ruby/herbst-move.rb -1 full
hc keybind $Mod-Down spawn ruby /home/carl/Ruby/herbst-move.rb +1 full

以下がそのスクリプトです:

#!/usr/local/bin/ruby

incr, type = ARGV

d = incr.to_i
if type == 'full'
  ch = '.'
else
  ch = ':'
end

array = `herbstclient tag_status 0`.scan(/[:\.\#][^\t]*/)
len = array.length
orig = array.find_index{|e| e[0] == '#'}

i = (orig+d) % len
while 
  array[i][0] == ch
  i = (i+d) % len
end

if i != orig
  system "herbstclient use_index #{i}"
end

内側の余白 (などの設定) を変更するスクリプト

以下は内側の余白を切り替える Ruby スクリプトです。他の設定を変更するように作り変えることもできます。/tmp にダミーファイルを作ることで現在のレイアウトを確認しています。

#!/usr/bin/ruby

file1 = "/tmp/herbst-padding-1"
file2 = "/tmp/herbst-padding-2"

pad1 = 'pad 0 0 0 0 0'
pad2 = 'pad 0 0 20 0 200'
pad3 = 'pad 0 0 0 0 150'

files = [file1, file2].map{|f| File.exist? File.expand_path(f)}

if files == [false, false]  # 0 files
  system "herbstclient #{pad2}"
  system "touch #{file1}"
elsif files == [true, false]  # 1 file
  system "herbstclient #{pad1}"
  system "touch #{file2}"
else           # 2 files
  system "herbstclient #{pad3}"
  system "rm #{file1} #{file2}"
end

タグごとに装飾を変更するスクリプト

以下の Perl スクリプトではフックを使うことでウィンドウ管理のイベントに反応します。(バックグラウンドで) 自動実行することが可能です。

#!/usr/bin/perl
# This script watches for tag changes and gives visual feedback

## Configuration (fill with your tag names)
my %colors = (
	main => '#DD0000',
	devel => '#13B8E0',
	write => '#96E013',
	admin => '#C713E0'
);

## Apply tag color
# Right now we change the active window's border color to the tag's color.
sub redecorate
{
	my ($foo, $activity) = @_;
	system("herbstclient", "set", "window_border_active_color",
		"$colors{$activity}");
}

## main routine
use v5.20;

# set up a pipe for reading hooks
open HOOKS, "herbstclient -i '(tag_changed|reload)'|"
	or die "can't fork: $!";
# process incoming messages
OUTER:
while (<HOOKS>) {
	chomp;
	for ($_) {
		redecorate(split(/\t/)) when /^tag_changed/;
		last OUTER when /^reload/; # quit on reload
	}
}
close HOOKS or die "unfinished love story: $! $?"; # happens on hlwm crash

参照