Linuxを日常的に使う実験ブログ

タイル型ウィンドウマネージャXmonadを使う(カスタム編)

 2019-07-18

 2019-07-18

 Linux全般

こんにちは。今回のテーマは「タイル型ウィンドウマネージャXmonadを使う(カスタム編)」です。Xmonadは筆者が現在気に入って使っているデスクトップ環境です。基本的な使い方はタイル型ウィンドウマネージャXmonadを使う(基礎編)で紹介しましたので、今回はカスタマイズの方法をご紹介します。カスタマイズとしてはまだまだだとお叱りを受けそうですが、今回紹介した設定をベースにご自身で使いやすいようにカスタマイズしていただければと思います。 [adsense02] 【目次】 カスタマイズ例 xmonad.hsを編集したら必ず再コンパイルを xmonad.hsの設定例 xmonad.hsの簡単な解説 xmobarの設定 .xmobarrcの簡単な解説

カスタマイズ例

今回紹介する設定でコンパイルしたXmonadの画面です。年季の入ったXmonadユーザーですともっとカスタマイズしてると思いますが、シンプルなのが好みなので割と気に入っています。今回はよく使うであろう機能を中心に紹介できればと思います。

xmonad.hsを編集したら必ず再コンパイルを

xmonad.hsを編集した場合は必ず再コンパイルすることを忘れないようにしてください。設定が反映されません。

xmonad.hsの設定例

まずは設定ファイルを全て見ていただいた方が理解がしやすいかと思います。 ~/.xmonad/xmonad.hs


import XMonad
import XMonad.Hooks.ManageDocks
import XMonad.Hooks.DynamicLog
-- import XMonad.Util.Run(spawnPipe)
import XMonad.Util.EZConfig(additionalKeysP)
import XMonad.Layout.Spacing
import XMonad.Layout.ResizableTile

-- main関数
main :: IO()
main = do
    config <- statusBar myBar myPP toggleStrutsKey myConfig
    xmonad config
    -- 以下の書き方も紹介されていますが、いずれでもOKです。
    -- xmonad =<< statusBar myBar myPP toggleStrutsKey myConfig
    -- statusBar myBar myPP toggleStrutsKey myConfig =>> xmonad

-- 基本設定
myConfig = defaultConfig
    { layoutHook = myLayout
    , manageHook = manageHook defaultConfig <+> manageDocks <+> myManageHookFloat
    , startupHook = myStartupHook
    , terminal = myTerminal
    , focusedBorderColor = cBlue
    , normalBorderColor = cGrey
    , borderWidth = myBorderWidth
    , workspaces = myWorkspaces
    -- , modMask = mod4Mask -- MODキーを標準のAlt -> Winに変更する場合は有効にする
    } `additionalKeysP` myKeys

-- xmonad起動時に起動したいコマンドを記載
myStartupHook = do
    -- 壁紙用
    spawn "feh --bg-scale ~/Pictures/Wallpapers/arch-linux.png"
    -- xterm透過させるため
    spawn "xcompmgr"
    -- 以下、起動したいプログラムがあれば追加する

-- 端末設定
myTerminal = "xterm"

-- 枠線の太さ
myBorderWidth = 1

-- ワークスペース
-- デフォルトではワークスペースは9個まで
myWorkspaces = [" 1 ", " 2 ", " 3 ", " 4 "]

-- レイアウト設定
myLayout = avoidStruts $ smartSpacing sp (Mirror (tall) ||| tall) ||| Full
    where
        tall = ResizableTall 1 (0.03) (0.7) []
        sp = 6 -- ウィンドウ間の隙間

-- 配色設定
bgColor = "#363434"
cBlue = "#4287f5"
cRed = "#f54272"
cGreen = "#42f599"
cYellow = "#f5d142"
cPink = "#f542bf"
cOrange = "#f58a42"
cGrey = "#c2c2c2"
cDarkGrey = "#787576"

-- キーマップ設定
-- additionalKeysPスタイルで記述
-- additionalKeysスタイルとは異なるため注意
myKeys = 
    -- for launching applications
    [ ("M-", spawn "xfce4-appfinder")
    , ("M-S-b", spawn "firefox")
    , ("M-C-t", spawn "xterm")
    -- for screen shot
    , ("", spawn "import -window root ~/Pictures/$(date '+%Y%m%d-%H%M%S').png")
    , ("M-", spawn "xfce4-screenshooter")
    -- for ResizableTall Layout
    , ("M-a", sendMessage MirrorShrink)
    , ("M-z", sendMessage MirrorExpand)
    ]

