xmonadを使ってみる。

xmonadっていうタイル型ウインドウマネージャを使ってみた。
設定ファイルがHaskellできれい。
他にもawesomeってのもあったが、luaって知らない言語だった。
まあ、Haskellもやったことないけど。
Ubuntuのバージョンは10.10。

インストール

インストールは

# apt-get install xmonad

これで、ログイン(gdm)のときに選択できるようになる。

ついでに

# apt-get install dwm-tools xmobar

もいれておきます。
dwm-toolsはdmenuのこと。

$ man xmonad

基本操作

最低必要な操作は、

mod-shift-q xmonadの終了
mod-shift-return terminalの起動

始めに使えると便利な操作は、

mod-shift-c ウインドウを閉じる
mod-{j,k,tab,shift-tab} 他のウインドウにフォーカスする
mod-{h,l} ウインドウの大きさを変える
mod-space ウインドウのレイアウトを変える
mod-[1..9] ワークスペースの移動
mod-p dmenuによるプログラムの起動
mod-q xmonadの再起動

mod-qは設定ファイルをいじるとき、とても便利。
これのおかげで設定はかなりスムーズ。
modキーはデフォルトでは左のAlt。

設定

設定ファイルは~/.xmonad/xmonad.hs。

注意! Haskellは勉強したことないので、ここから下はかなり憶測です。

基本設定

まず、/usr/share/doc/libghc6-xmonad-doc/examples/xmonad.hs.gzに
設定ファイルの例があるので、コピーしてくる。

$ cp /usr/share/doc/libghc6-xmonad-doc/examples/xmonad.hs.gz .
$ gunzip xmonad.hs.gz
$ mkdir ~/.xmonad
$ mv xmonad.hs ~/.xmonad/

このファイルは、基本的にはmy〜を定義していって
最後に

main = xmonad defaults

でdefaultsを実行。
defaultsっていうのはそのすぐ下で

defaults = defaultConfig {
      -- simple stuff
        terminal           = myTerminal,
        focusFollowsMouse  = myFocusFollowsMouse,
        borderWidth        = myBorderWidth,
        modMask            = myModMask,
        numlockMask        = myNumlockMask,
        workspaces         = myWorkspaces,
        normalBorderColor  = myNormalBorderColor,
        focusedBorderColor = myFocusedBorderColor,

      -- key bindings
        keys               = myKeys,
        mouseBindings      = myMouseBindings,

      -- hooks, layouts
        layoutHook         = myLayout,
        manageHook         = myManageHook,
        handleEventHook    = myEventHook,
        logHook            = myLogHook,
        startupHook        = myStartupHook
    }

と定義される。
なので、基本的にはmy〜の定義を変更するだけでかなり設定できる。

modキーとしてAltは使いたくないのでWindows(Super)に変更。

myModMask       = mod4Mask

terminalはgnome-terminalを使う。

myTerminal      = "gnome-terminal"

ワークスペース1,2に名前を付けてみる。

myWorkspaces = ["1:work","2:web"] ++ map show [3..9]

変更したら、mod+qで設定を反映する。
ダメなときはエラーが出る。

ごちゃごちゃしてるのはいやなので、いらないものを消してみる。
それでもうまく動いてくれるみたい。結局

--
-- .xmonad/xmonad.hs
--

-- インポート
import XMonad

------------------------------------------------------------------------
-- こまごました設定

-- ターミナルの指定
myTerminal      = "gnome-terminal"

-- modキーをWindowsに
myModMask       = mod4Mask

-- ワークスペース
myWorkspaces = ["1:work","2:web"] ++ map show [3..9]

------------------------------------------------------------------------
-- 設定の実行

-- 実行
main = xmonad myConfig

-- 設定(上書きしなければデフォルトの値が用いられる)
myConfig = defaultConfig {
        terminal           = myTerminal,
        modMask            = myModMask,
        workspaces         = myWorkspaces
    }

となる。

xmobarの設定

これだけだと味気ないので、時間や日付もわかるようにしたい。
また、ワークスペースも表示してくれるとうれしい。

これは最初にいれたxmobarで実現できる。

$ man xmobar

これを用いるとCPUやメモリ、ネットワーク、バッテリー、天気なども
表示してくれるようになる。
GNU Screenのステータスバーのようなもの。

設定ファイルは~/.xmobarrcだが、これも設定例があるのでコピーしてくる。

$ cp /usr/share/doc/xmobar/examples/xmobarrc-example ~/.xmobarrc

デフォルトではいろいろ表示されるようになっているが、
必要ないものは使わない主義なので、

--
-- .xmobarrc
--

Config { font = "xft:Sans-10:bold"
       , bgColor = "black"
       , fgColor = "grey"
       , position = Top
       , lowerOnStart = False
       , commands = [
                    Run Com "id" ["-un"] "uname" 36000
                    , Run Com "date"["+'%x(%a) %H:%M'"] "date" 10
                    , Run StdinReader
                    ]
       , sepChar = "%"
       , alignSep = "}{"
       , template = "%StdinReader% }{ <fc=#ee9a00>%date%</fc> %uname%"
       }

とした。
もっぱら変更するのはcommandsの中と、templateの指定。

