xmonad on ubuntu 16.04 でバックライトを調整

経緯

VAIO Pro 13 に入れていた 14.04 を 16.04 に変えたら,xbacklight が動かなくなったので自分でコマンドを作ってみた.

使い方

下のコードをbglightという名前でPATHの通ったところに置いたとすると

sudo chmod 666 /sys/class/backlight/{バックライト名}|/brightness  # 一般ユーザに書き込み権限を与える
$ bglight  # 現在の照度を表示する
30
$ bglight +  # 最大値まで10ずつ照度を増加させる
$ bglight -  # 0まで10ずつ照度を減少させる

コード

これは,バックライト名がintel_backlightの場合.

xmonad.hsサンプル

実は,Gistのテストを兼ねている.

言語を指定しなくても,ファイル名の拡張子か何かから判別してくれてんのかな.
こりゃ楽だわ.

ubuntu を 16.04に上げたら avoidStruts が効かなくなった件

ubuntu を 16.04 に上げると xmonad のバージョンが 0.12 にあがり,avoidStruts 関数はあるはずなんだけど,私の環境では効かなくなった.
文法ミスを疑い haskell の本を読んだりして勉強したが原因が分からず,結局のところ avoidStruts を使わない方法で解決した.
とりあえず desktopLayoutModifiers を使うだけでできた.

import XMonad.Config.Desktop(desktopLayoutModifiers)

main = do
    { -- 略
    , layoutHook            = toggleLayouts (noBorders Full) $ desktopLayoutModifiers $ myLayout
    --, layoutHook            = toggleLayouts (noBorders Full) $ avoidStruts $ myLayout
    }

myLayout = (spacing 18 $ ResizableTall 1 (3/100) (3/5) [])
            |||  (dragPane Vertical   (1/10) (1/2))
            |||  Full

xmonadで特定のプログラムだけフローティング

xmonadを使っていて,タイル配置するとレイアウトが壊れたり操作ボタンが隠れたりして使えないことがある.
そういったプログラムは,フローティングするのが良い.
しかしSuper+クリックで配置後にフローティングしてもウィンドウサイズをリサイズしてくれないため操作ボタンが出てこないことが多々ある.
そういう場合は,最初から特定のプログラムをフローティングで起動するように設定するのが良い.

クラス名を調べる

以下のコマンドで,xpropを使ってコンソールにウィンドウの情報を取得できるようにする.
クラス名だけフィルタしても良い.
このコマンドを実行するとマウスポインタの形状が変わるので,対象のウィンドウをクリックすると情報を取得できる.

$ xprop | grep WM_CLASS

xmonadの設定

xmonadをdefaultConfigで起動している場合,<+>演算子で連結(?)すると良い.

main = do
    -- 略
    xmonad $ ewmh defaultConfig
    { -- 略
    , manageHook = myManageHook
    , -- 略
    }

myManageHook = manageHook defaultConfig <+> myManageHookFloat

myManageHookFloat = composeAll
    [ className =? "PATTERN1" --> doFloat
    , className =? "PATTERN2" --> doFloat
    ]

xmonad でタイルの配置が1列になってしまった時

私はうっかりよく忘れるのだが,Mod-,やMod-.というキーでmaster paneのタイル数を変えるという機能が xmonad にはある.
これは,デフォルトではmaster paneにはタイルは1枚で,残りのタイルは横に小さく表示されるという外観になると思うのだが,そのmaster paneに複数枚のタイルを配置し,「masterにある複数枚のタイルのみ大きく表示」「他のタイルは小さく表示」という配置を実現してくれる.
で,AltキーをModキーにしていた場合に,カンマやピリオドは誤爆してしまうことがあって,タイルはせいぜい2枚しかないため,どっちを押してもビューが1列になってしまって焦るということが起こる.

これは,master paneが0枚or2枚のどっちになっても1列に全タイルが並ぶのが原因であって,master paneの枚数にマイナスはないので,このキーバインドを殺さずこの現象を打開するには,

  1. とにかくMod-.を連打してmaster paneを0枚にする
  2. Mod-,で必要枚数に戻す

という手順を覚えておくのが良い.
先にMod-,の方を試すと,master paneに数十枚を設定することも可能なため,何を押しても一列状態が解除されず,尚のこと焦るという悪循環が待っている.

xmonad環境でxmobarの設定をホスト名で振り分ける

gitとかで設定ファイルを管理して,新しいマシンではgit clone hogehogeし,ホームディレクトリにシンボリックリンクを張るだけでいつもの環境になって欲しい.
この時,shの設定は簡単に振り分けられるが,馴染のないhaskellで書かされるxmonadの設定とxmobarの設定をどう振り分けるのか困るのであった.

haskellを普段使いしている人には何のことない話なんだけど…

import System.Posix.Unistd