-- フロート表示したいアプリケーションを登録
myManageHookFloat = composeAll
    [ className =? "Xfce4-appfinder" --> doFloat
    , className =? "Gimp" --> doFloat
    ]

-- Xmonadの設定
-- Xmobarの詳細設定は.xmobarrcに記載
myBar = "xmobar"
myPP = xmobarPP { ppCurrent = xmobarColor "#000000" cOrange
                , ppHidden = xmobarColor cPink "black"
                , ppHiddenNoWindows = xmobarColor cDarkGrey "black"
                , ppTitle = xmobarColor cRed "" . shorten 50
                , ppWsSep = " "
                , ppSep = ":"
                , ppOrder = \(ws:l:t:_) -> [ws, shorten 10 l, t]
                }

-- バーの隙間を切り替えるキー設定
toggleStrutsKey XConfig {XMonad.modMask = modMask} = (modMask, xK_b)

xmonad.hsの簡単な解説

全体の構成

設定ファイル自体がHaskellプログラムなのでmain関数の構成という意味になってしまうのですが、statusBar関数でコンフィグを生成し、そのコンフィグをxmonad関数の引数とすることで設定を反映しています。 このstatusBar関数は新たに追加された関数ですので古い設定例では使われていないことが多いのですが、xmobarを利用する場合は積極的に利用していくと設定ファイルがスッキリすると思います。

レイアウト設定

レイアウトに関してはXMonad.Layoutが参考になると思いますが、基本的な考え方は使用したいレイアウトを|||関数で結合していきます。結合した順番にMod-spaceで切替可能となります。今回は通常のTallレイアウトではなくResizableTallを使用しています。ResizableTallは縦横両方のサイズ変更が可能なレウアウトです。このため後述するキーマップにもウィンドウサイズ拡縮小用のキー設定しています。ResizableTallに関してはXMonad.Layout.ResizableTileをご覧いただくのは早いかと思います。ウィンドウ間のスペースにはsmartSpacingを用いています。smartSpacingは単一ウィンドウの場合にはスペースをゼロにして表示してくれるスグレモノです。

キーマップ設定

キーマップはmyKeysで設定しています。ここで設定したmyKeysはmyConfigに対してadditionalKeysP関数で結合していますので書き方もadditionalKeysPスタイルにしています。一方additionalKeys関数もあり、こちらを用いる場合はmyKeysの書き方も変更する必要があります。筆者はadditionalKeysPの書き方の方が好みです。詳細はXMonad.Util.EZConfigを参考にされると宜しいかと。 フロート表示するアプリケーションの設定 フロート表示とはタイル式表示制約を離れて画面上の好きな位置に配置できる(浮いた状態)ことです。アプリの性質上フロート表示の方が望ましいものありますので、その場合はここに登録しておきます。例に従って配列に加えればOKです。

Xmobarの設定

xmobarの表示内容やフォントや色などは後述する~/.xmobarrcファイルで設定するのですが、StdinReaderという標準的な機能のカスタマイズはmyPPで設定しています。myPPはxmobarPPをオーバーライドしたものです。ここでワークスペースの表示方法やタイトル文字の色などを設定します。設定項目についてはXMonad.Hooks.DynamicLogを参考にして下さい。

xmobarの設定

xmobarの設定については~/.xmobarrcにて行います。前回の記事では簡単なフォントの設定をしただけでしたが今回はConfigの中身を充実させていきます。 今回の設定例は以下のようになります。基本的にはArch Wikiの設定をベースにしています。 .xmobarrc