dateはcommandsの中で何も指定しないと普通に日本語で秒まで表示してくれるが、
Run Dateで指定すると英語になってしまう。
秒まで表示するとチカチカしていやなので書式指定したかったが、
locale?を指定する方法がわからなかったので、
普通のdateコマンドからの標準出力を用いることにした。

なにかいい方法があったら教えてください。

最後に、xmonad.hsにxmobarの設定を加えて終わり。

--
-- .xmonad/xmonad.hs
--

-- インポート
import XMonad
import XMonad.Hooks.DynamicLog

------------------------------------------------------------------------
-- こまごました設定

-- ターミナルの指定
myTerminal      = "gnome-terminal"

-- modキーをWindowsに
myModMask       = mod4Mask

-- ワークスペース
myWorkspaces = ["1:work","2:web"] ++ map show [3..9]

------------------------------------------------------------------------
-- xmobarの設定

-- Command to launch the bar.
myBar = "xmobar"

-- 表示の指定
myPP = xmobarPP { ppCurrent = xmobarColor "#429942" "" . wrap "<" ">" }

-- Keybinding to toggle the gap for the bar.
toggleStrutsKey XConfig {XMonad.modMask = modMask} = (modMask, xK_b)

------------------------------------------------------------------------
-- 設定の実行

-- 実行
main = xmonad =<< statusBar myBar myPP toggleStrutsKey myConfig

-- 設定(上書きしなければデフォルトの値が用いられる)
myConfig = defaultConfig {
        terminal           = myTerminal,
        modMask            = myModMask,
        workspaces         = myWorkspaces
    }

参考

xmonad - ArchWiki
適度に短く要点がまとまっているので、設定のときにかなり参考になりました。

ウインドウ分割関連

ウインドウ周りの設定がうまくいった気がするのでさらしてみる。
.emacsは、

;;
;; ウインドウ関係
;; 
;; windmove (shift+cursor keys)
(windmove-default-keybindings)
(setq windmove-wrap-around t)
;; サイズ変更
(global-set-key (kbd "S-C-<left>") 'shrink-window-horizontally)
(global-set-key (kbd "S-C-<right>") 'enlarge-window-horizontally)
(global-set-key (kbd "S-C-<down>") 'shrink-window)
(global-set-key (kbd "S-C-<up>") 'enlarge-window)
;; winhist (undo, redo)
(require 'winhist)
(winhist-mode 1)
(global-set-key "\M-B" 'winhist-backward)
(global-set-key "\M-F" 'winhist-forward)
;; windows
(setq win:switch-prefix "\C-z")
(define-key global-map win:switch-prefix nil)
(define-key global-map "\C-z1" 'win-switch-to-window)
(require 'windows)
;; 新規にフレームを作らない
(setq win:use-frame nil)
(win:startup-with-window)
(define-key ctl-x-map "C" 'see-you-again)

みたいな感じ。

参考:http://www.bookshelf.jp/soft/meadow_30.html

ThinkPad購入検討中

現在ThinkPadの購入を検討中なので、そのメモ。

店頭展示

ThinkPadは基本的に店頭では販売しないようで、近所の量販点にいっても展示してなかっ
た。とりあえずlenovoのページに紹介
されてたThinkPadがおいてある店をいくつか回ってみた。

結論としてはどこも値段は同様で品揃えもxシリーズに限って言えばx201、x201i、x101e、
売れ残りのx100eがおいてあるくらいだった。

株式会社若松通商 公式ThinkPad専門店だと教えてもらったので行って
みると、xシリーズの中古品、各種部品から新品のx201、x201i、x201sなどが置いてあっ
た。また値段も他の店より安く、英字キーボードや7からXPへのダウングレードも行って
くれるようだった。

web販売

lenovoのメーリスに入るとクーポンで安くなるらしいので、とりあえず入ってみた。まだ
メールは来ない。

WiMAX/WiFi

どうもubuntuだと無線LANのドライバが見つからないことがあるらしいので適当にgoogle
で調べてみると、Ubuntu日本語フォーラム / Intel® Centrino® Advanced–N + WiMAX 6250について(LOOX LMG30B2)
Ubuntu日本語フォーラム / wimaxカードは認識しますか?にあるように、WiMAX
使えないみたい。

WiFiのほうはパッと見使えないって記述はなかったのでなんとかなるのかな。とりあえず、
WiMAX/WiFiいれてWiMAXの対応をまとうかな。

keybind覚え書き

emacsやviで使っていないキーがちょろちょろ出てきたので、
意識的に使うように書いとく。

  • emacs
    • query-replace M-%
    • mark buffer C-x h
    • indent code or region C-M-\
    • upper case M-u
    • lower case M-l
    • capitalize M-c

query-replaceはよく使うのについついM-x query-replaceで使ってた。
Esc Shift-% よりはAlt-Shift-% で指に覚えさせるのがいいのかな。

  • vi
    • c
    • :s/old/new/g
    • +,-,^
    • H,M,L
    • .,U
    • E,w,W,B
    • "
    • z,z.,z-

まだまだviは慣れてない感じ。
でも特に上6個はよく使うから勝手に覚えるはず。