main = do
    host <- fmap nodeName getSystemID -- ホスト名を host にセット
    -- どれが良いか分からんので,上手くいかない時は以下も試してみる
    -- or host <- nodeName `fmap` getSystemID
    -- or host <- nodeName <$> getSystemID  -- 要 import Control.Applicative
    myStatusBar <- spawnPipe $ "xmobar ~/.xmonad/.xmobarrc_" ++ host -- 文字列の連結

ibusのステータス(現在使っているIME)をxmobarに表示する

ibus のエンジンをコマンドラインで引けるので,簡単に出せるのだった

Config  { commands = [ -- (略)
                     , Run Com   "/usr/bin/ibus" ["engine"] "MyIME" 10
                     -- (略)
                     ]
          , template " XXXXX  %MyIME% XXXXX"
        }

私の環境だと,skkとか出る.
時々,IMEがバグってenとかに陥っている時とかに,ここで確認できることを期待して表示させている.

今回,ibusの状態を可視化することによって,skkが落ちているのではなく,C-jを受け付けない状況にい陥ってるのだと判明.
ibus-daemonの再起動 (ibus-daemon –drx) で直ることも判明.

Vimとシェルと私

vimまたはgvimからシェルを新しいタブで呼び出して編集とコンパイル/インタプリットをvim内で完結できたらいーなー,と思って調べたら,満足する解が見付からなかったという話.

前提:私の考え方は,この方とかなり近い→シェルを求めて三千里~悠久のvim編~ - Alone Like a Rhinoceros Horn
ただしvimもemacsも編集内容によって使い分けている.

ともかく私の我侭は

  • zshを実行したいよ
  • :shellでコマンドラインを残してvimに戻れないのは有り得ない
  • screenやtmuxみたくCtrlショートカットの1つを占有されると,何に割り当てても困ることが多い
    C-a→数字のインクリメントは結構よく使う
    C-t→texファイルの編集はemacs+evil+YaTeXなので,コンパイルができなくなる
    などなど…

結局辿りついたのが,このweblogにも,たまに書いているxmonadというタイル型ウィンドウマネージャを入れて右Altのみをmodキーにするというもの.
Vim/Emacsやshellは左手で操作し,それらの間の遷移は右Altで遷移する,と.
バッファ切り替えの次元が1次元増えるような操作感なので,慣れないと厳しいかも知れんけど.

で,現状の課題は,VimShell作者のShougoさんもPresentation file · Shougo/vimshell.vim Wiki · GitHubで書かれているけど,
zsh上で入力した文字列をバッファに取り込めないこと.
vimに持ってくるのに,タイル型WMを使ってるくせにマウスが必要なのがイマイチだ.
はっきしいって,ターミナル側でC-kしたものをOS(?)のクリップボードみたいなところに格納してくれれば,Kaoriya版もってくれば,"+pとかで貼り付けられるんだけどなー.

xmonadでダイアログへのフォーカスがループする現象の対策

追記

keepass2のフォーカス問題については,原因はよく分からないものの
xmonad - ArchWikiのJava GUIの問題対策を実施し
最新のxdotoolを入れたら,keepass2のウィンドウは相変わらずフォーカスループするのだが,keepass2 --auto-typeで問題なく自動フィルされるようになった.

export _JAVA_AWT_WM_NONREPARENTING=1

xmonadからkeepass2をWinと同じく左ALT+Ctrl+aで呼び出すのは,こんな感じ.
ただしmodMaskはmod1Mask以外にしている.

-- 省略
    `additionalKeys`
        [ -- 省略
        , ((mod1Mask .|. controlMask, xK_a), spawn "keepass2 --auto-type")
        ]

でも,CPUファンが唸るので,keepass2を常駐させるのは無理ぽ


xmonad で libreoffice をはじめとするダイアログを生成し,自動的にフォーカスをダイアログへうつし,かつ元ウィンドウへのフォーカスはさせない系の動作をするアプリにおいて,ダイアログへフォーカスをうつす処理っぽいものが無限ループみたいな状態に陥って,CPU使用率はぐいぐい向上し,ほとんど操作を受け付けなくなる現象への対策.
sylpheedのダイアログとかでも直ったから,ちょー助かる.
Linux - xmonadでLibreofficeを起動するとフォーカスがループする問題 - Qiita
リンク先の方法で解決.神すぎ.

(略)
import XMonad.Hooks.EwmhDesktops -- フォーカスがループする問題対策
(略)
main = do
  myStatusBar <- spawnPipe "xmobar /home/hoge/.xmonad/.xmobarrc"
  xmonad $ ewmh defaultConfig
    { borderWidth           = 3
    , focusedBorderColor    = colorGreen
    , layoutHook            = toggleLayouts (Full) $ myLayoutHook
    , logHook               = myLogHook myStatusBar
    , modMask               = modm
    , manageHook            = myManageHook
    , normalBorderColor     = colorGray
    , startupHook           = myStartupHook
    , terminal              = "urxvt"
    }