xmonadの設定

ほぼ意味がわからないまま四苦八苦して、なんとか使いやすい感じになったけど、メモしとかないと絶対に再現できないので自分用にメモ。

まずはインストール

sudo apt-get install xmonad xmobar

xmobarはなんかステータスバーみたいなやつ。デフォルトだとウィンドウ以外は表示されないけどとりあえず時計だけでも表示されて欲しいので導入。

それで、ホームフォルダ下の.xmonadフォルダのxmonad.hsに設定を書いていくわけだけど、わからないのでとりあえずm2ymさんのxmonad.hsをいただく。

https://gist.github.com/769071

よくわかんない部分が多いけどとりあえず

modm = mod4Mask

はsuperキーを修飾に使う的なことで、

borderWidth = 2
, normalBorderColor = "#99ccff"
             , focusedBorderColor = "#0033dd"

この辺はウィンドウ境界の線の太さとかいろとか。

`additionalKeys`
       [ ((modm, xK_f), sendMessage (Toggle FULL))
       , ((modm, xK_g), sendMessage ToggleGaps)
       , ((modm, xK_j), sendMessage MirrorShrink)
       , ((modm, xK_k), sendMessage MirrorExpand)
       , ((modm, xK_period), windows W.focusDown)
       , ((modm, xK_comma), windows W.focusUp)
       , ((modm .|. shiftMask, xK_period), windows W.swapDown)
       , ((modm .|. shiftMask, xK_comma), windows W.swapUp)
       , ((modm, xK_w), nextScreen) ]

は上から、
現在のウィンドウのフルスクリーン化したり戻したりのトグル、
ステータスバーを出したり消したり、
ウィンドウの上下の境界を下に、
ウィンドウの上下の境界を上に、
フォーカスを前のウィンドウに、
フォーカスを次のウィンドウに、
現在のウィンドウを前のウィンドウの位置と入れ替え、
現在のウィンドウを次のウィンドウの位置と入れ替え、
???

といった感じ。

wを押したときに何がおきてるのかわかんないっす。

`additionalKeys`
       [ ((modm, xK_a), runOrRaise "emacs" (className =? "Emacs"))
       , ((modm, xK_s), runOrRaise "gnome-terminal" (className =? "Gnome-terminal"))
       , ((modm, xK_d), runOrRaise "firefox" (className =? "Namoroka"))
       ]

この辺は、「もしEmacsが起動してなかったら起動、起動してたらそれにフォーカス」

みたいなやつ。

m2ymさんは端末はurxvt, ブラウザはChromeをつかってるみたいですが、僕はgnome-terminalとfirefoxなのでこんな感じになってます。(いつの間にかfirefoxがNamorokaって名前になっちゃってるんだけどこれはなんなんだろ?)

classNameの調べ方は、

http://watermans-linuxtips.blogspot.com/2009/02/window.html

にあるように

$ xprop | grep WM_CLASS

で調べられます。

xmonadをインストールした時点でログイン画面のセッションの選択のとこにxmonadがでるのでこれを選ぶとxmonadが起動できるようになるのですが、そのままだとちょっとこまったことになります。

gnomeがやってくれてたこと(音量調節ボタンとか)がいろいろ効かなくなっちゃうので、それらをちゃんとつかえるようにします。

これは、~/.xsessionってファイルに書きこんでいきます。

現時点での僕の.xsessionは

#!/bin/sh
xmodmap $HOME/.Xmodmap

$HOME/.dropbox-dist/dropboxd &
gnome-volume-control-applet &
stalonetray -i 1 --geometry 6x1-0-0 -bg white &

gnome-settings-daemon &
xcompmgr &

exec xmonad

こんな感じです。

xmodmapは変換キーをAltに、無変換キーをSuperにしてます。

んで、dropboxもつかうので、起動させています。

その次はボリュームコントロール用のアプリケーションの起動、

その次はgnomeだと右上らへんにあるシステムトレイがxmonadにはないのでその代わりになるやつです。

これは

sudo apt-get install stalonetray

しといてください。

次のgnome-settings-daemonは、もともとぼくはctrlとcapsの入れ替えをgnomeの設定の方でやってたので、その設定を適用してくれるやつっぽいです。

xcompmgrはemacsとかの半透明を有効にしてくれるやつです。

タイル型WMなので半透明にしても背景しか見えないのであんまり意味ないのですが気持ち的な問題でこれも付け足してます。

最後に、xmobarの設定です。

この設定は、~/.xmobarrcファイルに書いていくことになるのですが、ぐぐって見る限り大体みんな同じような設定をしているようなので、どれでも適当にもらってきてコピペしたらいいと思います。

そして、

main = xmonad $ defaultConfig
...

ってなってるとこを

main = do
  xmproc <- spawnPipe "xmobar"
  xmonad $ defaultConfig
...

にして、
最初の方に、

import XMonad.Util.Run(spawnPipe)

を足しといてください。

ただ、ひとつ僕がはまったのが、現在のワークスペースとフォーカスのあるウィンドウのタイトルを表示させる方法で、StdinReaderってやつらしいってのはすぐわかったのですが、表示させようとするとUpdating...とだけ表示されてうまくいきませんでした。

