Personal tools
You are here: Home ブログ matsuyama タイル型ウィンドウマネージャ Xmonad を使ってみた
Document Actions

タイル型ウィンドウマネージャ Xmonad を使ってみた

matsuu 氏の日記(*)から知って前々から試してみようと思ってた Xmonad を実際に試してみました。

(*) http://d.hatena.ne.jp/tmatsuu/20070610

Xmonad はタイル型のウィンドウマネージャで主にキーボードでウィンドウを重視したウィンドウマネージャです。実際に動かしているスクリーンショットや簡単な操作方法は公式ページ(*)から見れます。

(*) http://xmonad.org/

Gentoo にインストールする

他ディストリは完全に無視して話をすすめます。

まず、 Xmonad を正しく動かすためには以下の一覧を /etc/portage/package.keywords に加える必要があります。

dev-haskell/regex-base
dev-haskell/regex-compat
dev-haskell/regex-posix
dev-haskell/filepath
dev-haskell/mtl
dev-haskell/quickcheck
dev-haskell/html
x11-wm/xmonad
dev-util/darcs
dev-haskell/x11-extras
dev-haskell/x11
# missing keyword on amd64
x11-misc/dzen **

Xmonad のコンフィグは Config.hs を編集して再コンパイルしてねという粗末なものなので(もちろんこのおかげで短いコードが実現してる)、 Gentoo 側で便利に設定を変更できるようにするのが savedconfig です。 extensions はよくわかりません。

早速インストールしたいところですが、まず haskell overlay をフェッチしてくる必要があります。また haskell overlay は darcs を使っているのでそれもインストールする必要があります。

% emerge darcs layman
% layman -L
% layman -a haskell
% layman -S

これでインストールできます。

% emerge xmonad dzen dmenu

System Message: INFO/1 (<string>, line 50)

Possible title underline, too short for the title. Treating it as ordinary text because it's so short.

インストールが完了したら次のコマンドも実行しておきましょう。

% echo 'x11-wm/xmonad extensions savedconfig' >> /etc/portage/package.use

Xmonad の設定

savedconfig を使っているのでソースから Config.hs を取りだして変更する必要はありません。かわりに /etc/portage/savedconfig/x11-wm/xmonad-0.3 を編集します。中身は Haskell プログラムなのですが、おそらく普通に書けると思います。デフォルトのままでも十分つかえるのですが、いじるのが趣味な僕は以下のような変更を施しました。やっていることは以下のことです。

  • mod キーを Left Alt から Super に変える(じゃないと Emacs のバインドとかぶりまくる)
  • スクリーンの上部に余白を作る(dzenのため。後で説明)
  • フォーカスウィンドウのボーダーを青っぽい色に
  • フォーカスウィンドウのボーダーの太さを 3 ピクセルに(デフォルトだと細すぎて見えない)
  • mod-j => mod-period (Emacs の C-.other-window なので)
  • mod-k => mod-comma (Emacs の C-,other-window -1 なので)
  • その他
--- /etc/portage/savedconfig/x11-wm/xmonad-0.3.orig    2007-09-10 00:46:52.000000000 +0900
+++ /etc/portage/savedconfig/x11-wm/xmonad-0.3 2007-09-10 01:39:40.000000000 +0900
@@ -42,7 +42,7 @@
 -- key" is usually mod4Mask.
 --
 modMask :: KeyMask
-modMask = mod1Mask
+modMask = mod4Mask
 
 -- |
 -- Default offset of drawable screen boundaries from each physical screen.
@@ -58,7 +58,7 @@
 -- Fields are: top, bottom, left, right.
 --
 defaultGaps :: [(Int,Int,Int,Int)]
-defaultGaps = [(0,0,0,0)] -- 15 for default dzen
+defaultGaps = [(18,0,0,0)] -- 15 for default dzen
 
 -- |
 -- numlock handling:
@@ -79,13 +79,13 @@
 --
 normalBorderColor, focusedBorderColor :: String
 normalBorderColor  = "#dddddd"
-focusedBorderColor = "#ff0000"
+focusedBorderColor = "#0033dd"
 
 -- |
 -- Width of the window border in pixels
 --
 borderWidth :: Dimension
-borderWidth = 1
+borderWidth = 3
 
 -- |
 -- The default set of tiling algorithms
@@ -134,13 +134,13 @@
 
     -- move focus up or down the window stack
     , ((modMask,               xK_Tab   ), focusDown) -- @@ Move focus to the next window
-    , ((modMask,               xK_j     ), focusDown) -- @@ Move focus to the next window
-    , ((modMask,               xK_k     ), focusUp  ) -- @@ Move focus to the previous window
+    , ((modMask,               xK_period), focusDown) -- @@ Move focus to the next window
+    , ((modMask,               xK_comma ), focusUp  ) -- @@ Move focus to the previous window
 
     -- modifying the window order
     , ((modMask,               xK_Return), swapMaster) -- @@ Swap the focused window and the master window
