temp_la :: Memo

https://twitter.com/temp_la

xmonadだよ

デスクトップ環境をxmonadにした。

理由はかっこいいから。名前からしてかっこいい。

スクリーンショット見ても、そのかっこよさが分かる。

www.deviantart.com

 

見た目だけでなく機能も充実、拡張性も高い。公式サイトには以下のように書かれている。これらのワードを見て脳から何かしら汁が出る人は一度は試すべきである。

xmonad is tiling.
xmonad is minimal.
xmonad is stable.
xmonad is extensible.
xmonad is featureful.
xmonad is easy.
xmonad is friendly.

xmonad | the tiling window manager that rocks

 

とりあえず、設定ファイルは下のサイトからダウンロードできる。

Xmonad/Config archive - HaskellWiki

なるべくノーマルな設定がいいので、download the latest darcs template xmonad.hs と書かれているリンクからダウンロードした。

これを自分好みの設定に変えていく。

-- 好きな端末に変える。
myTerminal      = "urxvt"

-- これがTrueだとマウスオーバーしただけで、フォーカスする。
myFocusFollowsMouse = False

-- ウィンドウのボーターの幅。
myBorderWidth   = 2

-- MODキーをWinキーに設定する。デフォルトはAltだったかな。
myModMask       = mod4Mask

ショートカットキーを変える。 

File:Xmbindings.png - HaskellWiki

例えば、デフォルトだとMod + (Sfhit) + qに再起動と終了コマンドが割り当てられていて、かなりの頻度で押し間違えるので、エスケープキーとかに変える。

, ((modm .|. shiftMask, xK_Escape     ), io (exitWith ExitSuccess))

レイアウトの設定。

xmonadにした理由の一つでもあるウィンドウ間のスペース設定。10ピクセルとかに設定する。(ググる限りではawesomeとかではできないみたい?)

xmobar(ステータスバー)を使うのでavoidStrutsも追加してる。後はrenamedでxmobarに表示されるレイアウトの名前を変えている。

myLayout = avoidStruts standardLayout
  where
     standardLayout =   renamed [Replace "Tall"] tiled
                    ||| renamed [Replace "Mirror Tall"] (Mirror tiled)
                    ||| renamed [Replace "Full"] Full
     -- default tiling algorithm partitions the screen into two panes                             
     tiled   = spacing 10 $ Tall nmaster delta ratio
     -- The default number of windows in the master pane                                          
     nmaster = 1
     -- Default proportion of screen occupied by master pane                                      
     ratio   = 1/2
     -- Percent of screen to increment by when resizing panes                                     
     delta   = 3/100

次はフローティングにしたいアプリとかの設定。

起動時に好きなワークスペースに移動できたりする。

ここで変えたかったのが、ウィンドウの作成される位置。デフォルトだと、新しいウィンドウが作成されると、先頭(一つ上の位置?)に追加される。これが直感的でない。例えばWebブラウザとかでも末尾に追加されるじゃん。なので、insertPositionという関数を使うと追加する位置とフォーカスを変更できる。

しかしながら単にinsertPositionを使用するだけだと、フローティングさせてる場合、子ウィンドウを開くと親ウィンドウの背面に行ってしまう。(ボタン押したのに反応してないと思ったら実は背面にあったということが起こる。)なので、isFloatという関数を定義してフローティングのウィンドウが無い場合に限定させてる。hackageとかソースとかgithubとかで他の人の設定見たりして数時間かかった。easy()

myManageHook = composeAll
    [ className =? "MPlayer"        --> doFloat
    , className =? "Gimp"           --> doFloat
    , resource  =? "desktop_window" --> doIgnore
    , resource  =? "kdesktop"       --> doIgnore
    , className =? "Mikutter.rb"    --> doShift (myWorkspaces !! 0)
    , className =? "Firefox-esr"    --> doShift (myWorkspaces !! 1)
    , className =? "Doublecmd"      --> doShift (myWorkspaces !! 2)
    -- 新しいウィンドウを末尾に追加しフォーカスする                                               
    , not <$> isFloat               --> insertPosition End Newer
    ]
  where
    isFloat = liftX $ do
      floats <- gets $ W.floating . windowset
      ws <- gets $ W.integrate' . W.stack . W.workspace . W.current . windowset
      return $ any (flip M.member floats) ws