しらべてみたら、なんかlogHookとかいうのをいじんなきゃいけないみたいです。
http://web.archiveorange.com/archive/v/j8BnASHPs7ocYRzEB2yM

ということで、上記サイトにある通り、

myLogHook dest = dynamicLogWithPP defaultPP { ppOutput = hPutStrLn dest
                                            ,ppVisible = wrap "(" ")"
					    }                     

  xmonad $ defaultConfig
             { ...
             , logHook = myLogHook xmproc
	     }

と変更しておきます。

さらに、

import XMonad.Hooks.DynamicLog
import XMonad.Util.Run

も追加しておいてください。

あと、もしかしたら、

sudo apt-get install i3status

がいるかもしれませんが、いらないかもしれません。

まとめ
xmonad.hs

import qualified Data.Map as M

import XMonad
import qualified XMonad.StackSet as W

import XMonad.Actions.WindowGo
import XMonad.Actions.CycleWS
import XMonad.Hooks.ManageDocks
import XMonad.Hooks.EwmhDesktops
import XMonad.Hooks.DynamicLog
import XMonad.Layout
import XMonad.Layout.Gaps
import XMonad.Layout.ResizableTile
import XMonad.Layout.NoBorders
import XMonad.Layout.MultiToggle
import XMonad.Layout.MultiToggle.Instances
import XMonad.Util.EZConfig
import XMonad.Util.Run(spawnPipe)
import XMonad.Util.Run

tall = ResizableTall 1 (3/100) (1/2) []
layout = smartBorders $ mkToggle1 FULL $ gaps [(U,24)] $ tall ||| Mirror tall
works = map show [1..9]
modm = mod4Mask

myLogHook dest = dynamicLogWithPP defaultPP { ppOutput = hPutStrLn dest
                                              , ppVisible = wrap "(" ")"
                                            }

main = do
  xmproc <- spawnPipe "xmobar"
  xmonad $ defaultConfig
             { borderWidth = 2
             , terminal = "gnome-terminal"
             , normalBorderColor = "#99ccff"
             , focusedBorderColor = "#0033dd"
             , layoutHook = layout
             , manageHook = manageDocks <+> composeAll
                            [ className =? "MPlayer" --> doFloat,
                              className =? "Gimp"    --> doFloat,
                              title     =? "Speedbar" --> doFloat,
                              title     =? "Adobe Reader" --> doFloat]
             , logHook = myLogHook xmproc
             , workspaces = works
             , modMask = modm }
       `additionalKeys`
       [ ((modm, xK_f), sendMessage (Toggle FULL))
       , ((modm, xK_g), sendMessage ToggleGaps)
       , ((modm, xK_j), sendMessage MirrorShrink)
       , ((modm, xK_k), sendMessage MirrorExpand)
       , ((modm, xK_period), windows W.focusDown)
       , ((modm, xK_comma), windows W.focusUp)
       , ((modm .|. shiftMask, xK_period), windows W.swapDown)
       , ((modm .|. shiftMask, xK_comma), windows W.swapUp)
       , ((modm, xK_w), nextScreen) ]
       `additionalKeys`
       [ ((modm .|. m, k), windows $ f i)
         | (i, k) <- zip works
                     [ xK_exclam, xK_at, xK_numbersign
                     , xK_dollar, xK_percent, xK_asciicircum
                     , xK_ampersand, xK_asterisk, xK_parenleft
                     , xK_parenright
                     ]
       , (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)]
       ]
       `additionalKeys`
       [ ((modm, xK_a), runOrRaise "emacs" (className =? "Emacs"))
       , ((modm, xK_s), runOrRaise "gnome-terminal" (className =? "Gnome-terminal"))
       , ((modm, xK_d), runOrRaise "firefox" (className =? "Namoroka"))
       ]

.xmobarrc

Config { font = "xft:Sans-9:bold"
       , bgColor = "black"
       , fgColor = "grey"
       , position = Top
       , lowerOnStart = False
       , commands = [ Run Weather "EGPF" ["-t","<station>: <tempC>C","-L","18","-H","25","--normal","green","--high","red","--low","lightblue"] 36000
                    , Run Network "eth0" ["-L","0","-H","32","--normal","green","--high","red"] 10
                    , Run Network "eth1" ["-L","0","-H","32","--normal","green","--high","red"] 10
                    , Run Cpu ["-L","3","-H","50","--normal","green","--high","red"] 10
                    , Run Memory ["-t","Mem: <usedratio>%"] 10
                    , Run Swap [] 10
                    , Run Com "uname" ["-s","-r"] "" 36000
    		    , Run Date "%a %b %_d %Y %H:%M:%S" "date" 10
		    , Run StdinReader
                    ]
       , sepChar = "%"
       , alignSep = "}{"
       , template = "%cpu% | %memory% * %swap% | %eth0% - %eth1% } %StdinReader% { <fc=#ee9a00>%date%</fc>| %EGPF% | %uname%"
       }

.xsession

#!/bin/sh
xmodmap $HOME/.Xmodmap

$HOME/.dropbox-dist/dropboxd &
gnome-volume-control-applet &
stalonetray -i 1 --geometry 6x1-0-0 -bg white &

gnome-settings-daemon &
xcompmgr &

exec xmonad