-- vim: ft=haskell
Config { font = "xft:VL Gothic:size=12"
       , bgColor = "#363434"
       , fgColor = "#787576"
       , position = TopSize C 100 33
       -- , position = Static { xpos = 37 , ypos = 0, width = 1845, height = 18 }
       , hideOnStart = True
       , lowerOnStart = True
       , overrideRedirect = False
       , border = BottomBM 0
       , borderColor = "#4e4e4e"
       , commands =
               [
               -- network activity monitor (dynamic interface resolution)
               Run DynNetwork       [ "--template" , "↓kB/s ↑kB/s"
                                    , "--Low"      , "1000"       -- units: kB/s
                                    , "--High"     , "5000"       -- units: kB/s
                                    , "--low"      , "#42f599"
                                    , "--normal"   , "#f58a42"
                                    , "--high"     , "#f54272"
                                    ] 10

               -- cpu activity monitor
               , Run MultiCpu       [ "--template" , "CPU:%-%-%-%"
                                    , "--Low"      , "50"         -- units: %
                                    , "--High"     , "85"         -- units: %
                                    , "--low"      , "#42f599"
                                    , "--normal"   , "#f58a42"
                                    , "--high"     , "#f54272"
                                    ] 10

               -- cpu core temperature monitor
               , Run CoreTemp       [ "--template" , "Temp: °C|°C"
                                    , "--Low"      , "70"        -- units: °C
                                    , "--High"     , "80"        -- units: °C
                                    , "--low"      , "#42f599"
                                    , "--normal"   , "#f58a42"
                                    , "--high"     , "#f54272"
                                    ] 50

               -- memory usage monitor
               , Run Memory         [ "--template" ,"MEM:%"
                                    , "--Low"      , "20"        -- units: %
                                    , "--High"     , "90"        -- units: %
                                    , "--low"      , "#42f599"
                                    , "--normal"   , "#f58a42"
                                    , "--high"     , "#f54272"
                                    ] 10

               -- battery monitor
               , Run Battery        [ "--template" , "BAT:"
                                    , "--Low"      , "10"        -- units: %
                                    , "--High"     , "80"        -- units: %
                                    , "--low"      , "#42f599"
                                    , "--normal"   , "#f58a42"
                                    , "--high"     , "#f54272"

                                    , "--" -- battery specific options
                                              -- discharging status
                                              , "-o"	, "% ()"
                                              -- AC "on" status
                                              , "-O"	, "%"
                                              -- charged status
                                              , "-i"	, "%"
                                    ] 50

               -- time and date indicator 
               --   (%F = y-m-d date, %a = day of week, %T = h:m:s time)
               , Run Date           "[%a] %m/%d %H:%M" "date" 10

               -- keyboard layout indicator
               , Run Kbd            [ ("us(dvorak)" , "DV")
                                    , ("us"         , "US")
                                    ]
               , Run StdinReader
               ]
       , sepChar = "%"
       , alignSep = "}{"
       , template = " %StdinReader% }{ %dynnetwork% %multicpu% %memory% %battery% %date% "
       }

-- 配色設定
-- bgColor = "#363434"
-- cBlue = "#4287f5"
-- cRed = "#f54272"
-- cGreen = "#42f599"
-- cYellow = "#f5d142"
-- cPink = "#f542bf"
-- cOrange = "#f58a42"
-- cGrey = "#c2c2c2"
-- cDarkGrey = "#787576"

.xmobarrcの簡単な解説

各設定項目について

各設定項目の詳細についてはxmobarに説明があります。詳しく知りたい方はご覧ください。

出力項目について

xmobarのに表示させたい項目と順番はtemplateで設定します。StdinReaderはXmobarの標準的な出力内容でワークスペース、配置アルゴリズム名、ウィンドウタイトルがあります。StdinReaderの設定に関してはxmonad.hsで設定しなければならず、ここの部分がちょっと分かりづらいですね。表示させたい項目はcommandsの中でRunさせる必要があります。この際に表示方法や出力の色などを設定しておきます。

表示フォントについて

fontの設定ですが、xftフォントを使用するためにはxmobarのコンパイル時にxftオプションが有効になっている必要があります。多くのディストリビューションでは問題ないと思いますが、GentooではUSEフラグにxftが入っているか確認をお願いします。xftフォントを使用する際には例のようにxftと記載します。

最後に

基礎編に引き続きカスタム編をお送りしました。これで実際Xmonadをデスクトップ環境で使用する準備は整ったと思います。あとは適宜自分が使いやすいようにキーマップを登録したり、レイアウトを調整したりして行ってください。それでは楽しいLinuxライフを。 この記事がお役に立てば幸いです。 【関連記事】 [adsense]