Haskellは分からなくてOK
VimやEmacs使いは多いけど、必ずしもその設定ファイルを書くのに
vimScriptやElipsを覚えて無くてもある程度は何とかなる。
それと同様に、Haskellが分からなくても ~/.xmonad/xmonad.hs に書くことができるようだ。
xmonadの設定ファイル xmonad.hs を書くのに便利な法則
コメント
-- <== "--"以降はコメントとして扱われる
xmonadの基本形
main = do
xmonad $ defaultConfig
{
...
}
この{}の中に色々詰め込んでいくのが基本の形になる。
terminal = myTerminal
の様にしているのは保守性を高めるため。
{}内はどんな種類のものを設定するか宣言していく方が、
全体の見通しが良く管理しやすい。
私のxmonad.hsは一番下に紹介している。
モジュールの使い方
xmonadを簡単に、そして強力に拡張してくれるのがモジュールだ。
手っ取り早くxmonadを調整するには、これがとても便利だ。
モジュール辞書としてはここが便利。
http://xmonad.org/xmonad-docs/xmonad-contrib/
例えば、XMonad.Layout.ResizableTile を見てみる。
http://xmonad.org/xmonad-docs/xmonad-contrib/XMonad-Layout-ResizableTile.html
import の所は上で宣言し、
main = xmonad defaultConfig { layoutHook = myLayout }
は上で述べた可視性を高める宣言方法。レイアウトはこのlayoutHookに書く。
myLayout に、
ResizableTall 1 (3/100) (1/2) []
を入れればOK。|||は"または"の並列を意味する。
, ((modm, xK_a), sendMessage MirrorShrink)
は水平の分割線を上下に動かすキーバインド設定だ。
後で紹介するxmonad.hsではSuperキーであるM4、Altを意味するM1などで設定している。
modm, xK_a などは独特で使いづらいが、これなら大丈夫だ。
空白や改行などによる整形
特に空白や改行したからといってエラーになることは無いようです。
見やすくするためにどんどん打ち込んでいきましょう。
コマンドの実行のspawn
bashなどでfirefoxと打つと、ブラウザが立ち上がってくれますが
これと同じ事ができるのがspawn。
, ("M4-w", spawn "firefox")
の部分は、Superキーと'w'を押すと、ウェブブラウザが立ち上がります。
これを使って、ソフトのホットキーやスタートアップの時のソフトを設定できます。
複数を追記する時のdo
myStartupHook = A
myStartupHook = B
このように書くと、myStartupHookの二重宣言でエラーになります。
myStartupHook = do
A
B
と書けばエラーを回避できます。
Haskellがわからないで書いた xmonad.hs (多少インデント崩れ有り)
-- Modules
import XMonad
import XMonad.Layout
import XMonad.Layout.IM
import XMonad.Layout.Named
import XMonad.Layout.Tabbed
import XMonad.Layout.Spacing -- this makes smart space around windows
import XMonad.Util.EZConfig -- removeKeys, additionalKeys
import XMonad.Util.Run(spawnPipe) -- spawnPipe, hPutStrLn
import XMonad.Layout.Magnifier -- this makes window bigger
import XMonad.Layout.ResizableTile -- Resizable Horizontal border
import XMonad.Layout.ThreeColumns -- for many windows
import Control.Monad (liftM2) -- myManageHookShift
import qualified XMonad.StackSet as W -- myManageHookShift
import System.IO -- for xmobar
import XMonad.Hooks.DynamicLog -- for xmobar
import XMonad.Hooks.ManageDocks -- avoid xmobar area
import XMonad.Layout.DragPane -- see only two window
import XMonad.Layout.ToggleLayouts -- Full window at any time
import XMonad.Layout.NoBorders -- In Full mode, border is no use
-- Main
main :: IO ()
main = do
xmproc <- spawnPipe "xmobar" -- call xmobar
xmonad $ defaultConfig
{ terminal = myTerminal
, modMask = myModMask
, borderWidth = myBorderWidth
, normalBorderColor = "#5a908e"
, focusedBorderColor = "#99cb81"
, startupHook = myStartupHook
, manageHook = myManageHookShift <+> myManageHookFloat <+> manageDocks
-- any time Full mode, avoid xmobar area
, layoutHook = toggleLayouts (noBorders Full) $ avoidStruts $ myLayout
-- xmobar setting
, logHook = dynamicLogWithPP $ xmobarPP
{ ppOutput = hPutStrLn xmproc
, ppTitle = xmobarColor "green" "" . shorten 50
}
}
`additionalKeysP`
-- start software
[ ("M4-g", spawn "gwenview")
, ("M4-w", spawn "firefox")
-- handle window size
, ("M4--", sendMessage MagnifyLess) -- smaller window
, ("M4-M1--", sendMessage MagnifyMore) -- bigger window
, ("M4-M1-h", sendMessage MirrorShrink) -- border go down
, ("M4-M1-l", sendMessage MirrorExpand) -- border go up
, ("M4-f", sendMessage ToggleLayout) -- toggle Full layout, any time
]
myTerminal = "urxvt" -- light weight terminal
myModMask = mod4Mask -- Super_L
myBorderWidth = 2
-- Handle Window behaveior
myLayout = (spacing 4 $ ResizableTall 1 (3/100) (1/2) [])
||| (magnifiercz 1.2 (ThreeCol 1 (3/100) (1/2)))
||| (spacing 2 $
(dragPane Horizontal (1/10) (1/2)) ||| (dragPane Vertical (1/10) (1/2))
)
-- Start up (at xmonad beggining), like "wallpaper" or so on
myStartupHook = do
spawn "feh --bg-fill ~/Pictures/wallpaper/WoodHouse.jpg"
spawn "compton --config ~/.config/compton.conf"
-- some window must created there
myManageHookShift = composeAll
-- if you want to know className, type "$ xprop|grep CLASS" on shell
[ className =? "Firefox" --> viewShift "3"
, className =? "Opera" --> viewShift "3"
]
where viewShift = doF . liftM2 (.) W.view W.shift
-- new window will created in Float mode
myManageHookFloat = composeAll
[ className =? "MPlayer" --> doFloat
, className =? "Gimp" --> doFloat]