🏛️

【Emacs入門】②バージョン28で新たにビルトインされるModus Themesを使おう

8 min read


modus-vivendi


DAP Mode

今回は見た目、テーマについてです。

あくまでも私の印象ですが、Emacsには「これぞEmacs」というようなEmacsを代表するようなテーマがなかなか見当たらないように思います。VimにはSolarizedを初めとしてVimから始まったテーマがたくさんありますし、Electron系のエディタはオリジナルのデフォルトのテーマからしてとても見映えが良いです。一方Emacsはと言えば他のエディタのテーマの移植モノばかりで、Emacsから始まってチヤホヤされているテーマが見当たりません(私の調査力も当てにならないので何かありましたら教えてください)。

Doom系のテーマ群は見映えはするのですが、主に他のエディタで名を馳せたテーマの移植組で構成されていたので見送りました。Spacemacsのデフォルトテーマはアリかもと思いましたが、DoomもそうですがSpacemacs自体を使わないのにテーマだけ使うジレンマに耐えきれず見送りました。

そんなこんなで途方に暮れていた時にSacha ChuaさんのEmacs newsでModus Themesというものがあることを知りました。これはEmacsのために作られたテーマで、次期メジャーバージョン28からEmacs本体にビルトインされます。公式リポジトリでも確認できますね。このテーマは、WCAG(ウェブコンテンツのアクセシビリティに関するガイドライン)において最高水準であるAAAに準拠しているとのことです。

Emacsのバージョン28はまだ正式にリリースされていませんが、Modus ThemesはELPAで公開されているのでパッケージを追加することで普通に使えます(但しバージョン26.1以降が必要です)。執筆時の私のバージョンは27.2ですが問題なく使えています。

従来のビルトインされているテーマ群より見映えは良いですし、何より高機能で使いやすいのでここで紹介したいと思います。

インストール

まずEmacsを起動してAltキー(macOSはoptionキー)を押しながらxキーを押下します。画面下部(ミニバッファ)にカーソルが移動しますので、list-packages と入力(Tabキーで補完可能)してエンターキーを押下します。ちなみにEmacsでは、Altキー(macOSはoptionキー)を押しながらxキーを押下することを M-x と表現します。M はメタキーのMです。

Emacsを拡張できるパッケージの一覧が表示されるので、ここからModus Themesを探します。Modus Themesにカーソルを移動してiキーを押下するとインストールフラグのIマークが表示されます。これはこれからインストールするパッケージが選択されたことを意味します。この状態でxキーを押下するとインストールが実行されます。iはinstall、xはexecuteですね。

Modus Themesを設定する

Modus Themesの公式リポジトリはGitLabにあります。GitHubにもミラーがあります。リポジトリのREADME.mdを読むと分かりやすく使い方が記されているのですが、設定例がuse-package(パッケージの設定を見やすく簡便化するパッケージ)を使った例なので、ここではuse-packageを使わないベーシックな設定例を挙げることにします。

README.mdのQuick setup for the latest versionをuse-packageを使わずに書き直してみます。