xmobarの設定。

Arch Wiki 見るとstatusBarというのを使うと良いらしい。

xmonad - ArchWiki

myXmobarPP = xmobarPP
  {
    ppCurrent           =   xmobarColor "#e5e5e5" "#1a1a1a" . pad . wrap "[" "]"
  , ppVisible           =   xmobarColor "#e5e5e5" "#1a1a1a" . pad
  , ppHidden            =   xmobarColor "#6D9CBE" "#1a1a1a" . pad
  , ppHiddenNoWindows   =   xmobarColor "#444444" "#1a1a1a" . pad
  , ppUrgent            =   xmobarColor "red"     "#1a1a1a" . pad
  , ppSep               =   "   "
  , ppWsSep             =   ""
  , ppTitle             =   xmobarColor "#e5e5e5" "#1a1a1a" . shorten 30
  , ppLayout            =   xmobarColor "#6D9CBE" "#1a1a1a"
  }

main = do
  -- The main function.                                                                           
  xmonad =<< statusBar myBar myPP toggleStrutsKey myConfig
  where
    -- Command to launch the bar.                                                                 
    myBar = "~/.cabal/bin/xmobar"
    -- Custom PP, configure it as you like. It determines what is being written to the bar.       
    -- myPP = xmobarPP { ppCurrent = xmobarColor "#429942" "" . wrap "<" ">" }                    
    myPP = myXmobarPP
    -- Key binding to toggle the gap for the bar.                                                 
    toggleStrutsKey XConfig {XMonad.modMask = modMask} = (modMask, xK_b)
    -- Main configuration, override the defaults to your liking.                                  
    -- myConfig = defaultConfig { modMask = mod4Mask }                                            
    myConfig = defaults

ちなみに下の設定が無いとxmonad起動時、xmonadxmobarが重なる。重なり自体はctrl+bで切り替えられるけど。

myEventHook = docksEventHook

xmonad起動時の設定。

comptonで影をつけるとかっこいい。あと、xmonadJavaアプリが変な表示になるのを防止している。

myStartupHook = do
  spawn "compton -c -r 2 -o 0.8 -l -2 -t -2"
  setWMName "LG3D"  -- for java apps   

xmobar本体の設定。(.xmobarrc)

Debianリポジトリから落とすとVolumeの値が取得できない(依存関係の関係でwith_alsaオプションが付いてない)ため、cabalでインストールして取得できるようにした。したけど、ステータス(on/off)の色の設定(--onc)とかが何故か使えない。ググってみるとボリュームは自分でスクリプト作成して取得・表示している場合が多いようだ。とりあえず、パーセントだけは表示できるので満足。

Config {
  font = "xft:MigMix 1P:antialias=true:autohinting=true:size=9"
  , additionalFonts = ["xft:MigMix 1M:size=9:antialias=true"]
  , bgColor = "#1a1a1a"
  , fgColor = "#e5e5e5"
  , position = Static { xpos = 1440, ypos = 0, width = 1440, height = 20 }
  , lowerOnStart = True
  , commands = [
      Run StdinReader
      , Run MultiCpu ["-t", "<total0>% <total1>%", "-m", "2"] 10
      , Run Memory ["-t", "<usedratio>%", "-p", "3"] 10
      , Run DynNetwork ["-t" , "<tx>k <rx>k", "-m", "2"] 10
      , Run Date "%a.%d  %H:%M" "date" 10
      , Run Volume "default" "Master" ["-t", "<volume>%"] 10
      ]
  , sepChar = "%"
  , alignSep = "}{"
  , template = " %StdinReader% } %date% { <fn=1><fn=0><fc=#6D9CBE>Cpu</fc></fn> %multicpu%  <fn=0><fc=#6D9CBE>Mem</fc></fn>%memory%  <fn=0><fc=#6D9CBE>Net</fc></fn> %dynnetwork%  <fn=0><fc=#6D9CBE>Vol</fc></fn> %default:Master%</fn>  "
  }

設定はGitHubで公開してます。 

GitHub - tempxla/dotfiles: dotfiles

以下スクショ。

f:id:temp_la:20180503234543p:plain