xmonad

提供: ArchWiki
ナビゲーションに移動 検索に移動

関連記事

xmonad は、X のタイル型ウィンドウマネージャです。画面を分割し、重なり合わないようにウィンドウを配置することで、画面を最大限に活用することができます。ウィンドウマネージャの機能はキーボードから利用することができます (マウスはオプションです)。

xmonad は Haskell で実装されており、設定や拡張も Haskell で書かれています。レイアウトやキーバインド、その他の設定はユーザーが設定ファイルに書き込むことで変更できます。

レイアウトは動的に適用され、各ワークスペース上で異なるレイアウトを使用することができます。Xinerama が完全にサポートされ、ウィンドウを複数のモニタで並べて表示することができます。

詳細は、xmonad のウェブサイトをご覧ください: http://xmonad.org/

インストール

xmonadインストールしてください。これには基本的な設定が含まれています。追加のタイリングアルゴリズムや設定、スクリプトなど便利なデスクトップ設定を含んでいる xmonad-contrib もインストールすることを推奨します。

また、開発版の xmonad-gitAURxmonad-contrib-gitAUR をインストールすることもできます。

ノート: xmonad をアップグレードしたら xmonad --recompile を忘れずに実行してください。次回起動時に共有ライブラリが見つからずに問題が発生する可能性があります。これを自動的に実行したい場合は#アップデート後に共有ライブラリが見つからないを見て設定してください。

xmonad の起動

xmonad を自動起動するには、起動スクリプトに xmonad コマンドを追加します (例えば、startx を使う場合 ~/.xinitrcXDM ログインマネージャを使う場合 ~/.xsession)。GDMKDM を使う場合は、新しいセッションファイルを作成し、セッションメニューから xmonad を選択します。

Xterm パッケージをインストールするか、設定でターミナルエミュレータを変更しないと Xmonad の中で何もできなくなるので注意してください。

ノート: xmonad はデフォルトでは X のマウスカーソルを変更しません。すなわち、マウスカーソルはクロスマーク x です。左矢印 left_ptr に設定するには起動スクリプト (例: ~/.xinitrc) に以下を追加します: xsetroot -cursor_name left_ptr。こちらも参照してみて下さい カーソルテーマ#形が X のデフォルトカーソルの変更

また、標準では 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 で書かれているため、プログラマーでないとなかなか設定が難しいと思われます。設定例や詳細方法は以下のページを参照して下さい:

最善の方法は組み込みの 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" キーを押すとアクティブウィンドウにマウスバッファが貼り付けられるようになります。

警告:
  • "pasteSelection" は XMonad.Util.XSelection にある "getSelection" を使用しており、"getSelectin" の欠陥を受け継いでいます。
  • "getSelection" は 「根本的に間違った実装になっていて、デッドロックやクラッシュなどの故障になり得ます」。詳細は [1] を見て下さい。
  • 実際問題としては、これらのエラーは存在するものの、起きることは非常に稀です。
ヒント: より詳しい事は [2] にあります。

キーボードショートカット

デフォルトのキーボードショートカットは、 xmonad の man page xmonad(1) § NOTES に列挙されています。

Targeting unbound keys

もし xmonad をスタンドアローンなウィンドウマーネージャとして使うのであれば、 xmonad.hs にバインドされていないキーボードのキーを追加できます。することは、まずキーの Xf86 キーネーム (XF86PowerDown のようなやつ) を、/usr/include/X11/XF86keysym.h で探します。するとキーコード (たとえば 0x1008FF2A) が分かるので、xmonad.hs のキーバインディング部分に次の様に追加します:

((0,    0x1008FF2A), spawn "sudo pm-suspend")

ワークスペースの数を増やす

デフォルトでは、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-contribxmobar です。また、xmobar パッケージの代わりに xmobar-gitAUR を使うこともできます。

ここでは xmonad の中から xmobar を起動して、xmonad をリロードしたときに xmobar もリロードします。

~/.xmonad/xmonad.hs をお好きなエディタで開いて、以下のどちらかの設定を行なってください:

クイック設定

ノート: xmobar の代わりに dzen2 を使うこともできます。

一般的なインポート:

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 を制御

複数の方法が存在します:

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=plasmashellExec= に置き換えてください:

~/.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 ユーザーの設定例です。あなたの設定も自由に追加してください。

トラブルシューティング

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.hsXMonad.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

これでファイルが出来るはずです。

ノート: xmonad-contrib がインストールされていないために xmonad-x86_64-linux が見つからないというエラーメッセージが表示されることもあります。

Java アプリケーションの問題

標準の Java GUI ツールキットは、ハードコーディングされた "non-reparenting" ウィンドウマネージャのリストを持っています。xmonad はそのリストに含まれておらず、稼働中にいくつかの問題が発生する Java アプリケーションがあります。最も一般的な問題の一つは、Java アプリケーションが GUI をレンダリングする代わりに無地で灰色の box をレンダリングする、"gray blobs" です。

これを解決できる方法はいくつかあります。

  • jre7-openjdkjre8-openjdk ならば、 /etc/profile.d/jre.shexport _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 3 の mod4+p で dmenu が起動するかわりにディスプレイの設定が変更されてしまう

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

参照