Ubuntu20.04でのEmacs on WSL2 + Windows 11

はじめに_

テキストエディタ(エディタ)_

以上、いくつかの定義を紹介したがこれからわかる通り、エディタとワードプロセッサは違うものである。

エディタとはテキスト(普通の文字)を入力するためのソフトであり、乱暴な言い方をするとワードプロセッサから文書整形・修飾機能(太文字、斜体、拡大・縮小等)を取り去ったものともいえる。ワードプロセッサに比べて軽快に動き、かつ作成したファイルの互換性が高いため、ある程度長い文章でもエディタを愛用する人が多い。

たとえば、Windowsの代表的なエディタはメモ帳であり、ワードプロセッサはMicrosoft Wordである。

Emacs_

EmacsはUNIX/Linux上での代表的なエディタの一つである。

Emacs はUNIX上で有名かつ人気のあるエディタである。 Emacsは高度にカスタマイズ可能であり、Emacs Lispという言語で環境を記述すれば、メールやニュースのリーダーとして使用可能なのは勿論、ブラウザとしても使用可能である。タイピングソフトやプログラム作成時にデバッグする環境も構築できる。

参考サイト_

gnome-terminalの起動_

gnome-terminalの利用で設定したgnome-terminalを起動する。

Ubuntuターミナルを起動し、ターミナル上で以下を起動する。

% gterm &

パッケージ情報およびインストール済みソフトウェアのアップデート_

emacsのインストール前にパッケージ情報およびインストール済みソフトウェアのアップデートを行う。

% sudo apt update
% sudo apt upgrade -y

Emacsのインストール_

% sudo apt install -y emacs emacs-mozc

emacsを起動する。起動するのを確認出来たらemacsを終了する。

% emacs &

以下のようなウィンドウが立ち上がる(背景と文字の色は以下の例と異なる場合もある)。真ん中の広い入力スペース(下画像の青枠部分)を「バッファ」、一番下の小さな入力スペース(下画像の赤枠部分)を「ミニバッファ」という。なお、以下の画像では起動したemacsのウィンドウのサイズを変更している。

emacsは設定ファイルによってさまざまにカスタマイズ可能なエディタである。emacsの設定ファイルはホームディレクトリ下の.emacs.d/init.el としておくこととなっている。emacsを起動したとき、ホームディレクトリに.emacs.dというディレクトリが作成される。ターミナルで確認してみる。ここに設定ファイルを設置する。

% cd 
% ls -ld ~/.emacs.d
drwx------ 1 gotoh gotoh 512  6月 26 21:56 /home/gotoh/.emacs.d

インプットメソッド fcitx_

インストールと設定_

Linuxで日本語入力をする際にはインプットメソッドというソフトウェアを利用する。

インストールする。

% sudo apt install -y fcitx fcitx-mozc
% im-config -n fcitx

fcitxはインプットメソッドの一種である。インストールしたemacsを用いて、fcitxを利用できるように設定する。まず、emacsを起動する。

% cd
% emacs &

~/.bash_profileのファイルを開く。メニューバーの「File」→「Open File」から .bash_profileを選択する。

もう一つのファイルを開く方法がある。マウスのカーソルをemacsのウィンドウ上に合わせて、Ctrlキーを押しながらxキーを押す(以後、Ctrlキーを押しながら何かのキーを押すのを 「C-何かのキー」と表記)、続いて C-f を押す。すると、emacsのミニバッファが以下の図のように「Find file: ~/ 」と入力待ちになる。そこで、「~/.bash_profile」となるように文字を打ち込み、Enterキーを押す。

現状の中身を以下になるように変更する。

alias gterm="/usr/bin/gnome-terminal"
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
export DefaultIMModule=fcitx
if [ $SHLVL = 1 ] ; then
  (fcitx-autostart > /dev/null 2>&1 &)
  xset -r 49  > /dev/null 2>&1
fi

「File」→「Save」で保存する。emacsを一度終了する。

以下のコマンドで ~/.bash_profileを反映させる。

% source ~/.bash_profile

