簡単なxmonadの設定

# 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 (多少インデント崩れ有り)
```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]
```