xmonadを使ってみる。

xmonadっていうタイル型ウインドウマネージャを使ってみた。
設定ファイルがHaskellできれい。
他にもawesomeってのもあったが、luaって知らない言語だった。
まあ、Haskellもやったことないけど。
Ubuntuのバージョンは10.10。

インストール

インストールは

# apt-get install xmonad

これで、ログイン(gdm)のときに選択できるようになる。

ついでに

# apt-get install dwm-tools xmobar

もいれておきます。
dwm-toolsはdmenuのこと。

$ man xmonad

基本操作

最低必要な操作は、

mod-shift-q xmonadの終了
mod-shift-return terminalの起動

始めに使えると便利な操作は、

mod-shift-c ウインドウを閉じる
mod-{j,k,tab,shift-tab} 他のウインドウにフォーカスする
mod-{h,l} ウインドウの大きさを変える
mod-space ウインドウのレイアウトを変える
mod-[1..9] ワークスペースの移動
mod-p dmenuによるプログラムの起動
mod-q xmonadの再起動

mod-qは設定ファイルをいじるとき、とても便利。
これのおかげで設定はかなりスムーズ。
modキーはデフォルトでは左のAlt。

設定

設定ファイルは~/.xmonad/xmonad.hs。

注意! Haskellは勉強したことないので、ここから下はかなり憶測です。

基本設定

まず、/usr/share/doc/libghc6-xmonad-doc/examples/xmonad.hs.gzに
設定ファイルの例があるので、コピーしてくる。

$ cp /usr/share/doc/libghc6-xmonad-doc/examples/xmonad.hs.gz .
$ gunzip xmonad.hs.gz
$ mkdir ~/.xmonad
$ mv xmonad.hs ~/.xmonad/

このファイルは、基本的にはmy〜を定義していって
最後に

main = xmonad defaults

でdefaultsを実行。
defaultsっていうのはそのすぐ下で

defaults = defaultConfig {
      -- simple stuff
        terminal           = myTerminal,
        focusFollowsMouse  = myFocusFollowsMouse,
        borderWidth        = myBorderWidth,
        modMask            = myModMask,
        numlockMask        = myNumlockMask,
        workspaces         = myWorkspaces,
        normalBorderColor  = myNormalBorderColor,
        focusedBorderColor = myFocusedBorderColor,

      -- key bindings
        keys               = myKeys,
        mouseBindings      = myMouseBindings,

      -- hooks, layouts
        layoutHook         = myLayout,
        manageHook         = myManageHook,
        handleEventHook    = myEventHook,
        logHook            = myLogHook,
        startupHook        = myStartupHook
    }

と定義される。
なので、基本的にはmy〜の定義を変更するだけでかなり設定できる。

modキーとしてAltは使いたくないのでWindows(Super)に変更。

myModMask       = mod4Mask

terminalはgnome-terminalを使う。

myTerminal      = "gnome-terminal"

ワークスペース1,2に名前を付けてみる。

myWorkspaces = ["1:work","2:web"] ++ map show [3..9]

変更したら、mod+qで設定を反映する。
ダメなときはエラーが出る。

ごちゃごちゃしてるのはいやなので、いらないものを消してみる。
それでもうまく動いてくれるみたい。結局

--
-- .xmonad/xmonad.hs
--

-- インポート
import XMonad

------------------------------------------------------------------------
-- こまごました設定

-- ターミナルの指定
myTerminal      = "gnome-terminal"

-- modキーをWindowsに
myModMask       = mod4Mask

-- ワークスペース
myWorkspaces = ["1:work","2:web"] ++ map show [3..9]

------------------------------------------------------------------------
-- 設定の実行

-- 実行
main = xmonad myConfig

-- 設定(上書きしなければデフォルトの値が用いられる)
myConfig = defaultConfig {
        terminal           = myTerminal,
        modMask            = myModMask,
        workspaces         = myWorkspaces
    }

となる。

xmobarの設定

これだけだと味気ないので、時間や日付もわかるようにしたい。
また、ワークスペースも表示してくれるとうれしい。

これは最初にいれたxmobarで実現できる。

$ man xmobar

これを用いるとCPUやメモリ、ネットワーク、バッテリー、天気なども
表示してくれるようになる。
GNU Screenのステータスバーのようなもの。

設定ファイルは~/.xmobarrcだが、これも設定例があるのでコピーしてくる。

$ cp /usr/share/doc/xmobar/examples/xmobarrc-example ~/.xmobarrc

デフォルトではいろいろ表示されるようになっているが、
必要ないものは使わない主義なので、

--
-- .xmobarrc
--

Config { font = "xft:Sans-10:bold"
       , bgColor = "black"
       , fgColor = "grey"
       , position = Top
       , lowerOnStart = False
       , commands = [
                    Run Com "id" ["-un"] "uname" 36000
                    , Run Com "date"["+'%x(%a) %H:%M'"] "date" 10
                    , Run StdinReader
                    ]
       , sepChar = "%"
       , alignSep = "}{"
       , template = "%StdinReader% }{ <fc=#ee9a00>%date%</fc> %uname%"
       }

とした。
もっぱら変更するのはcommandsの中と、templateの指定。

dateはcommandsの中で何も指定しないと普通に日本語で秒まで表示してくれるが、
Run Dateで指定すると英語になってしまう。
秒まで表示するとチカチカしていやなので書式指定したかったが、
locale?を指定する方法がわからなかったので、
普通のdateコマンドからの標準出力を用いることにした。

なにかいい方法があったら教えてください。

最後に、xmonad.hsにxmobarの設定を加えて終わり。

--
-- .xmonad/xmonad.hs
--

-- インポート
import XMonad
import XMonad.Hooks.DynamicLog

------------------------------------------------------------------------
-- こまごました設定

-- ターミナルの指定
myTerminal      = "gnome-terminal"

-- modキーをWindowsに
myModMask       = mod4Mask

-- ワークスペース
myWorkspaces = ["1:work","2:web"] ++ map show [3..9]

------------------------------------------------------------------------
-- xmobarの設定

-- Command to launch the bar.
myBar = "xmobar"

-- 表示の指定
myPP = xmobarPP { ppCurrent = xmobarColor "#429942" "" . wrap "<" ">" }

-- Keybinding to toggle the gap for the bar.
toggleStrutsKey XConfig {XMonad.modMask = modMask} = (modMask, xK_b)

------------------------------------------------------------------------
-- 設定の実行

-- 実行
main = xmonad =<< statusBar myBar myPP toggleStrutsKey myConfig

-- 設定(上書きしなければデフォルトの値が用いられる)
myConfig = defaultConfig {
        terminal           = myTerminal,
        modMask            = myModMask,
        workspaces         = myWorkspaces
    }

参考

xmonad - ArchWiki
適度に短く要点がまとまっているので、設定のときにかなり参考になりました。