ちゃんと設定が反映されているかどうかを確かめる。以下のコマンドを実行し、例と同じ表示がでているならば、設定は反映されている。

% env | grep fcitx
GTK_IM_MODULE=fcitx
XMODIFIERS=@im=fcitx
QT_IM_MODULE=fcitx
DefaultIMModule=fcitx


% which fcitx-configtool 
/usr/bin/fcitx-configtool

上記のような出力がでない場合は、~/.bash_profileの編集に失敗している。以下の手順で編集しなおすこと。

  1. まず、一度、別名保存する
    % cd
    % mv ~/.bash_profile ~/bash_profile.YYYYMMDD (注:YYYYは西暦4桁、MMは月2桁、DDは日付2桁)
    
  2. 空の.bash_profileを作成する。
    % touch ~/.bash_profile
    
  3. emacsで~/.bash_profileを開く
  4. 以下の内容を.bash_profileにコピーし、保存する。
    alias gterm="/usr/bin/gnome-terminal"
    export GTK_IM_MODULE=fcitx
    export QT_IM_MODULE=fcitx
    export XMODIFIERS=@im=fcitx
    export DefaultIMModule=fcitx
    if [ $SHLVL = 1 ] ; then
      (fcitx-autostart > /dev/null 2>&1 &)
      xset -r 49  > /dev/null 2>&1
    fi
    
  5. .bash_profileの設定を読み込む
    % source ~/.bash_profile
    

キーバインド「Controlキー + スペースキー」の解放(2022年6月2日追記)_

emacsで頻繁に利用するキーバインドに「Controlキー + スペースキー」があるが、標準だと直接入力モードと日本語入力モードの切り替えキーとして設定されている。そこで、「Controlキー + スペースキー」を直接入力モードと日本語入力モードの切り替えキーから外す。

以下のコマンドを実行して、インプットメソッドfcitxの設定画面を起動する。

% /usr/bin/fcitx-configtool 

以下のウィンドウが開く。

タブの「全体の設定」をクリックし、以下の画面を開く。続いて「Trigger Input Method」の項の「Ctrl + Space」と書いてあるボタンをクリックする。

すると以下の赤枠で囲った部分のような小さなウィンドウが追加で開く(なお、開く位置は下の画像通りではない)。このウィンドウが開いた状態でキーボードのAltキーとスペースキーを同時に押す。

すると、以下の画像のように「Ctrl + Space」と書いてあった部分が「Alt + Space」に変わる。(2022年6月2日追記:Altキー、たとえばlaltしか反映されない場合がある。そのときは普段使わないキーを適当に割り当てること)。このようになったら変更終了。このウィンドウを閉じる。もし、「Alt + Space」になっていなければ、また、当該部分のボタンをクリックし、上の手順に戻る。

emacsの設定_

設定ファイル init.el の設置_

以下に述べる設定ファイルは GitHub:yuichigoto yg-emacs-initsからダウンロードできる。設置方法は以下の通り。

% cd ~/.emacs.d
% git clone https://github.com/yuichigoto/yg-emacs-inits.git

ディレクトリを確認する。

% ls yg-emacs-inits

設定ファイルは ~/.emacs.d/init.elである。init.elを設置する。

% cp yg-emacs-inits/init-leaf.el ./init.el

emacsの設定パッケージleaf.el_

本設定ファイルは2020年代のEmacs入門に従って、leafというパッケージシステムを使っている。

今回の設定ファイルでは以下のツールを使えるようにしている。

  • 日本語変換エンジン mozc
  • Windowsのフォント
  • ivy
  • migemo (cmigemo)

Windowsフォントの利用_

フォントも自由に設定できる。せっかくWindows上でemacsを使うのでWindowsのフォントを使用してみる(参考:Windows Subsystem for Linux + X Windowを1.024倍くらい使いこなすための方法)。

まず、WindowsのフォントをUbuntuから使えるようにする。Windowsのフォントデータがあるディレクトリを参照できるようにシンボリックリンクを作成する。

% sudo ln -s /mnt/c/Windows/Fonts /usr/share/fonts/windows

