「Xmonad」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎X-Selection-Paste: 英語版に加わった warning を追記。)
(校正(でき・出来))
 
(他の1人の利用者による、間の9版が非表示)
167行目: 167行目:
 
デフォルトのキーボードショートカットは、 xmonad の man page {{man|1|xmonad|NOTES}} に列挙されています。
 
デフォルトのキーボードショートカットは、 xmonad の man page {{man|1|xmonad|NOTES}} に列挙されています。
   
  +
=== バインドされていないキーをターゲットにする ===
=== Targeting unbound keys ===
 
   
 
もし xmonad をスタンドアローンなウィンドウマーネージャとして使うのであれば、 {{ic|xmonad.hs}} にバインドされていないキーボードのキーを追加できます。することは、まずキーの Xf86 キーネーム (XF86PowerDown のようなやつ) を、{{ic|/usr/include/X11/XF86keysym.h}} で探します。するとキーコード (たとえば 0x1008FF2A) が分かるので、{{ic|xmonad.hs}} のキーバインディング部分に次の様に追加します:
 
もし xmonad をスタンドアローンなウィンドウマーネージャとして使うのであれば、 {{ic|xmonad.hs}} にバインドされていないキーボードのキーを追加できます。することは、まずキーの Xf86 キーネーム (XF86PowerDown のようなやつ) を、{{ic|/usr/include/X11/XF86keysym.h}} で探します。するとキーコード (たとえば 0x1008FF2A) が分かるので、{{ic|xmonad.hs}} のキーバインディング部分に次の様に追加します:
   
 
((0, 0x1008FF2A), spawn "sudo pm-suspend")
 
((0, 0x1008FF2A), spawn "sudo pm-suspend")
  +
  +
=== マウスで画面の端をタッチして X () アクションを実行する ===
  +
  +
[https://hackage.haskell.org/package/xmonad-contrib-0.16/docs/XMonad-Hooks-ScreenCorners.html XMonad.Hooks.ScreenCorners] を使用すると、ユーザーは XMonad を使用して KDE のような画面コーナーを設けることができます。
  +
  +
==== ScreenCorners でワークスペースを切り替える (KDE のような) ====
  +
  +
startHook で一連の操作を定義します:
  +
  +
{{hc|xmonad.hs|
  +
<nowiki>
  +
...
  +
import XMonad.Hooks.ScreenCorners
  +
...
  +
  +
mystartupHook = do
  +
...
  +
... example ...
  +
addScreenCorners [ (SCLowerLeft, prevWS)
  +
, (SCLowerRight, nextWS)
  +
, (SCUpperLeft, spawnSelected' myAppGrid)
  +
, (SCUpperRight, goToSelected $ mygridConfig' myColorizer)
  +
]
  +
...
  +
</nowiki>
  +
}}
  +
  +
次に、screenCornerEventHook を handleEventHook に追加します:
  +
  +
myConfig = def {
  +
...
  +
handleEventHook = ... <+> screenCornerEventHook <+> ...
  +
...
  +
}
  +
  +
最後に screenCornerLayoutHook を追加します:
  +
  +
...
  +
myLayoutHook = screenCornerLayoutHook $ ......
  +
...
  +
myConfig = def {
  +
...
  +
layoutHook = myLayoutHook
  +
...
  +
}
  +
  +
{{Note|1=<nowiki/>
  +
* この拡張機能は、KDE ​​のような画面コーナーを XMonad に追加します。
  +
* * カーソルを画面隅の1つに移動すると、XMonad.Actions.GridSelect.goToSelected や XMonad.Actions.CycleWS.nextWS などの X () アクションをトリガーできます。}}
   
 
=== ワークスペースの数を増やす ===
 
=== ワークスペースの数を増やす ===
199行目: 248行目:
 
| (key, ws) <- myExtraWorkspaces
 
| (key, ws) <- myExtraWorkspaces
 
]</nowiki>}}
 
]</nowiki>}}
  +
  +
=== 重複したキーバインディングをチェックする ===
  +
  +
