EmacsでGUI向け設定とCUI向け設定を混在させる際の注意点

要約

  • Emacsにはwindow-systemという変数が用意されています[1]。これを評価することで読み込む設定を分岐させることが出来ます。
  1. (when window-system (progn
  2.     ;; GUI用設定
  3. ))
  4. (when (not window-system) (progn
  5.     ;; CUI用設定
  6. ))
  • use-package.elを使用している箇所に関しては、ifキーワードでwindow-systemを評価すると良さそうです[2]。
  1. (use-package hoge
  2.   :if window-system
  3.   ...
  4. )
  • [重要] CUIでは Ctrl + ; Ctrl + . といったキーバインドを使用することが基本的に出来ません。どうしても使用したい場合はターミナルの設定を変更する必要があります[3][4]。

何があったの?

某ウイルスの影響でリモートワークが推奨されており、リモート環境での作業がメインとなっている方が多いのではないでしょうか。

さて、GUI版Emacsを常用している私ですが、早速ローカルでGUI版Emacsを立ち上げ、TRAMPでリモートのファイルにアクセスしてみたところ、まともな開発を行うのは難しいということが分かりました。

単純なテキスト編集だけならTRAMPで十分なのですが、magitやtreemacs、lsp-mode等によるモダンな開発をTRAMPを用いて行おうとすると、とてもではありませんがラグが大きすぎます(サーバへのアクセス速度は問題なさそうだった)。

という訳で、VSCodeのRemote Developmentを試そう…と思ったのですが、今使っているEmacs(100個近い拡張機能が入っている)と同等の環境を整えるのはあまりに面倒だなあとなり、原始的な解決方法、つまり、リモートのターミナルでEmacsをCUI起動する方法を取ることにしました。また時代から取り残されてしまった(Emacsも日々進化しているのでそんなことはないと思っています)。

このとき、今までGUI向けに書いていた設定でCUI版Emacsが動作するのかが問題となります。試してみたところ、大体は動きましたが、一部のキーバインドを変更する必要がありました。

[重要] CUIでは Ctrl + ; Ctrl + . といったキーバインドを使用することが基本的に出来ません。どうしても使用したい場合はターミナルの設定を変更する必要があります[3][4]。

ターミナルにおいてCtrlキーと同時に押して認識されるのは、ASCIIコードで0x40から0x5Fの範囲の文字のみのようです。

それ以外の文字をCtrlキーと同時に押した場合、例えば Ctrl + ; を押した場合、ターミナルエミュレータには ; のみが渡ってしまいます。

ターミナルの設定を変更することで解決出来るようですが、エディタの設定がエディタ外の環境依存になることはあまり好ましくありません。私のEmacs環境は既にそうなっている箇所が多々ありますが…(出来る限り少ないほうが良い)。

また、GUI版で視認性の向上に役立つ設定も、CUI版ではあまり意味を成さない(むしろ見辛くなる)といったことがあったので、このような設定は起動時の環境によって分岐させることにしました。

Emacsにはwindow-systemという変数が用意されています[1]。これを評価することで読み込む設定を分岐させることが出来ます。

参考

  1. 39.24 Window Systems
  2. jwiegley/use-package: A use-package declaration for simplifying your .emacs
  3. ターミナルエミュレータに”Ctrlキー+何か”で送信できる範囲 – すぎゃーんメモ
  4. ターミナル上のEmacsで本来使えない”Ctrlキー+何か”を使う方法 – すぎゃーんメモ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です