init.el
(require 'modus-themes)                                ;; 1
(setq modus-themes-italic-constructs t                 ;; 2
      modus-themes-bold-constructs nil                 ;; 3
      modus-themes-region '(bg-only no-extend))        ;; 4
(modus-themes-load-themes)                             ;; 5
(modus-themes-load-operandi)                           ;; 6
(global-set-key (kbd "<f5>") 'modus-themes-toggle)     ;; 7
  1. modus-themesを読み込みます。この記述は設定方法によっては省略できるのですが、ここでは敢えて記述します。詳細はまた別の機会でお話します。
  2. コメントなどをイタリック体にします。(t : 有効 / nil : 無効)
  3. 特定のフォントを太字にします。(t : 有効 / nil : 無効)
  4. 範囲選択したテキストの反転表示を設定します。region(リージョン) とは範囲選択された部分とほぼ同義です。
  5. 2~4の設定を反映させてmodus-themesをロードします。
  6. 2種類のテーマ(ライト: modus-operandi / ダーク: modus-vivendi)から好みのものを選びます。ダークカラーにするには (modus-themes-load-vivendi) とします。
  7. F5キーを押下することで2種類のテーマを切り替えることができるようにキーバインドを設定します。

より細かく設定する

上述設定例の2~4の部分を下記(公式README.mdより抜粋)に置き換えることでより細かく設定できます。シンタックスハイライトの設定項目である modus-themes-syntax は、デフォルトの nil 以外に faint yellow-comments green-strings alt-syntax から選択できます。結構印象が変わりますので好みのものを見つけてください。私はダークテーマの modus-vivendifaint を使用しています。

ここでは個別に細かく触れることはしませんが、値をいろいろ変更してみて見た目がどう変わるか試してみるとよいと思います。

init.el
(setq modus-themes-italic-constructs t
      modus-themes-bold-constructs nil
      modus-themes-no-mixed-fonts nil
      modus-themes-subtle-line-numbers nil
      modus-themes-success-deuteranopia t
      modus-themes-inhibit-reload t ; only applies to `customize-set-variable' and related

      modus-themes-fringes nil ; {nil,'subtle,'intense}

      ;; Options for `modus-themes-lang-checkers' are either nil (the
      ;; default), or a list of properties that may include any of those
      ;; symbols: `straight-underline', `text-also', `background',
      ;; `intense'
      modus-themes-lang-checkers nil

      ;; Options for `modus-themes-mode-line' are either nil, or a list
      ;; that can combine any of `3d' OR `moody', `borderless',
      ;; `accented'.  The variable's doc string shows all possible
      ;; combinations.
      modus-themes-mode-line '(3d accented)

      ;; Options for `modus-themes-syntax' are either nil (the default),
      ;; or a list of properties that may include any of those symbols:
      ;; `faint', `yellow-comments', `green-strings', `alt-syntax'
      modus-themes-syntax nil

      ;; Options for `modus-themes-hl-line' are either nil (the default),
      ;; or a list of properties that may include any of those symbols:
      ;; `accented', `underline', `intense'
      modus-themes-hl-line '(underline accented)

      ;; Options for `modus-themes-paren-match' are either nil (the
      ;; default), or a list of properties that may include any of those
      ;; symbols: `bold', `intense', `underline'
      modus-themes-paren-match '(bold intense)

      ;; Options for `modus-themes-links' are either nil (the default),
      ;; or a list of properties that may include any of those symbols:
      ;; `neutral-underline' OR `no-underline', `faint' OR `no-color',
      ;; `bold', `italic', `background'
      modus-themes-links '(neutral-underline background)

      ;; Options for `modus-themes-prompts' are either nil (the
      ;; default), or a list of properties that may include any of those
      ;; symbols: `background', `bold', `gray', `intense', `italic'
      modus-themes-prompts '(intense bold)

      modus-themes-completions 'moderate ; {nil,'moderate,'opinionated}

      modus-themes-mail-citations nil ; {nil,'faint,'monochrome}

      ;; Options for `modus-themes-region' are either nil (the default),
      ;; or a list of properties that may include any of those symbols:
      ;; `no-extend', `bg-only', `accented'
      modus-themes-region '(bg-only no-extend)

      ;; Options for `modus-themes-diffs': nil, 'desaturated,
      ;; 'bg-only, 'deuteranopia, 'fg-only-deuteranopia
      modus-themes-diffs 'fg-only-deuteranopia

      modus-themes-org-blocks 'gray-background ; {nil,'gray-background,'tinted-background}

      modus-themes-org-agenda ; this is an alist: read the manual or its doc string
      '((header-block . (variable-pitch scale-title))
        (header-date . (grayscale workaholic bold-today))
        (scheduled . uniform)
        (habit . traffic-light-deuteranopia))

      modus-themes-headings ; this is an alist: read the manual or its doc string
      '((1 . (overline background))
        (2 . (rainbow overline))
        (t . (no-bold)))

      modus-themes-variable-pitch-ui nil
      modus-themes-variable-pitch-headings t
      modus-themes-scale-headings t
      modus-themes-scale-1 1.1
      modus-themes-scale-2 1.15
      modus-themes-scale-3 1.21
      modus-themes-scale-4 1.27
      modus-themes-scale-title 1.33)

個人的にちょっとおもしろいなと思ったのは、Moodyというモードラインの見た目を変更できるパッケージ(記事先頭の画像を参照)がサポートされているところですね。

ちなみに執筆時点での私の設定は以下です。

init.el
(setq modus-themes-slanted-constructs t
      modus-themes-bold-constructs t
      modus-themes-no-mixed-fonts t
      modus-themes-subtle-line-numbers t
      modus-themes-mode-line '(moody borderless)
      modus-themes-syntax 'faint
      modus-themes-paren-match 'intense-bold
      modus-themes-region 'bg-only
      modus-themes-diffs 'deuteranopia
      modus-themes-org-blocks 'gray-background
      modus-themes-variable-pitch-ui t
      modus-themes-variable-pitch-headings t
      modus-themes-scale-headings t
      modus-themes-scale-1 1.1
      modus-themes-scale-2 1.15
      modus-themes-scale-3 1.21
      modus-themes-scale-4 1.27
      modus-themes-scale-title 1.33)

余談

Modus ThemesがVimやVS Codeに移植されました。

modus-themes-vim
Modus Vivendi theme for VSCode

他のエディタからEmacsへの移植は多々あると思いますが、この逆のパターンはあまり見ないのでちょっと嬉しいです。