タイル型ウィンドウマネージャ Xmonad を使ってみた
matsuu 氏の日記(*)から知って前々から試してみようと思ってた Xmonad を実際に試してみました。
(*) http://d.hatena.ne.jp/tmatsuu/20070610
Xmonad はタイル型のウィンドウマネージャで主にキーボードでウィンドウを重視したウィンドウマネージャです。実際に動かしているスクリーンショットや簡単な操作方法は公式ページ(*)から見れます。
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
インストールが完了したら次のコマンドも実行しておきましょう。
% 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-j と mod-k でフォカースウィンドウを変更してみましょう。フォーカスされたウィンドウはキーボード入力を受けつけるようになります。 mod-h と mod-l で表示幅を変更することができます。また、 mod-enter により、フォーカスウィンドウをマスターと入れかえることができます(マスターは一番使いやすい位置と大きさになると考えて問題ありません)。ウィンドウの順序を入れかえるには mod-shift-j と mod-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 (*) もインストールしてみました。結果からいうと、この便利さは凶悪です。一度使いだすとやめられない中毒性があります。まあ、まだ全然慣れていませんが。
- Category(s)
- linux
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/matsuyama/xmonad/tbping
Re:タイル型ウィンドウマネージャ Xmonad を使ってみた
今、dzenでuimやscimのステータス表示を実装しようと四苦八苦中です。C(C++)は苦手なもんで...。