-    , ((modMask .|. shiftMask, xK_j     ), swapDown  ) -- @@ Swap the focused window with the next window
-    , ((modMask .|. shiftMask, xK_k     ), swapUp    ) -- @@ Swap the focused window with the previous window
+    , ((modMask .|. shiftMask, xK_period), swapDown  ) -- @@ Swap the focused window with the next window
+    , ((modMask .|. shiftMask, xK_comma ), swapUp    ) -- @@ Swap the focused window with the previous window
 
     -- resizing the master/slave ratio
     , ((modMask,               xK_h     ), sendMessage Shrink) -- @@ Shrink the master area
@@ -149,8 +149,8 @@
     , ((modMask,               xK_t     ), withFocused sink) -- @@ Push window back into tiling
 
     -- increase or decrease number of windows in the master area
-    , ((modMask              , xK_comma ), sendMessage (IncMasterN 1)) -- @@ Increment the number of windows in the master area
-    , ((modMask              , xK_period), sendMessage (IncMasterN (-1))) -- @@ Deincrement the number of windows in the master area
+    , ((modMask              , xK_j     ), sendMessage (IncMasterN 1)) -- @@ Increment the number of windows in the master area
+    , ((modMask              , xK_k     ), sendMessage (IncMasterN (-1))) -- @@ Deincrement the number of windows in the master area
 
     -- toggle the status bar gap
     , ((modMask              , xK_b     ), modifyGap (\i n -> let x = (defaultGaps ++ repeat (0,0,0,0)) !! i in if n == x then (0,0,0,0) else x)) -- @@ Toggle the status bar gap

保存したら再び

% emerge xmonad

してください。これによって変更した設定が適用されるようになります。

Xmonad の起動

まず Xmonad の起動スクリプトを書きます。

~/.xsession:

source ~/.xprofile
~/bin/status | dzen2 -ta r -fg '#a8a3f7' -bg '#3f3c6d' &
uim-xim &
urxvt -e screen -R &
exec xmonad

% chmod +x ~/.xsession

これでカスタムセッションで起動すれば urxvt が立ちあがった状態で Xmonad が使えるようになります。

基本的な操作方法は後で説明することにして、 dzen についても説明しておきます。 dzen はステータスパネル機能で、 stdin から流れてくるデータを表示することができます。ちょうど screen の hardstatusline に近い感じです。 ~/bin/status が独自のプログラムで以下のようになっています。

~/bin/status:

#!/bin/sh
while true ; do
    LC_ALL=C date=`date`
    uptime=`uptime | sed 's/.*://; s/,//g'`
    nowplaying=`cat ~/tmp/nowplaying`
    printf "%s |%s | %s\n" "$date" "$uptime" "$nowplaying"
    sleep 10
done

10 秒ごとに現在の時間とロードアベレージ、現在再生中の曲名を表示します。今のところ余白がかなりあるので、どんどん情報を詰めこんでいきたいと思っています。

Xmonad の基本的な使いかた

詳しくは公式ページを見てもらうとしてここでは Xmonad を起動してからどうするかを簡単に説明したいと思います。ちなみに mod-j は Config.hs で設定した mod キー + J を意味します。僕の設定の場合だと Super + J です。

まず、始めに起動した状態だと urxvt がフルスクリーンで鎮座していると思います。そこにおもむろに firefox と打ちこんでみましょう。すると Firefox が起動して、画面が二分割されると思います(tall mode)。

mod-jmod-k でフォカースウィンドウを変更してみましょう。フォーカスされたウィンドウはキーボード入力を受けつけるようになります。 mod-hmod-l で表示幅を変更することができます。また、 mod-enter により、フォーカスウィンドウをマスターと入れかえることができます(マスターは一番使いやすい位置と大きさになると考えて問題ありません)。ウィンドウの順序を入れかえるには mod-shift-jmod-shift-k を使います。ウィンドウを閉じるには mod-shift-c です。

Xmonad のすごいところはワークスペースを使えるところです(しかも Xinerama に対応しているので、デュアルディスプレイでも使うことができます)。 mod-N で N 番目のワークスペースを表示します。 mod-shift-N でフォーカスウィンドウを N 番目のワークスペースに送ることができます。

これらすべての操作がキーボードで完結するのです。素晴しいです。

ちなみに firefox などのプログラムを起動する際はターミナルで起動するより dmenu というコマンド指向ランチャを使うほうが楽です。 dmenu を起動するには mod-p を押します。上のほうに実行可能ファイル一覧が出るので firefox と入力して Enter を押すと Firefox が起動します。インクリメンタル補完でなかなか便利です。キャンセルする場合は Escape です。

Vimperator と併用

Xmonad をインストールしたのでついでに Vimperator (*) もインストールしてみました。結果からいうと、この便利さは凶悪です。一度使いだすとやめられない中毒性があります。まあ、まだ全然慣れていませんが。

(*) http://vimperator.mozdev.org/

xmonad

Category(s)
linux
The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/matsuyama/xmonad/tbping

Re:タイル型ウィンドウマネージャ Xmonad を使ってみた

Posted by matsuu at 2007-09-10 09:20
良いっすよねーxmonad。xmonad-0.3でXinerama周りの問題も修正され、(私にとっては)完璧なウィンドウマネージャになりました。
今、dzenでuimやscimのステータス表示を実装しようと四苦八苦中です。C(C++)は苦手なもんで...。
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)
(Required)
(Required)
This helps us prevent automated spamming.
Captcha Image


Copyright(C) 2001 - 2006 Ariel Networks, Inc. All rights reserved.