以下のように/usr/share/fonts/windowsが/mnt/c/Windows/Fontsを指示していたら、シンボリックリンクの作成に成功している。

% ls -l /usr/share/fonts/windows
lrwxrwxrwx 1 root root 20  4月 12 13:11 /usr/share/fonts/windows -> /mnt/c/Windows/Fonts

Ubuntu側のフォントデータを再構成する(Windows側のフォントデータを組み込む)。

% sudo fc-cache -fv

使用できるフォントは以下のコマンドで調べられる。

% fc-list

絞り込む場合はgrepコマンドを使う。

% fc-list | grep MS (MSゴシックなどのみを抜き出す)
% fc-list | grep Yu (游ゴシックなどのみを抜き出す)
% fc-list | grep Meiryo (メイリオ、メイリオUIなどのみを抜き出す)

今回の設定ではメイリオフォントを使っている。init.elでの該当部分は以下のとおり。

;; emacsで使用するフォントの設定
;; Windows上のフォント(メイリオフォント)を使っているので
;; 先にWindows上のフォントを利用できるように設定すること。
(progn
  (add-to-list 'default-frame-alist '(font . "Meiryo-13.5"))
  (custom-set-faces
   '(variable-pitch ((t (:family "Meiryo"))))
   '(fixed-pitch ((t (:family "Meiryo"))))
   ))

ミニバッファ拡張ツールivy_

ターミナル上で以下のコマンドを実行する。

% sudo apt install -y elpa-counsel

2020年代のEmacs入門の記載を利用している。ただし、migemoとの併用ができなかったのでswiperの設定をコメントアウトしている。init.elでの該当部分は以下のとおり。

