LoginSignup
20
18

More than 5 years have passed since last update.

簡単なxmonadの設定

Posted at

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

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]
20
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
18