xmonad
xmonad は、X のタイル型ウィンドウマネージャです。画面を分割し、重なり合わないようにウィンドウを配置することで、画面を最大限に活用することができます。ウィンドウマネージャの機能はキーボードから利用することができます (マウスはオプションです)。
xmonad は Haskell で実装されており、設定や拡張も Haskell で書かれています。レイアウトやキーバインド、その他の設定はユーザーが設定ファイルに書き込むことで変更できます。
レイアウトは動的に適用され、各ワークスペース上で異なるレイアウトを使用することができます。Xinerama が完全にサポートされ、ウィンドウを複数のモニタで並べて表示することができます。
詳細は、xmonad のウェブサイトをご覧ください: http://xmonad.org/
目次
- 1 インストール
- 2 xmonad の起動
- 3 設定
- 4 Xmonad の終了
- 5 ヒントとテクニック
- 6 トラブルシューティング
- 6.1 GNOME 3 と xmonad
- 6.2 Xfce 4 と xmonad
- 6.3 xmonad-i386-linux や xmonad-x86_64-linux が存在しない
- 6.4 Java アプリケーションの問題
- 6.5 gvim やターミナルの底部の空きスペース
- 6.6 Chromium/Chrome がフルスクリーンにならない
- 6.7 マルチタッチ / touchegg
- 6.8 azerty キーボードレイアウトのキーバインドの問題
- 6.9 GNOME 3 の mod4+p で dmenu が起動するかわりにディスプレイの設定が変更されてしまう
- 6.10 VirtualBox でフォーカスしたボーダーの問題
- 6.11 Steam のゲーム (Half-Life, Left 4 Dead, …) と xmonad
- 6.12 アップデート後に共有ライブラリが見つからない
- 7 参照
インストール
xmonadをインストールしてください。これには基本的な設定が含まれています。追加のタイリングアルゴリズムや設定、スクリプトなど便利なデスクトップ設定を含んでいる xmonad-contrib もインストールすることを推奨します。
また、開発版の xmonad-gitAUR や xmonad-contrib-gitAUR をインストールすることもできます。
xmonad の起動
xmonad を自動起動するには、起動スクリプトに xmonad
コマンドを追加します (例えば、startx を使う場合 ~/.xinitrc
、XDM ログインマネージャを使う場合 ~/.xsession
)。GDM や KDM を使う場合は、新しいセッションファイルを作成し、セッションメニューから xmonad を選択します。
Xterm パッケージをインストールするか、設定でターミナルエミュレータを変更しないと Xmonad の中で何もできなくなるので注意してください。
また、標準では US キーボードレイアウトなので、必要に応じて変更します。例えば日本語キーボードレイアウトは ~/.xinitrc
に以下を追加します。キーボードレイアウトの設定についてはここを参照してください。:
$ setxkbmap -layout jp
例 ~/.xinitrc
:
# set the cursor xsetroot -cursor_name left_ptr # set Japanese keyboard layout setxkbmap -layout jp # start xmonad exec xmonad
もし、起動しない場合はホームディレクトリに .xmonad
ディレクトリがあるか確認してください。もしない場合は作成します。
$ mkdir ~/.xmonad
詳細については、xinitrc を参照してください。
設定
xmonad ユーザーは ~/.xmonad/xmonad.hs
を修正することで xmonad をカスタマイズすることができます。再コンパイルは Mod+q
ショートカットでその場で自動的にされます。
ディレクトリ ~/.xmonad
がない場合は xmonad --recompile
を実行してディレクトリを作成します。
xmonad のデフォルトの設定は非常に優秀で、xmonad.hs
がなくても実行することができます。そのため、xmonad --recompile
を実行したあとでも ~/.xmonad/xmonad.hs
は多分無いでしょう。あなたがそれをカスタマイズしたいのならば、ファイルを作成しそれを編集していきましょう。
xmonad の設定ファイルは Haskell で書かれているため、プログラマーでないとなかなか設定が難しいと思われます。設定例や詳細方法は以下のページを参照して下さい:
- xmonad wiki
- xmonad config archive
- xmonad FAQ
- Arch Linux フォーラムスレッド
最善の方法は組み込みの def 関数を使用し、必要なところを ~/.xmonad/xmonad.hs
で変更やカスタマイズをすることです。
次のように xmonad.hs
を書くことによって設定します:
import XMonad main = xmonad def { terminal = "urxvt" , modMask = mod4Mask , borderWidth = 3 }
この例では、デフォルトの設定に端末とボーダーの設定を上書きします (その他の設定は def 関数から継承されます)。
より複雑になるにつれ、それぞれ別の関数で設定しメイン関数内でそれらの関数を呼び出したほうが便利です。これによって、大規模なカスタマイズをするときに保守が簡易になります。
上記の簡単な xmonad.hs
は次のように書くことができます:
import XMonad main = do xmonad $ def { terminal = myTerminal , modMask = myModMask , borderWidth = myBorderWidth } myTerminal = "urxvt" myModMask = mod4Mask -- Win key or Super_L myBorderWidth = 3
また、Haskell では import が最初にあれば、トップレベルの要素 (main, myTerminal, myModMask 等) や {} 内の順序は重要ではありません。
以下は この 設定ファイルの一部です。これは一般的な機能の一例です。
{ terminal = myTerminal, focusFollowsMouse = myFocusFollowsMouse, borderWidth = myBorderWidth, modMask = myModMask, -- numlockMask deprecated in 0.9.1 -- 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 }
パッケージにも xmonad.hs
が入っており、これは xmonad.hs
の最新の公式サンプルです。どうやって設定を上書きするのかその例となる xmonad Haskell モジュールとなっています。ただし、これは自分自身の設定へピックアップしていくための例を集めたものとなっていて、直接これをテンプレートとして使用することは避けてください。/usr/share/
の中にアーキテクチャとバージョン別に置かれています (例: find /usr/share -name xmonad.hs
)。
デスクトップ設定のベース
xmonad-contrib にはデスクトップとして使うためのデフォルト設定があります。Chromium など新しいプログラムで発生する問題を解決します。
以下のように追加してください:
import XMonad import XMonad.Config.Desktop main = xmonad desktopConfig { terminal = "urxvt" , modMask = mod4Mask }
Xmonad の終了
Mod+Shift+q
で xmonad を終了させることができます。Mod
はデフォルトでは Alt
になっています。
ヒントとテクニック
X-Selection-Paste
Xmonad でのキーボードによる操作は X-Selection-Paste のキーボードショートカットを使うことで更に良くなります。
また、XMonad.Util.Paste に存在する "pasteSelection" 関数を以下のようにキーにバインドすることもできます:
xmonad.hs
import XMonad.Util.Paste -- Remember to include this line -- X-selection-paste buffer , ((0, xK_Insert), pasteSelection)
"Insert" キーを押すとアクティブウィンドウにマウスバッファが貼り付けられるようになります。
キーボードショートカット
デフォルトのキーボードショートカットは、 xmonad の man page xmonad(1) § NOTES に列挙されています。
バインドされていないキーをターゲットにする
もし xmonad をスタンドアローンなウィンドウマーネージャとして使うのであれば、 xmonad.hs
にバインドされていないキーボードのキーを追加できます。することは、まずキーの Xf86 キーネーム (XF86PowerDown のようなやつ) を、/usr/include/X11/XF86keysym.h
で探します。するとキーコード (たとえば 0x1008FF2A) が分かるので、xmonad.hs
のキーバインディング部分に次の様に追加します:
((0, 0x1008FF2A), spawn "sudo pm-suspend")
マウスで画面の端をタッチして X () アクションを実行する
XMonad.Hooks.ScreenCorners を使用すると、ユーザーは XMonad を使用して KDE のような画面コーナーを設けることができます。
ScreenCorners でワークスペースを切り替える (KDE のような)
startHook で一連の操作を定義します:
xmonad.hs
... import XMonad.Hooks.ScreenCorners ... mystartupHook = do ... ... example ... addScreenCorners [ (SCLowerLeft, prevWS) , (SCLowerRight, nextWS) , (SCUpperLeft, spawnSelected' myAppGrid) , (SCUpperRight, goToSelected $ mygridConfig' myColorizer) ] ...
次に、screenCornerEventHook を handleEventHook に追加します:
myConfig = def { ... handleEventHook = ... <+> screenCornerEventHook <+> ... ... }
最後に screenCornerLayoutHook を追加します:
... myLayoutHook = screenCornerLayoutHook $ ...... ... myConfig = def { ... layoutHook = myLayoutHook ... }
ワークスペースの数を増やす
デフォルトでは、xmonad は9つのワークスペースを使います。以下のように拡張することでワークスペースの数を増やすことが可能です:
xmonad.hs
import XMonad import XMonad.Util.EZConfig (additionalKeys) main=do xmonad $ def { ... , workspaces = myWorkspaces , ... } `additionalKeys` myAdditionalKeys myWorkspaces = ["1","2","3","4","5","6","7","8","9"] ++ (map snd myExtraWorkspaces) -- you can customize the names of the default workspaces by changing the list myExtraWorkspaces = [(xK_0, "0")] -- list of (key, name) myAdditionalKeys = [ -- ... your other hotkeys ... ] ++ [ ((myModMask, key), (windows $ W.greedyView ws)) | (key, ws) <- myExtraWorkspaces ] ++ [ ((myModMask .|. shiftMask, key), (windows $ W.shift ws)) | (key, ws) <- myExtraWorkspaces ]
ドックやパネル、トレイ (Xmobar, Tint2, Conky など) のための空間を作る
ドックやパネル、トレイの空間を自動で調整するには XMonad.Hooks.ManageDocks の avoidStruts を使います:
import XMonad import XMonad.Hooks.ManageDocks main=do xmonad $ def { ... , layoutHook=avoidStruts $ layoutHook def , manageHook=manageHook def <+> manageDocks , ... }
隙間を切り替えたい場合、以下のアクションをキーバインドに追加してください:
,((modMask x, xK_b ), sendMessage ToggleStruts)
xmonad で xmobar を使う
xmobar は xmonad で使うことを想定して作られた軽量でミニマルなテキストベースのバーです。xmonad で xmobar を使うには、xmonad パッケージに加えて2つのパッケージが必要になります: xmonad-contrib と xmobar です。また、xmobar パッケージの代わりに xmobar-gitAUR を使うこともできます。
ここでは xmonad の中から xmobar を起動して、xmonad をリロードしたときに xmobar もリロードします。
~/.xmonad/xmonad.hs
をお好きなエディタで開いて、以下のどちらかの設定を行なってください:
クイック設定
一般的なインポート:
import XMonad import XMonad.Hooks.DynamicLog
xmobar を起動して#複雑な設定で説明しているオプションを全て含んだ設定を返す xmobar アクション:
main = xmonad =<< xmobar def { modMask = mod4Mask {- or any other configurations here ... -}}
複雑な設定
xmonad(-contrib) 0.9 現在、XMonad.Hooks.DynamicLog には新しい statusBar 関数が存在します。以下のような設定が可能です:
- バーを実行するのに使用するコマンド
- バーに書き込まれるものを決定する PP
- バーの隙間を切り替えるキーバインド
使用例:
~/.xmonad/xmonad.hs
-- Imports. import XMonad import XMonad.Hooks.DynamicLog -- The main function. main = xmonad =<< statusBar myBar myPP toggleStrutsKey myConfig -- Command to launch the bar. myBar = "xmobar" -- Custom PP, configure it as you like. It determines what is being written to the bar. myPP = xmobarPP { ppCurrent = xmobarColor "#429942" "" . wrap "<" ">" } -- 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 = def { modMask = mod4Mask }
XMobar の設定を確認
テンプレート・デフォルトの xmobarrc に含まれています。
最後に ~/.xmobarrc
を開いて StdinReader
がテンプレートに含まれていてプラグインを実行することを確認してください:
~/.xmobarrc
Config { ... , commands = [ Run StdinReader .... ] ... , template = " %StdinReader% ... " }
設定が完了したら xmonad を再起動してください。
外部スクリプトで xmonad を制御
複数の方法が存在します:
- xmonad の拡張 XMonad.Hooks.ServerMode を使用する。
- xdotool などのプログラムを使ってキーの押下をシミュレートする Ubuntu フォーラムスレッド。以下のコマンドは
Super+n
の押下をシミュレートします:
xdotool key Super+n
- desktopConfig や EwmhDesktops を設定している場合、使いやすいユーティリティとして wmctrl が存在します。
xmonad の中で他のウィンドウマネージャを起動
xmonad-gitAUR を使用している場合、xmonad の中から他のウィンドウマネージャを再起動することができます (2011年1月現在)。小さなスクリプトを書いて ~/.xmonad/xmonad.hs
に設定を追加するだけです。スクリプトは以下のようになります:
~/bin/obtoxmd
#!/bin/sh openbox xmonad
そして ~/.xmonad/xmonad.hs
に以下のような設定を追加してください:
~/.xmonad/xmonad.hs
import XMonad --You need to add this import import XMonad.Util.Replace main do -- And this "replace" replace xmonad $ def { --Add the usual here }
以下のキーバインドも追加する必要があります:
~/xmonad/xmonad.hs
--Add a keybinding as follows: ((modm .|. shiftMask, xK_o ), restart "/home/abijr/bin/obtoxmd" True)
カンマを前または後に追加してパスを実際のスクリプトのパスに置き換えてください。Mod+q
(xmonad を再起動して設定をリロード) を押してから Mod+Shift+o
を押せば xmonad と同じウィンドウが開いた Openbox が実行されます。xmonad に戻したいときは Openbox を終了してください。詳しくは Adamvo の xmonad.hs を参照。
KDE と xmonad
xmonad の wiki には KDE で xmonad を実行 する方法が書かれています。
また、何らかの理由で xmonad が終了してしまったときのために、xmonad を起動するキーボードショートカットを KDE の中で設定しておくと良いでしょう。
plasmashell の無効化
デスクトップやタスクバー、トレイなどを管理する KDE5 の plasmashell を無効化すると良いでしょう:
$ cp /etc/xdg/autostart/plasmashell.desktop ~/.config/autostart/
以下のように ~/.config/autostart/plasmashell.desktop
を編集して Exec=plasmashell
を Exec=
に置き換えてください:
~/.config/autostart/plasmashell.desktop
[Desktop Entry] Exec= Name=Plasma Desktop Workspace ... # more stuff
Skype 用の IM レイアウト
新しいバージョンの Skype 用に IM レイアウトを作成するには、以下のコードを使用:
xmonad.hs
myIMLayout = withIM (1%7) skype Grid where skype = And (ClassName "Skype") (Role "")
設定例
以下は xmonad ユーザーの設定例です。あなたの設定も自由に追加してください。
- brisbin33 :: simple, useful, readable :: 設定 スクリーンショット
- jelly :: Configuration with prompt, different layouts, twinview with xmobar :: xmonad.hs
- MrElendig :: xmobar を使用するシンプルな設定 :: xmonad.hs, .xmobarrc, スクリーンショット
- thayer :: ネットブックにうってつけのミニマルなマウスフレンドリーな設定 :: 設定 スクリーンショット
- vicfryzel :: Beautiful and usable xmonad configuration, along with xmobar configuration, xinitrc, dmenu, and other scripts that make xmonad more usable. :: git リポジトリ, スクリーンショット
- vogt :: Check out adamvo's config and many others in the official Xmonad/Config archive
- wulax :: Xfce の中で xmonad を使用するサンプル。GIMP 用の2つのレイアウト。 :: xmonad.hs, スクリーンショット
- alex-courtis :: Clean xmonad, xmobar, media keys, screenshot, j4/dmenu; fonts rendered at the DPI reported by the monitor :: xmonad.hs, screenshot.
トラブルシューティング
GNOME 3 と xmonad
GNOME 3 から、GNOME で xmonad を使うには設定を追加する必要があります。
gnome-session で使用するための xmonad のセッションファイルを追加 (/usr/share/gnome-session/sessions/xmonad.session
):
[GNOME Session] Name=Xmonad session RequiredComponents=gnome-panel;gnome-settings-daemon; RequiredProviders=windowmanager;notifications; DefaultProvider-windowmanager=xmonad DefaultProvider-notifications=notification-daemon
GDM のデスクトップファイルを作成 (/usr/share/xsessions/xmonad-gnome-session.desktop
):
[Desktop Entry] Name=Xmonad GNOME Comment=Tiling window manager TryExec=/usr/bin/gnome-session Exec=gnome-session --session=xmonad Type=XSession
以下のファイルを作成・編集 (/usr/share/applications/xmonad.desktop
):
[Desktop Entry] Type=Application Encoding=UTF-8 Name=Xmonad Exec=xmonad NoDisplay=true X-GNOME-WMName=Xmonad X-GNOME-Autostart-Phase=WindowManager X-GNOME-Provides=windowmanager X-GNOME-Autostart-Notify=false
最後に、xmonad-contrib をインストールして ~/.xmonad/xmonad.hs
を以下のように作成・編集:
import XMonad import XMonad.Config.Gnome main = xmonad gnomeConfig
これで GDM のセッションリストに Xmonad が表示され、gnome-session で扱えるようになります。
GNOME と Xmonad でコンポジット
コンポジットを有効にすることで一部のアプリケーション (例: GNOME Do) の見た目が良くなります。ただし Xmonad のデフォルト設定ではコンポジットが有効になっていません。有効にするには .desktop
ファイルを作成してください (/usr/share/xsessions/xmonad-gnome-session-composite.desktop
):
[Desktop Entry] Name=Xmonad GNOME (Composite) Comment=Tiling window manager TryExec=/usr/bin/gnome-session Exec=/usr/sbin/gnome-xmonad-composite Type=XSession
そして /usr/sbin/gnome-xmonad-composite
を作成して chmod +x /usr/sbin/gnome-xmonad-composite
を実行:
xcompmgr & gnome-session --session=xmonad
ログイン時のセッションリストから "Xmonad GNOME (Composite)" を選択するようにしてください。詳しくは xcompmgr(1) を参照。
Xfce 4 と xmonad
~/.xmonad/xmonad.hs
で XMonad.Config.Xfce
をインポートしたら defaultConfig
の代わりに xfceConfig
を使ってください:
import XMonad import XMonad.Config.Xfce main = xmonad xfceConfig { terminal = "urxvt" , modMask = mod4Mask }
また、Settings > Session and Startup > Application Autostart から xmonad --replace
を実行するエントリを追加してください。
xmonad-i386-linux や xmonad-x86_64-linux が存在しない
Xmonad は自動的に xmonad-i386-linux
ファイルを (~/.xmonad/
の中に) 作成します。作成されない場合、xmonad wiki から設定を入手するか 自分で 設定を書いてください。.hs
などのファイルを ~/.xmonad/
に配置したら、フォルダの中から以下のコマンドを実行:
xmonad --recompile
これでファイルが出来るはずです。
Java アプリケーションの問題
標準の Java GUI ツールキットは、ハードコーディングされた "non-reparenting" ウィンドウマネージャのリストを持っています。xmonad はそのリストに含まれておらず、稼働中にいくつかの問題が発生する Java アプリケーションがあります。最も一般的な問題の一つは、Java アプリケーションが GUI をレンダリングする代わりに無地で灰色の box をレンダリングする、"gray blobs" です。
これを解決できる方法はいくつかあります。
- jre7-openjdk や jre8-openjdk ならば、
/etc/profile.d/jre.sh
にexport _JAVA_AWT_WM_NONREPARENTING=1
を追記してください。そして、そのファイル/etc/profile.d/jre.sh
を source するか、再ログインしてください。 - Oracle の JRE/JDK ならば、SetWMName を使用してください。しかし、その効果は
XMonad.Hooks.EwmhDesktops
も使用すると打ち消されてしまうかもしれません。この場合は、
>> setWMName "LG3D"
を LogHook
に追記することで解決されるでしょう。
より多くの情報を得るためには、[3] を参照してください。
gvim やターミナルの底部の空きスペース
スペースを背景色と合わせる方法は Vim#gVim ウィンドウの底部の空きスペースを見てください。
rxvt-unicode の場合、rxvt-unicode-patchedAUR が使えます。
サイズヒントを使うように xmonad を設定することもできます。ただし隙間は残ります。詳しくは Xmonad.Layout.LayoutHints のドキュメント を参照してください。
Chromium/Chrome がフルスクリーンにならない
F11
を押したときに Chrome がフルスクリーンにならない場合、xmonad-contrib パッケージに含まれている XMonad.Hooks.EwmhDesktops 拡張を使ってください。~/.xmonad/xmonad.hs
に以下の import
文を追加するだけです:
import XMonad.Hooks.EwmhDesktops
それから適当な場所に handleEventHook = fullscreenEventHook
を追加してください。例:
... xmonad $ defaultConfig { modMask = mod4Mask , handleEventHook = fullscreenEventHook } ...
xmonad の再コンパイル・再起動後に、Chromium で F11
(fullscreen) が使えるようになるはずです。
マルチタッチ / touchegg
Touchégg はウィンドウマネージャから _NET_CLIENT_LIST
を定期的に取得します (マウスイベントを取得するウィンドウのリストを確認するため)。デフォルトでは xmonad はこのプロパティを提供していません。有効にするには、xmonad-contrib パッケージに含まれている XMonad.Hooks.EwmhDesktops 拡張を使ってください。
azerty キーボードレイアウトのキーバインドの問題
azerty レイアウトのキーボードを使っている場合、特定のキーバインドに問題が発生します。XMonad.Config.Azerty モジュールを使うことで問題は解決します。
gnome-control-center のディスプレイ設定を切り替える必要がない場合、ユーザーで以下を実行することで xrandr プラグインで Super+p を使用するのを止めさせることができます:
$ dconf write /org/gnome/settings-daemon/plugins/xrandr/active false
VirtualBox でフォーカスしたボーダーの問題
Virtualbox には既知の問題 (Ticket #6479) が存在し、フォーカスされたウィンドウのボーダーに問題が発生します。xcompmgr などのコンポジットマネージャをインストールして vboxvideo の挙動を上書きすることで解決できます。
Steam のゲーム (Half-Life, Left 4 Dead, …) と xmonad
Source エンジンを使っているゲーム (Half-Life など) で問題が発生することがあります。ゲームが起動しなかったり黒い画面から進まないときは、ウィンドウモードで起動してみてください: ライブラリのゲームを右クリックして、起動オプションに以下のように入力 ([4] を参照):
-windowed
manage フックを使用してゲームのウィンドウをフロートさせる方法もあります。例えば、Half-Life の場合なら以下の行を使います:
className =? "hl_linux" --> doFloat
アップデート後に共有ライブラリが見つからない
xmonad の実行ファイルは ~/.xmonad/
に存在します。xmonad のアップグレード後、古い実行ファイルが残っている場合、削除することで xmonad は新しい実行ファイルをコンパイルします。もしくは xmonad --recompile
を使ってください。
この再コンパイルの作業は、次のように /etc/pacman.d/hooks/xmonad.hook
に pacman のフックを作成することで自動化できます (まず hooks
デイレクトリを作成する必要があるかもしれません)。
[Trigger] Operation = Upgrade Type = Package Target = xmonad [Action] Description = Recompiling xmonad... When = PostTransaction Exec = /usr/bin/sudo -u YOUR_USERNAME /usr/bin/xmonad --recompile
YOUR_USERNAME
は xmonad を実行するユーザーの名前に置き換えてください。
xmonad --recompile
で (XMonad
自体も含む) モジュールが全く認識されない場合、パッケージのデータベースキャッシュを再生成してみてください:
sudo ghc-pkg recache
参照
- xmonad - xmonad 公式ウェブサイト
- xmonad.hs - テンプレート xmonad.hs
- xmonad: a guided tour
- Share your xmonad desktop!
- xmonad hacking thread
- xmonad-log-applet - GNOME, MATE, Xfce パネルのアプレット