;;; ミニバッファの拡張機能 ivy
;;; ref. https://emacs-jp.github.io/tips/emacs-in-2020
;;; ref. https://github.com/abo-abo/swiper
(leaf ivy
  :doc "Incremental Vertical completYon"
  :req "emacs-24.5"
  :tag "matching" "emacs>=24.5"
  :url "https://github.com/abo-abo/swiper"
  :emacs>= 24.5
  :ensure t
  :blackout t
  :leaf-defer nil
  :custom ((ivy-initial-inputs-alist . nil)
           (ivy-use-selectable-prompt . t))
  :global-minor-mode t
  :config

 ; 2020/4/12 後藤注:Migemoと併用する方法が
 ; わからないのでコメントアウトしている。
 ;(leaf swiper
 ;   :doc "Isearch with an overview. Oh, man!"
 ;   :req "emacs-24.5" "ivy-0.13.0"
 ;   :tag "matching" "emacs>=24.5"
 ;   :url "https://github.com/abo-abo/swiper"
 ;   :emacs>= 24.5
 ;   :ensure t
 ;   :bind (("C-s" . swiper)))

  (leaf counsel
    :doc "Various completion functions using Ivy"
    :req "emacs-24.5" "swiper-0.13.0"
    :tag "tools" "matching" "convenience" "emacs>=24.5"
    :url "https://github.com/abo-abo/swiper"
    :emacs>= 24.5
    :ensure t
    :blackout t
    :bind (("C-S-s" . counsel-imenu)
           ("C-x C-r" . counsel-recentf))
    :custom `((counsel-yank-pop-separator . "\n----------\n")
              (counsel-find-file-ignore-regexp . ,(rx-to-string '(or "./" "../") 'no-group)))
    :global-minor-mode t))

(leaf prescient
  :doc "Better sorting and filtering"
  :req "emacs-25.1"
  :tag "extensions" "emacs>=25.1"
  :url "https://github.com/raxod502/prescient.el"
  :emacs>= 25.1
  :ensure t
  :custom ((prescient-aggressive-file-save . t))
  :global-minor-mode prescient-persist-mode)
  
(leaf ivy-prescient
  :doc "prescient.el + Ivy"
  :req "emacs-25.1" "prescient-4.0" "ivy-0.11.0"
  :tag "extensions" "emacs>=25.1"
  :url "https://github.com/raxod502/prescient.el"
  :emacs>= 25.1
  :ensure t
  :after prescient ivy
  :custom ((ivy-prescient-retain-classic-highlighting . t))
  :global-minor-mode t)

日本語インクリメンタル検索 cmigemoのインストール_

emacs上で文字列検索する際にはC-sというコマンドで検索するが、通常だとアルファベットはアルファベット、ひらがな+漢字はひらがな+漢字でしか検索できない。しかし、migemoというスクリプトをインストールすると、ひらがな+漢字をアルファベット(ローマ字)で検索できるようになり、とても便利。

migemoのインストール

% sudo apt install -y cmigemo elpa-migemo

init.elでの該当部分は以下の通り

;; ローマ字検索を可能にするパッケージMIGEMO
(progn
  (require 'migemo)
  (setq migemo-command "cmigemo")
  (setq migemo-options '("-q" "--emacs"))
  (setq migemo-dictionary "/usr/share/cmigemo/utf-8/migemo-dict")
  (setq migemo-user-dictionary nil)
  (setq migemo-regex-dictionary nil)
  (setq migemo-coding-system 'utf-8-unix)
  (load-library "migemo")
  (migemo-init))

スペルチェッカーaspellのインストール(必要に応じて)_

この設定は後藤の作業環境のために記載しているので、不要ならば読み飛ばすこと。

emacs上で英語論文などを書く際に簡易的なスペルチェッカーaspell(emacsで使うときはispell)を利用する。

aspellのインストール

% sudo apt install -y aspell

このままemacs上でipsellを実行すると「Error: No word lists can be found for the language "ja_JP"」というエラーメッセージが出てしまうので、ホームディレクトリに.aspell.confというファイルを用意する。

% echo "lang en_US" > ~/.aspell.conf

init.elでの該当部分は以下の通り

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

leaf.plのバイトコンパイル_

leaf.plはinit.elを修正するたびに以下のコマンドでバイトコンパイルをする必要がある。init.elcというファイルがバイトコンパイルで生成されるファイル。

% cd ~/.emacs.d
% emacs --batch -f batch-byte-compile init.el
% ls init.elc
init.elc

動作確認_

起動時のウィンドウサイズの変更_

init.elの以下の部分でemacsのウィンドウサイズを設定している。

;;  emacsのウィンドウサイズの設定
(if window-system
    (progn
      (set-frame-size (selected-frame) 80 25)))

背景、文字の色、カーソルの色の変更_

init.elの以下の部分で設定している。現状は背景が黒、文字が白、カーソルが白となっている。

;; 背景、文字の色、カーソルの色の指定
(progn
  (set-background-color "black")
  (set-foreground-color "white")
  (set-cursor-color "white"))

日本語入力_

init.elの以下の部分で設定している。

;; Setting for Japanese Input
(progn
  (set-language-environment "Japanese")
  ;; ターミナルから呼び出したときにターミナルに
  ;; 渡す文字コード
  (set-terminal-coding-system 'utf-8-unix)
  ;; 新しく開いたファイルを保存しておくときの
  ;; 文字コード
  (prefer-coding-system 'utf-8-unix)
  ;; emacsをXのアプリケーションへ貼り付ける
  ;; ときの文字コード
  (set-clipboard-coding-system 'utf-8))

(progn
  (require 'mozc)
  (setq default-input-method "japanese-mozc")
  ; 変換候補が変換対象のすぐ下に表示される。
  ;(setq mozc-candidate-style 'overlay))
  ; 変換候補がミニバッファに表示される。こちらのほうが無難
  (setq mozc-candidate-style 'echo-area))

適当なファイルで漢字変換を行ってみる。適当なファイルとして ~/tmp.txt を作成する。

% cd
% touch ~/tmp.txt

次にemacs上で ~/tmp.txt を開く。キーバードから開く(C-x f)で開くと、ivyによるミニバッファの拡張を体験できる。

tmp.txtを開いたら、C-\ (Ctrlキーを押しながら、バックスラッシュキー)を押す。すると以下のように日本語入力ができるようになる(emacsの左下に[Mozc]と表示される)。「あした」と入力すると以下のように変換候補がでる。スペースキーを押すと変換できる。もう一度 C-\ を押すと通常入力モードになる。

C-\ を押してもemacsの左下に[Mozc]と表示されない場合は、emacsにおいてキーボードが英語配列として認識されている可能性がある。

次に変換時の挙動をカスタマイズする。ターミナルで以下のコマンドをうち、mozcの設定ウィンドウを起動する。

% /usr/lib/mozc/mozc_tool -mode=config_dialog

「キー選択の設定」項目で挙動を変更できる。特にこだわりがなければ「ことえり」にして、「OK」を押す。

タブ、全角スペースの可視化_

タブや全角スペースを表示する設定をしている。プログラムを書くようになると、プログラム中に全角スペースが含まれることでエラーになることがある。該当部分は以下のとおり。

;;参考:
;; https://www.emacswiki.org/emacs/WhiteSpace
;; https://qiita.com/itiut@github/items/4d74da2412a29ef59c3a
;; https://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7_0000-0FFF
(progn
  (require 'whitespace)
  (global-whitespace-mode 1)
  (setq whitespace-style '(
			   face            ; 可視化
			   trailing        ; 行末
			   tabs            ; タブ
			   spaces        ; スペース
			   empty         ; 先頭、末尾のスペース
			   space-mark ; 全角スペースの別記号表記
			   tab-mark    ; タブの別記号表記
			   ))
  (setq whitespace-display-mappings
        '(
          (space-mark ?\u3000 [?\u20DE]) ; 全角スペースを別記号で表記
          (tab-mark ?\t [?\u00BB ?\t] [?\\ ?\t]) ; タブを別記号で表記
          ))
  (setq whitespace-trailing-regexp  "\\([ \u00A0]+\\)$")
  (setq whitespace-space-regexp "\\(\u3000+\\)")
  (set-face-attribute 'whitespace-trailing nil
                      :foreground "RoyalBlue4"
                      :background "RoyalBlue4"
                      :underline nil)
  (set-face-attribute 'whitespace-tab nil
                      :foreground "orange red"
                      :background "yellow4"
                      :underline nil)
  (set-face-attribute 'whitespace-space nil
                      :foreground "gray40"
                      :background "light gray"
                      :underline nil))

どのようになるのか試してみる。

  • サンプルファイルをダウンロードしてみる。
    % cd
    % wget http://www.aise.ics.saitama-u.ac.jp/~gotoh/Download/Samples/Example.whitespace.txt
    
    % ls Example.whitespace.txt (ダウンロードできていることを確かめる)
    
  • emacsでExample.whitespace.txtを開く(emacs上で C-x C-f ~/Example.whitespace.txtを開く)
  • 下の画像のようにタブや全角スペースが色付き表示される。

日本語インクリメンタル検索_

日本語で検索できるかどうか試してみる。

  • サンプルファイルをダウンロードしてみる。
    % cd
    % wget http://www.aise.ics.saitama-u.ac.jp/~gotoh/Download/Samples/Example.utf8.txt
    
    % ls Example.utf8.txt (ダウンロードできていることを確かめる)
    
  • emacsでExample.utf8.txtを開く(emacs上で C-x C-f ~/Example.utf8.txtを開く)
  • 検索してみる。C-s pasokon
  • 下の画像のように「パソコン」が検索候補としてヒットする。C-sを押すたびに次候補へ進む
  • 検索終了する場合はEnterキーを押す

aspellの利用方法(必要に応じて)_

emacsで、新しいファイルをつくり、スペルチェックしてみる。

  1. emacs上でC-x C-f (Controlキーを押しながらxキーを押す、その後Controlキーを押しながらfキーを押す)で~/new.txtを作成
  2. 「I wish I were a birb.」と打つ
  3. M-x ispell とコマンドを実行
  4. 「birb」に対して変換候補がでたならばaspellはちゃんと動いている。
  5. C-x C-sで保存する。

戻る_