読者です 読者をやめる 読者になる 読者になる

$ service ssh0 start

from everything import *

イケてると思うxmonadの隙間について【自分のPCで使用しているソフトウェア,設定の紹介 #3】

2016環境紹介

企画説明

前回に引き続き,今回もxmonadについてまとめてみたいと思います。

でも述べている設定については,興味のある人だけ見てもらうことにして, 今回は特にレイアウトの設定について詳しく書きます。

xmonad.hsにおけるレイアウト設定の概要

レイアウトの設定ですが,基本的にはResizableTallを使っています。 左側がマスターエリアで,右側がそれ以外となるようにしていて,キーボードから サイズの変更ができるようになっています。

他には一応"TwoPane"(サブエリアで1つのウィンドウだけ前面に表示されるようにする) とか,”Simplest”(1つのウィンドウのみを前面に表示する)を設定しています。

f:id:ssh0:20160525210029p:plain

Superキー(Windowsキー)を押しながらfキーを押すことでフルスクリーンモード (但し上部のステータスバーは表示したまま)にトグルします。

f:id:ssh0:20160525210058p:plain

ワークスペース(仮想モニタ)は5つ準備していて,ワークスペース3ではフロート表示になるように。

f:id:ssh0:20160525210112p:plain

それから,SpacingモジュールとGapsモジュールを用いることによって,スクリーンショットのように各ウィンドウ間やモニタ境界との間に隙間をおいています。

特定のウィンドウをフロート表示にする,だとか,アプリケーションごとに固有のレイアウトで表示させるだとかは,おそらく自分よりも他の人の方がよく設定されていると思います。 (僕は基本的にはターミナルとブラウザと動画プレーヤーくらいしか使わないので…)

なので,これからは特にSpacingの設定の仕方について,思うところを述べてみようと思います。

Spacing,Gaps機能について

普通他のタイル型でないウィンドウマネージャでも,左右に分割して表示することは可能ですし,それ自体がユニークな機能では当然ありません。が,このSpacingによって,ウィンドウとウィンドウの間に隙間が生まれ,壁紙がちらっと見えることによってPC画面が大変セクシーになります。xmonadを使っているならぜひ使うべき機能だと思います。

ギャップの大きさをどう設定すべきか

Spacingモジュールによって,ウィンドウ間に隙間をおくことができますが,このときの隙間の大きさは自分で設定することができます。 またGapsモジュールを使うと,ウィンドウの上下左右に指定したギャップを入れることができます。

僕がこれらの値を設定するにあたって条件としたことは,

  1. 1画面だけでターミナルを表示した時に,右端,下端まで文字がピッタリが表示されること
  2. 16:9の動画を1枚でタイル表示した時に,アスペクト比を壊さないように(黒い幅が出ないように)
  3. Tallレイアウトでウィンドウを複数表示した時にも,マスタ,サブ両方でターミナルの右端が切れないこと
  4. フルスクリーン表示にした時にターミナルの下端がモニタサイズに合うように

の4つです。 当然モニタサイズやフォントのサイズによって実際の値をどうするべきかは変わってくるのですが,僕の環境では

  • 1920x1080のディスプレイサイズ
  • ターミナル上でフォントは9x19ピクセルで表示される

なので,以下のように設定するといい感じです。

(一部抜粋)

gapwidth  = 9    -- ウィンドウ間のスペース
gwU = 1          -- 上端との間のスペース
gwD = 0          -- 下端との間のスペース
gwL = 42         -- 左端との間のスペース
gwR = 42         -- 右端との間のスペース



myLayout = spacing gapwidth $ gaps [(U, gwU),(D, gwD),(L, gwL),(R, gwR)]
           $ (ResizableTall 1 (1/204) (119/204) [])
             ||| (TwoPane (1/204) (119/204))
             ||| Simplest

f:id:ssh0:20160525210225p:plain

上に挙げた4つの要件を満たすパターンはいくつかあるとは思うのですが,3番目の条件 を考えると,"2×gapwidth"が"9×(整数)"の関係を満たす必要があるので,できるだけ隙間をあけないようにすると,gapwidth=9で固定です。(次に取りうるのはgapwidth=18です)

次に,1画面でのアスペクト比を16:9に保ちながら,ターミナルが文字サイズに合うようにするためには,

16:9 = 9m:19n

を満たすような整数m, nを求める問題となります。しかし,これを満たす最小のm, nはm=304, n=81であり,2736×1539以上のディスプレイ解像度が必要です。 なので厳密に16:9とするのは諦めて,できるだけ16:9から離れないように,と考えるとm=202, n=54とするのがいいように思います。 この条件を満たすように上下左右のスペースを決めてやった結果が,上に挙げたパラメータの値となっています。 このとき,xmobarの高さと上下幅の兼ね合いで,フルスクリーン時に下に隙間ができないように調整することができます。

また,サブ領域にもウィンドウを置くようにしたときにも,マスタ領域の幅を変化させてもターミナルのサイズが文字数と合うようにするためには,横の文字数m(今は202)に,spacingによって挿入されるスペース分の文字数(18px = 2文字)を追加した文字数(204)を基本単位として分割幅を指定します。

僕の設定では一番細かく1/204としていますが,1/102でも,1/51でも1/17でも大丈夫です。

それから,初期マスタ領域の大きさを(119/204)のように分母に204を指定した大きさにする必要もあります。

詳しくはこちらを参照に

github.com

まとめ

xmonadの設定の,特にSpacingの話題についてまとめてみました。 はっきり言ってここまでやってる人を自分以外見たことがないので,有益かと言われると首をかしげたくなるところですが,1年くらい前の自分だったら喜んで参考にしたと思うので,もし似た境遇の人がいたとしたら,その人の約にはたつ内容だと思います。

それ以外の人はごめんなさいって感じです。

ここまで読んでくださった方に感謝。

明日はtmuxの活用法とオレオレキーバインドを紹介します。