Windowsネイティブ版のemacsは、GNUの公式サイトから最新バイナリをダウンロードできますので、細かいオプションつけてビルドしたいんじゃーという人以外は、せっかくなので出来合いのバイナリをダウンロードさせていただきましょう。
ダウンロードミラーサイト https://ftp.jaist.ac.jp/pub/GNU/emacs/windows/ こちらから落とさせていただきます。
その他のインストール方法は公式サイトを御覧ください。 https://www.gnu.org/software/emacs/download.html
さっそく設定
このページを見ている人には釈迦に説法かもしれませんが、一応書いておきます。
いろいろパッケージを入れていくので、~/.emacs.d/init.elの冒頭でパッケージマネージャの設定をします。
(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/") t)
(add-to-list 'package-archives '("melpa-stable" . "http://stable.melpa.org/packages/") t)
(add-to-list 'package-archives '("org" . "http://orgmode.org/elpa/") t)
(add-to-list 'package-archives '("ELPA" . "http://tromey.com/elpa/") t)
(package-initialize)
これをevalした状態でM-x list-packagesするとパッケージ一覧が表示されるので使いたいものをiキーでマークしてxで一括インストールします。
ここからはWindows環境に固有の話題について触れていきます。
Unix互換コマンド
前編で述べたように、WSLはWindowsネイティブファイルシステムのアクセスが致命的に遅いですので、WSLコマンドにフォールバックするのは最終手段です。基本的にはWindowsネイティブバイナリを使います。
ScoopというWindows用パッケージマネージャがあり、非常に使い勝手が良いのでおすすめします。 https://scoop.sh/
PowerShellターミナルを開いてちょっとコマンドを打てばインストール完了です。
scoopを使う場合、sudoは最初に入れておいたほうが良いです。管理者権限のターミナルを開かなくてもUnixのようにsudoすることができます。
grep, sed, awk など、定番のコマンドだけでなく、いろいろなパッケージをコマンド一発で導入できます。
文字コードと改行コード
Windows上のアプリを使ってコーディングをしていると発狂しそうになるのが、CP932 (MS版SJIS) や改行コードの問題です。そのままの状態で使うといつのまにかCRLFのファイルとLFのファイルが混ざっていたりして大変ストレスになります。
たとえば、基本的にはUTF-8/LFで編集したいのですが、batファイルのようなWindowsネイティブ環境向けのファイルだけはCP932/CRLFにしたいという場合、ファイルを編集する都度文字コードや改行コードを確認するのは面倒だし人為ミスに繋がります。
私のソリューションはこうです。
;; 基本的にUNIX環境と同じにする
(prefer-coding-system 'utf-8-unix)
(set-language-environment 'utf-8)
;; 新規ファイル作成時、
;; 一部のファイル名パターンにマッチしたら強制的にcoding-systemを変更
(defun custom-new-file-coding-system ()
(with-current-buffer (current-buffer)
(cond
((string-match "\\.d?howm\\'" buffer-file-name)
(setq buffer-file-coding-system 'utf-8-unix))
((string-match "\\.bat\\'" buffer-file-name)
(setq buffer-file-coding-system 'utf-8-dos))
(t (setq buffer-file-coding-system 'utf-8-unix)))))
(add-hook 'find-file-not-found-functions 'custom-new-file-coding-system)
;; 各種外部プログラムも文字化けするようであれば設定を強制する
(modify-coding-system-alist 'process ' "mongosh-1.0.7.exe" (cons 'utf-8-dos 'cp932-unix))
(modify-coding-system-alist 'process "wsl.exe" (cons 'utf-8 'utf-8-unix))
(modify-coding-system-alist 'process "rg.exe" (cons 'utf-8-dos 'cp932))
(modify-coding-system-alist 'process "rg" (cons 'utf-8-dos 'cp932))
(modify-coding-system-alist 'process "ag.exe" (cons 'utf-8-dos 'cp932))
(modify-coding-system-alist 'process "ag" (cons 'utf-8-dos 'cp932))
(modify-coding-system-alist 'process "powershell.exe" (cons 'cp932-dos 'cp932))
migemo
日本人のemacs使いならこれを使わないわけにはいきません。elispパッケージにmigemoというのがあるのでそちらを導入し、cmigemoのWindows版バイナリも導入します。
;; migemo
(message "init.el: initializing migemo")
(when (and (executable-find "F:/ssd-app/cmigemo-default-win64/cmigemo.exe")
(require 'migemo nil t))
(setq migemo-options '("-q" "--emacs"))
(setq migemo-user-dictionary nil)
(setq migemo-regex-dictionary nil)
(setq migemo-coding-system 'utf-8-unix)
(setq migemo-command "F:/ssd-app/cmigemo-default-win64/cmigemo.exe")
(setq migemo-dictionary "f:/ssd-app/cmigemo-default-win64/dict/utf-8/migemo-dict")
(load-library "migemo")
(migemo-init)
(message "migemo is loaded"))
当然ですがパスは読み替えてください。
eshell そして tramp
これはWindowsに限らないことですが、Terminal環境が整備されているLinux(WSL含む)やMacではターミナルを使って作業をすることも多いかと思います。emacsジャンキーにとって、コーディングやデバッグがメイン作業だったりするとき、emacsを離れてターミナルを開いてコマンドちょっと実行するのも億劫になります。
LinuxやMacではshell-modeがそこそこ実用的なのですが、WindowsでM-x shellとやるとコマンドプロンプトが出てきます。いやいらんて。
というわけで、emacsそのものをシェルにしてしまうeshellを使います。eshellの素晴らしさは色々なところで語られているのでここでは省略します。
いずれにせよ、Windows環境ではeshellが圧倒的に利便性が高いです。
(global-set-key (kbd "M-!") 'eshell-command)
eshellはそのままで便利なので拡張コマンドなどはお好みで探してインストールしてみてください。eshellを使い込んだ結果、これまで開きっぱなしだったWindows Terminalは私のデスクトップから姿を消しました。
eshellを使う上で欠かせない機能としてtrampとの統合があります。
皆さんご存知だと思いますが、リモートファイルをローカルファイルのように開く機能です。例えば find-fileに/ssh:myname@servername:/etc/hostsと渡してやればssh接続経由でservernameサーバーの/etc/hostsを開くことができます。
sudo権限があれば/ssh:myname@servername|sudo:root@servername:/etc/hostsとしてやれば直接root権限で編集することができます。なんと危険な。
ちなみにWindows環境ではssh:ではなくsshx:じゃないとトラブります。
で、これはeshell環境のcdに指定してやることもできます
C:/temp $ cd /sshx:myname@servername|sudo:root@servername:/etc /sshx:myname@servername|sudo:root@servername:/etc $ ls X11 cron.weekly group- ld.so.conf modules pm rsyslog.d sv adduser.conf crontab grub.d ld.so.conf.d modules-load.d ppp runit sysctl.conf alternatives dbus-1 gshadow ldap motd profile security sysctl.d apache2 debconf.conf gshadow- letsencrypt mtab profile.d selinux systemd apparmor debian_version gss libaudit.conf mysql protocols services terminfo (省略)
ここでrm -rf ../とかやるとえらいことになると思いますが怖くて試せません。
ここでaptコマンドを使ったりcertbotで証明書を更新したり、従来であればターミナルを開きsshでサーバーに接続してから実行するところですが、eshellを使うとcdコマンド一発でサーバー上にワープできる感覚なのです。
これでWindows Terminalの役割は9割なくなりました。一部のttyどうたらとかグラフィカルな表示制御を行うコンソールアプリはうまく動作しませんが、そういう場合だけターミナルアプリを使えばよいのです。
まとめ
ここまでご紹介してきた設定を行うことにより、Windowsネイティブ版Emacsにて快適に生活するための基盤が整ったことになります。
私はこの環境をベースに、Go言語、Python、TypeScript/JavaScript (主にAngular)、Java、そしてAWSやGCPのCLIを利用したインフラの構築や運用まで殆どの時間をEmacs上で過ごすことができています。
Emacsを使うメリットは、同時に複数のプロジェクトや異なる開発言語の作業をしていても瞬時に切り替えたり並べて参照したりといった作業が容易に行えるため、複雑なプロジェクトの生産性を飛躍的に高めることだと思っています。
また、elispを中心としたカスタマイズによって一部の煩雑な作業の圧倒的な省力化が実現できます。
今後、各言語や作業内容別に、どのように設定して運用しているのかをご紹介していきたいと思います。
おまけ