[https://hackage.haskell.org/package/xmonad-contrib-0.16/docs/XMonad-Util-EZConfig.html XMonad.Util.EZConfig] は、重複したキーバインディングをチェックする関数 {{ic|checkKeymap}} を提供しますそうでない場合、重複は黙って無視されます。
  +
  +
{{hc|xmonad.hs|
  +
<nowiki>main = xmonad $ myConfig
  +
  +
myKeymap = [("S-M-c", kill), ...]
  +
myConfig = def {
  +
...
  +
startupHook = do
  +
return () >> checkKeymap myConfig myKeymap
  +
...other operation you defined here...
  +
...
  +
} `additionalKeysP` myKeymap</nowiki>}}
  +
{{Note|
  +
* {{ic|return ()}} 上の例では、これは非常に重要です。そうしないと、無限相互再帰の問題が発生する可能性があります。
  +
* {{ic|return ()}} デッドロックを打破するのに十分な遅延が導入されます。myConfig の定義は、startupHook の定義に依存し、startupHook の定義は、myConfig の定義に依存します。}}
   
 
=== ドックやパネル、トレイ (Xmobar, Tint2, Conky など) のための空間を作る ===
 
=== ドックやパネル、トレイ (Xmobar, Tint2, Conky など) のための空間を作る ===
217行目: 285行目:
 
隙間を切り替えたい場合、以下のアクションをキーバインドに追加してください:
 
隙間を切り替えたい場合、以下のアクションをキーバインドに追加してください:
 
,((modMask x, xK_b ), sendMessage ToggleStruts)
 
,((modMask x, xK_b ), sendMessage ToggleStruts)
  +
  +
=== ウィンドウにタグを追加する ===
  +
  +
[https://hackage.haskell.org/package/xmonad-contrib-0.16/docs/XMonad-Actions-TagWindows.html XMonad.Actions.TagWindows] を使用すると、ユーザーは同じタグを持つウィンドウを操作できます。
  +
{{hc|xmonad.hs|
  +
...
  +
import XMonad.Actions.TagWindows
  +
...
  +
<nowiki>
  +
myKeys =
  +
... other key bindings ...
  +
-- Tag
  +
-- , ("M-C-t", withFocused (addTag "abc")) -- add a specific tag "abc"
  +
-- , ("M-C-d", withFocused (delTag "abc")) -- delete the tag "abc" from the focused window
  +
-- , ("M-C-h", withTaggedGlobalP "abc" shiftHere) -- shift windows with tag "abc" here
  +
, ("M-C-a", tagPrompt defaultXPConfig $ withFocused . addTag ) -- prompt for inputs of tag names
  +
, ("M-C-h", tagPrompt defaultXPConfig (`withTaggedGlobalP` shiftHere)) -- shift windows with user defined tags (input) here
  +
, ("M-C-d", tagDelPrompt defaultXPConfig) -- delete a user-defined tag (input)
  +
, ("M-C-t", tagPrompt defaultXPConfig focusUpTaggedGlobal) -- switch between windows in all workspaces with user-defined tags (input)
  +
, ("M-C-f", tagPrompt defaultXPConfig (`withTaggedGlobal` float)) -- float windows with user-defined tags (input)
  +
</nowiki>
  +
}}
  +
  +
=== ウィンドウ間のギャップを同じ大きさにする ===
  +
  +
個々のウィンドウと画面間のギャップを同じサイズにすることが目標の場合、次のコードは期待どおりに機能しません:
  +
layoutHook = spacing 10 $ Tall 1 (3/100) (1/2) ||| Full
  +
  +
これにより、各ウィンドウが各方向に独自の間隔を持つようになります。2つのウィンドウを並べて配置すると、中央の間隔が結合されて、必要な2倍の大きさの隙間が生じます。
  +
  +
回避策は、画面とウィンドウの間隔の両方を指定しますが、画面には上と左のマージン、ウィンドウには下と右のマージンのみを使用します。これを行うには、上記のコードを次のように変更します:
  +
  +
layoutHook = spacingRaw False (Border 10 0 10 0) True (Border 0 10 0 10) True $ Tall 1 (3/100) (1/2) ||| Full
   
 
=== xmonad で xmobar を使う ===
 
=== xmonad で xmobar を使う ===
370行目: 471行目:
   
 
== トラブルシューティング ==
 
== トラブルシューティング ==
 
=== GNOME 3 と xmonad ===
 
 
[[GNOME]] 3 から、GNOME で xmonad を使うには設定を追加する必要があります。
 
 
gnome-session で使用するための xmonad のセッションファイルを追加 ({{ic|/usr/share/gnome-session/sessions/xmonad.session}}):
 
 
{{bc|1=
 
[GNOME Session]
 
Name=Xmonad session
 
RequiredComponents=gnome-panel;gnome-settings-daemon;
 
RequiredProviders=windowmanager;notifications;
 
DefaultProvider-windowmanager=xmonad
 
DefaultProvider-notifications=notification-daemon
 
}}
 
 
GDM のデスクトップファイルを作成 ({{ic|/usr/share/xsessions/xmonad-gnome-session.desktop}}):
 
{{bc|1=
 
[Desktop Entry]
 
Name=Xmonad GNOME
 
Comment=Tiling window manager
 
TryExec=/usr/bin/gnome-session
 
Exec=gnome-session --session=xmonad
 
Type=XSession
 
}}
 
 
以下のファイルを作成・編集 ({{ic|/usr/share/applications/xmonad.desktop}}):
 
{{bc|1=
 
[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
 
}}
 
 
最後に、{{pkg|xmonad-contrib}} をインストールして {{ic|~/.xmonad/xmonad.hs}} を以下のように作成・編集:
 
 
{{bc|1=
 
import XMonad
 
import XMonad.Config.Gnome
 
 
main = xmonad gnomeConfig
 
}}
 
 
これで GDM のセッションリストに Xmonad が表示され、gnome-session で扱えるようになります。
 
 
==== GNOME と Xmonad でコンポジット ====
 
 
コンポジットを有効にすることで一部のアプリケーション (例: GNOME Do) の見た目が良くなります。ただし Xmonad のデフォルト設定ではコンポジットが有効になっていません。有効にするには {{ic|.desktop}} ファイルを作成してください ({{ic|/usr/share/xsessions/xmonad-gnome-session-composite.desktop}}):
 
{{bc|1=
 
[Desktop Entry]
 
Name=Xmonad GNOME (Composite)
 
Comment=Tiling window manager
 
TryExec=/usr/bin/gnome-session
 
Exec=/usr/sbin/gnome-xmonad-composite
 
Type=XSession
 
}}
 
そして {{ic|/usr/sbin/gnome-xmonad-composite}} を作成して {{ic|chmod +x /usr/sbin/gnome-xmonad-composite}} を実行:
 
 
{{bc|1=
 
xcompmgr &
 
gnome-session --session=xmonad
 
}}
 
 
ログイン時のセッションリストから "Xmonad GNOME (Composite)" を選択するようにしてください。詳しくは {{man|1|xcompmgr}} を参照。
 
   
 
=== Xfce 4 と xmonad ===
 
=== Xfce 4 と xmonad ===
455行目: 486行目:
 
また、''Settings > Session and Startup > Application Autostart'' から {{ic|xmonad --replace}} を実行するエントリを追加してください。
 
また、''Settings > Session and Startup > Application Autostart'' から {{ic|xmonad --replace}} を実行するエントリを追加してください。
   
=== xmonad-i386-linux や xmonad-x86_64-linux が存在しない ===
+
=== xmonad-x86_64-linux が存在しない ===
   
 
Xmonad は自動的に {{ic|xmonad-i386-linux}} ファイルを ({{ic|~/.xmonad/}} の中に) 作成します。作成されない場合、[http://haskell.org/haskellwiki/Xmonad/Config_archive xmonad wiki] から設定を入手するか [http://haskell.org/haskellwiki/Xmonad/Config_archive/John_Goerzen's_Configuration 自分で] 設定を書いてください。{{ic|.hs}} などのファイルを {{ic|~/.xmonad/}} に配置したら、フォルダの中から以下のコマンドを実行:
 
Xmonad は自動的に {{ic|xmonad-i386-linux}} ファイルを ({{ic|~/.xmonad/}} の中に) 作成します。作成されない場合、[http://haskell.org/haskellwiki/Xmonad/Config_archive xmonad wiki] から設定を入手するか [http://haskell.org/haskellwiki/Xmonad/Config_archive/John_Goerzen's_Configuration 自分で] 設定を書いてください。{{ic|.hs}} などのファイルを {{ic|~/.xmonad/}} に配置したら、フォルダの中から以下のコマンドを実行:
 
xmonad --recompile
 
xmonad --recompile
   
これでファイルが出来るはずです。
+
これでファイルができるはずです。
   
 
{{Note|{{Pkg|xmonad-contrib}} がインストールされていないために xmonad-x86_64-linux が見つからないというエラーメッセージが表示されることもあります。}}
 
{{Note|{{Pkg|xmonad-contrib}} がインストールされていないために xmonad-x86_64-linux が見つからないというエラーメッセージが表示されることもあります。}}
480行目: 511行目:
   
 
=== gvim やターミナルの底部の空きスペース ===
 
=== gvim やターミナルの底部の空きスペース ===
  +
 
スペースを背景色と合わせる方法は [[Vim#gVim ウィンドウの底部の空きスペース]]を見てください。
 
スペースを背景色と合わせる方法は [[Vim#gVim ウィンドウの底部の空きスペース]]を見てください。
   
487行目: 519行目:
   
 
=== Chromium/Chrome がフルスクリーンにならない ===
 
=== Chromium/Chrome がフルスクリーンにならない ===
  +
 
{{ic|F11}} を押したときに Chrome がフルスクリーンにならない場合、{{Pkg|xmonad-contrib}} パッケージに含まれている [http://xmonad.org/xmonad-docs/xmonad-contrib/XMonad-Hooks-EwmhDesktops.html XMonad.Hooks.EwmhDesktops] 拡張を使ってください。{{ic|~/.xmonad/xmonad.hs}} に以下の {{ic|import}} 文を追加するだけです:
 
{{ic|F11}} を押したときに Chrome がフルスクリーンにならない場合、{{Pkg|xmonad-contrib}} パッケージに含まれている [http://xmonad.org/xmonad-docs/xmonad-contrib/XMonad-Hooks-EwmhDesktops.html XMonad.Hooks.EwmhDesktops] 拡張を使ってください。{{ic|~/.xmonad/xmonad.hs}} に以下の {{ic|import}} 文を追加するだけです:
 
import XMonad.Hooks.EwmhDesktops
 
import XMonad.Hooks.EwmhDesktops
514行目: 547行目:
 
gnome-control-center のディスプレイ設定を切り替える必要がない場合、ユーザーで以下を実行することで xrandr プラグインで Super+p を使用するのを止めさせることができます:
 
gnome-control-center のディスプレイ設定を切り替える必要がない場合、ユーザーで以下を実行することで xrandr プラグインで Super+p を使用するのを止めさせることができます:
 
$ dconf write /org/gnome/settings-daemon/plugins/xrandr/active false
 
$ dconf write /org/gnome/settings-daemon/plugins/xrandr/active false
  +
  +
=== Chrome/Chromium で定義されたウィンドウのボーダーの色が表示されない ===
  +
  +
Chromium および Chrome ブラウザウィンドウには、デフォルトで定義されたボーダーの色はなく、ぼやけた透明なボーダーの色が表示されます。[https://xmonad.haskell.narkive.com/3NiS9dFl/transparent-border-with-chrome-beta-unstable この問題は長い間知られていました] が、修正するのは簡単です。
  +
ブラウザのオプションで `Use system title bar and borders` を有効にすると、この問題はすぐに修正されます。
   
 
=== VirtualBox でフォーカスしたボーダーの問題 ===
 
=== VirtualBox でフォーカスしたボーダーの問題 ===
519行目: 557行目:
 
Virtualbox には既知の問題 ([https://www.virtualbox.org/ticket/6479 Ticket #6479]) が存在し、フォーカスされたウィンドウのボーダーに問題が発生します。[[xcompmgr]] などのコンポジットマネージャをインストールして vboxvideo の挙動を上書きすることで解決できます。
 
Virtualbox には既知の問題 ([https://www.virtualbox.org/ticket/6479 Ticket #6479]) が存在し、フォーカスされたウィンドウのボーダーに問題が発生します。[[xcompmgr]] などのコンポジットマネージャをインストールして vboxvideo の挙動を上書きすることで解決できます。
   
=== Steam のゲーム (Half-Life, Left 4 Dead, ) と xmonad ===
+
=== Steam のゲーム (Half-Life, Left 4 Dead, ...) と xmonad ===
   
 
Source エンジンを使っているゲーム (Half-Life など) で問題が発生することがあります。ゲームが起動しなかったり黒い画面から進まないときは、ウィンドウモードで起動してみてください: ライブラリのゲームを右クリックして、起動オプションに以下のように入力 ([https://steamcommunity.com/app/221410/discussions/0/864960353968561426/] を参照):
 
Source エンジンを使っているゲーム (Half-Life など) で問題が発生することがあります。ゲームが起動しなかったり黒い画面から進まないときは、ウィンドウモードで起動してみてください: ライブラリのゲームを右クリックして、起動オプションに以下のように入力 ([https://steamcommunity.com/app/221410/discussions/0/864960353968561426/] を参照):
528行目: 566行目:
   
 
className =? "hl_linux" --> doFloat
 
className =? "hl_linux" --> doFloat
  +
  +
=== LibreOffice - メインウィンドウとダイアログ間のフォーカスフリック ===
  +
  +
LibreOffice UI は、デスクトップ環境外ではデフォルトで gtk エンジンになります。これにより、一部の xmonad 設定で問題が発生し、LibreOffice メインウィンドウと開いている LibreOffice ダイアログウィンドウの間でフォーカスが急速に移動する可能性があり、アプリケーションを効果的にロックします。この場合、[[環境変数]] {{ic|SAL_USE_VCLPLUGIN}} を設定して、[[LibreOffice#テーマ]] で説明されているように、LibreOffice に別の UI テーマを明示的に強制的に使用させることができます。
  +
  +
$ export SAL_USE_VCLPLUGIN=gen lowriter
  +
  +
一般 (QT) UI を使用します。
  +
  +
=== IntelliJ IDEA と xmonad ===
  +
  +
==== ダイアログウィンドウ ====
  +
  +
[[IntelliJ IDEA]] では、タイルウィンドウマネージャーのサポートが強化されました。しかし、依然として厄介な問題がいくつかあり、その一部には簡単な解決策があります:
  +
  +
* マウスポインタがダイアログウィンドウの境界の外に出ると、''Find In Files'' ダイアログウィンドウがすぐに閉じます。これは ''Find In Files'' ダイアログウィンドウでのみ発生し、''Navigate to...'' ダイアログウィンドウでは再現できません。"focus follows mouse" ロジックを想定している場合、''Find In Files'' の動作は予期されています。すべてのシステムへのフォーカスが失われると、''Find In Files'' ウィンドウが閉じます。
  +
:'''解決策''': ポップアップを ''固定'' することで変更できます。対応するボタンが右上隅にあります [https://youtrack.jetbrains.com/issue/IDEA-65637#focus=Comments- 27-5142464.0-0】
  +
* Git コミット間で変更されたファイルを表示すると (''aaaa とローカルバージョン bbbb 間の変更'' ダイアログを使用)、ファイルレベルの差分を含むウィンドウがダイアログウィンドウの後ろに開きます。
  +
:'''解決策''': 不明
   
 
=== アップデート後に共有ライブラリが見つからない ===
 
=== アップデート後に共有ライブラリが見つからない ===
550行目: 607行目:
   
 
sudo ghc-pkg recache
 
sudo ghc-pkg recache
  +
  +
=== XMonad.Prompt とウィンドウが壊れているか欠落している ===
  +
  +
XMonad はデフォルトでフォント {{ic|-misc-fixed-*-*-*-*-10-*-*-*-*-*-*-*}} を使用します [https://wiki.haskell.org/Xmonad/Frequently_asked_questions#Tabbed_or_other_decorated_layouts_not_shown]
  +
このフォントが見つからない場合、それらのウィンドウはレンダリングに失敗します。最も簡単な修正は、{{Pkg|xorg-fonts-misc}} をインストールすることです。
   
 
== 参照 ==
 
== 参照 ==

2024年7月10日 (水) 20:45時点における最新版

関連記事

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 に列挙されています。

バインドされていないキーをターゲットにする

もし 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 
   ...
   }
ノート:
  • この拡張機能は、KDE ​​のような画面コーナーを XMonad に追加します。
  • * カーソルを画面隅の1つに移動すると、XMonad.Actions.GridSelect.goToSelected や XMonad.Actions.CycleWS.nextWS などの X () アクションをトリガーできます。

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

デフォルトでは、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
    ]

重複したキーバインディングをチェックする

XMonad.Util.EZConfig は、重複したキーバインディングをチェックする関数 checkKeymap を提供しますそうでない場合、重複は黙って無視されます。

xmonad.hs
main = xmonad $ myConfig

myKeymap = [("S-M-c", kill), ...]
myConfig = def {
    ...
    startupHook = do
        return () >> checkKeymap myConfig myKeymap
        ...other operation you defined here...
    ...
} `additionalKeysP` myKeymap
ノート:
  • return () 上の例では、これは非常に重要です。そうしないと、無限相互再帰の問題が発生する可能性があります。
  • return () デッドロックを打破するのに十分な遅延が導入されます。myConfig の定義は、startupHook の定義に依存し、startupHook の定義は、myConfig の定義に依存します。

ドックやパネル、トレイ (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.Actions.TagWindows を使用すると、ユーザーは同じタグを持つウィンドウを操作できます。

xmonad.hs
...
import XMonad.Actions.TagWindows
...

myKeys = 
... other key bindings ...
-- Tag
         --  , ("M-C-t", withFocused (addTag "abc")) -- add a specific tag "abc"
         --  , ("M-C-d", withFocused (delTag "abc")) -- delete the tag "abc" from the focused window
         --  , ("M-C-h", withTaggedGlobalP "abc" shiftHere) -- shift windows with tag "abc" here
             , ("M-C-a", tagPrompt defaultXPConfig $ withFocused . addTag ) -- prompt for inputs of tag names
             , ("M-C-h", tagPrompt defaultXPConfig (`withTaggedGlobalP` shiftHere))  -- shift windows with user defined tags (input) here
             , ("M-C-d", tagDelPrompt defaultXPConfig)  -- delete a user-defined tag (input)
             , ("M-C-t", tagPrompt defaultXPConfig  focusUpTaggedGlobal)  -- switch between windows in all workspaces with user-defined tags (input)
             , ("M-C-f", tagPrompt defaultXPConfig (`withTaggedGlobal` float)) -- float windows with user-defined tags (input)

ウィンドウ間のギャップを同じ大きさにする

個々のウィンドウと画面間のギャップを同じサイズにすることが目標の場合、次のコードは期待どおりに機能しません:

layoutHook = spacing 10 $ Tall 1 (3/100) (1/2) ||| Full

これにより、各ウィンドウが各方向に独自の間隔を持つようになります。2つのウィンドウを並べて配置すると、中央の間隔が結合されて、必要な2倍の大きさの隙間が生じます。

回避策は、画面とウィンドウの間隔の両方を指定しますが、画面には上と左のマージン、ウィンドウには下と右のマージンのみを使用します。これを行うには、上記のコードを次のように変更します:

 layoutHook = spacingRaw False (Border 10 0 10 0) True (Border 0 10 0 10) True $ Tall 1 (3/100) (1/2) ||| Full

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

トラブルシューティング

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

Chrome/Chromium で定義されたウィンドウのボーダーの色が表示されない

Chromium および Chrome ブラウザウィンドウには、デフォルトで定義されたボーダーの色はなく、ぼやけた透明なボーダーの色が表示されます。この問題は長い間知られていました が、修正するのは簡単です。 ブラウザのオプションで `Use system title bar and borders` を有効にすると、この問題はすぐに修正されます。

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

LibreOffice - メインウィンドウとダイアログ間のフォーカスフリック

LibreOffice UI は、デスクトップ環境外ではデフォルトで gtk エンジンになります。これにより、一部の xmonad 設定で問題が発生し、LibreOffice メインウィンドウと開いている LibreOffice ダイアログウィンドウの間でフォーカスが急速に移動する可能性があり、アプリケーションを効果的にロックします。この場合、環境変数 SAL_USE_VCLPLUGIN を設定して、LibreOffice#テーマ で説明されているように、LibreOffice に別の UI テーマを明示的に強制的に使用させることができます。

$ export SAL_USE_VCLPLUGIN=gen lowriter

一般 (QT) UI を使用します。

IntelliJ IDEA と xmonad

ダイアログウィンドウ

IntelliJ IDEA では、タイルウィンドウマネージャーのサポートが強化されました。しかし、依然として厄介な問題がいくつかあり、その一部には簡単な解決策があります:

  • マウスポインタがダイアログウィンドウの境界の外に出ると、Find In Files ダイアログウィンドウがすぐに閉じます。これは Find In Files ダイアログウィンドウでのみ発生し、Navigate to... ダイアログウィンドウでは再現できません。"focus follows mouse" ロジックを想定している場合、Find In Files の動作は予期されています。すべてのシステムへのフォーカスが失われると、Find In Files ウィンドウが閉じます。
解決策: ポップアップを 固定 することで変更できます。対応するボタンが右上隅にあります [https://youtrack.jetbrains.com/issue/IDEA-65637#focus=Comments- 27-5142464.0-0】
  • Git コミット間で変更されたファイルを表示すると (aaaa とローカルバージョン bbbb 間の変更 ダイアログを使用)、ファイルレベルの差分を含むウィンドウがダイアログウィンドウの後ろに開きます。
解決策: 不明

アップデート後に共有ライブラリが見つからない

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.Prompt とウィンドウが壊れているか欠落している

XMonad はデフォルトでフォント -misc-fixed-*-*-*-*-10-*-*-*-*-*-*-* を使用します [5] このフォントが見つからない場合、それらのウィンドウはレンダリングに失敗します。最も簡単な修正は、xorg-fonts-misc をインストールすることです。

参照