わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

ようこそEmacs 26.1,さよならCygwin

普段使いの,WindowsEmacsのバージョンを26.1に更新しました.
実施内容の前に,自分の環境のことを書いておきます.自宅と職場,合わせて4台のPCに対して,今回のEmacsのアップグレードを含む処理を行いました.Emacsのバイナリを配置したフォルダー,Cygwin・MSYS2をインストールしたフォルダーは,機器ごとに異なっています.設定ファイル(init.elを~/.emacsより読み出し)は,1箇所で作成した内容を他のPCにコピーしてきました.このファイルの中で,計算機名で場合分けして処理を書く(フォルダー名を設定するなど)のは,やりたくありません.
作業は「Emacsバイナリ更新」「設定ファイルの修正」「Emacsでシェルとスペルチェッカーの使用」「脱Cygwin」に分かれます.


Emacsのバイナリは,https://github.com/mhatta/emacs-26-x86_64-win-imeemacs-26.1-x86_64-win-ime-20180619.zipを使用しました.以前はhttps://github.com/chuntaro/NTEmacs64よりダウンロードしていましたが,最新バージョンは25.2で,更新が止まっています.バージョン26.1の他のビルドとして,http://cha.la.coocan.jp/doc/NTEmacs.html#binaryemacs-26.1-simple_ime-no_symbol.zipもありますが,こちらにはw32-ime.elが入っていないため,従来のバージョンで行えていた設定ができなくなってしまいます.
zipファイルを解凍して適当なフォルダーに移動させ,emacs-26.1\binのrunemacs.exeをダブルクリックして,Emacsが起動するのを確認したら,このファイルを右ドラッグでデスクトップまで移し,ショートカットを作成して,名前をEmacs 26.1に変更しました.
さて,起動はしたものの,エラーが出ました.以前の設定ファイル(~/.emacsから読み出しているinit.el)に,バージョン25.2では問題なかったけれど26.1ではダメなものが入っているということです.以下のコードが該当し,これは,リージョン内の行数・単語数・文字数をモードラインに表示するの一部です.

(add-to-list 'default-mode-line-format
             '(:eval (count-lines-and-chars)))

少し調べると,情報が見つかりました.

「default-* の変数がごっそり無くなるようだ」に,default-mode-line-formatも合致したということです.
そこで以下のように変更したところ,エラーはなくなりましたが,リージョン内の行数・単語数・文字数をモードラインに表示することが,できなくなりました.

(add-to-list 'mode-line-format
             '(:eval (count-lines-and-chars)))

init.elの中で,この領域を選択してからM-x eval-regionとすることで,モードラインへの表示ができるようになりました.しかし毎回実行するのは面倒です.そしてテキストファイルなど,他のモードのファイルでは,有効になりません.考えてみれば,これを実行したモードでしか設定されないわけです.
M-x help-for-help(とEnter),v,mode-line-format(とEnter)という操作で,変数mode-line-formatの値を見たところ,w32-ime-init-mode-line-displayというのが入っていました.w32-ime.elを見つけて開き,この変数を含む処理を参考に,先ほどまでのコードを,以下のように書き換えてみました.

(if (and (stringp (car mode-line-format))
         (string= (car mode-line-format) "-"))
    (setq-default mode-line-format
                  (cons ""
                        (cons '(:eval (count-lines-and-chars))
                              (cdr mode-line-format))))
  (setq-default mode-line-format
                (cons ""
                      (cons '(:eval (count-lines-and-chars))
                            mode-line-format))))

Emacsを終了して改めて起動し,scratchバッファ内でリージョンは…うまく表示されました.
Cygwinからの脱却を図ります.Cygwinの実行コマンドは,シェル(M-x shellなど)と,スペルチェッカー(M-x ispell-region,M-x ispell-wordなど)で使用してきました.それとホームディレクトリのフォルダーは,秋に使い始めたノートPCを除き,Cygwinのフォルダー群の中にあります.Cygwinがないと,ispell-wordなどはエラーになっていました.
まずシェルについて,パスの編集により脱Cygwinを試みると,Windows Subsystem for Linuxbashを使うようになりました.手順ですが,まず,Windows 10の左下の検索ボックスで「システム環境変数の編集」を入れ,システムのプロパティで「環境変数」のボタンを押します.(ユーザー環境変数ではなく)システム環境変数のほうのPathを選択してから,「編集」のボタンを押し,Cygwinのパス(C:\cygwin\binなど)を取り除きました.そして再起動です.
スペルチェッカーは,MSYS2よりaspellをインストールして使用しました.検索ボックスで「msys」と打ち込みます.MSYS2が出てきたらEnterキーで実行し,出なかったPCでは,MSYS2 homepageよりx86_64を含むexeファイルをダウンロードして実行しました.
MSYS2のプロンプトでは,以下のコマンドを実行して,まずはアップデートです.

$ pacman -Syuu

pacman自身のアップグレードにより,プロンプトのかわりに特別なメッセージが出たので,ウィンドウを終了して,再度「msys」とEnterです.そこでコマンドを実行していきます.

$ pacman -S mingw-w64-x86_64-aspell mingw-w64-x86_64-aspell-en
$ pacman -S aspell
$ echo lang en_US > ~/.aspell.conf
$ echo dict-dir /mingw64/lib/aspell-0.60 >> ~/.aspell.conf

うしろ2つは,aspell用の設定ファイルの作成です.前者はWindows 環境で Emacs で 自動スペルチェック(aspell, flyspell) | Futurismoなどにある通りです.dict-dirを含む最後のコマンドを実行しておかないと,自分のEmacs環境では,スペルチェッカーが機能しませんでした.
aspell.exeをEmacsから使えるようにします.左下の検索ボックスで「環境変数の編集」と打ち込んでEnterで,ユーザー環境変数のPathを編集し,「新規」「参照」により追加します(例えばC:\msys64\usr\bin).また再起動です.
Emacsの設定ファイルには,以下を3行を追加しました.

(setq-default ispell-program-name "aspell")
(eval-after-load "ispell"
  '(add-to-list 'ispell-skip-region-alist '("[^\000-\377]+")))

これでスペルチェッカーがうまくいきました.
Cygwinとして,最後にすべき作業は,ホームディレクトリの変更です.ユーザー環境変数のHOMEを,移動先(例えば,C:\home\takehikom)に変更してから,EmacsCygwinもMSYS2もプログラムを終了させておきます.そしてエクスプローラーの操作で,これまでのホームのフォルダーを,丸ごと,移動先に持って行きました.再起動してEmacsを立ち上げ,スペルチェッカーが使えることを確認したら,PC 1台分の作業はおしまいです.