読者です 読者をやめる 読者になる 読者になる

Lambdaカクテル

DESCRIBING: Scala, Akka, P2P, Scheme, Political sth., etc.

WindowsタブレットでEmacs環境を整えるまでに何をしたか

Emacs

EmacsWindowsタブレットで使おうと思い立ったのですがなかなかうまくいかなかったので,その備忘録としてメモ代わりにこのエントリを書きました.

Emacsダウンロード

Windows 10で今回インストールするEmacsは,ふつうのGNU Emacs for Windowsです. https://www.gnu.org/software/emacs/ からWindows向けのアーカイブをダウンロードして,好きな場所に展開します. 筆者のおすすめはCドライブ直下へのインストールです.タブレットなので,あまり気にせずポンポンCドライブに配置しています.

ちなみに,Windows向けのEmacsには以下のようなバリエーションがあります.

.emacs.dクラウド

タブレット上でもふだんと同じEmacsが使いたいでしょうから,Emacsの設定をクラウド化して,Emacs端末でいつでも利用できるようにします.

クラウド環境に向けた設定の調整

クラウド化というのは,普段使っている設定ファイルや拡張をインターネット上に配置して,いつでも使えるようにすることだと思います. 設定は日々変化していくことが予想されますが,拡張はこちらから変化させる必要がありません.せいぜいバージョンが上がってインストールし直すといった所でしょう. したがって,拡張をインストールするための最低限の設定と,拡張をカスタマイズする設定との2つをクラウドで管理し,拡張そのものは設定をダウンロードしてきてから自動的にインストールするようにするのが筋の良い方法だと言えそうです.

ここでは.emacsには直接設定を記述しません. .emacsからはクラウド化した設定フォルダのcommon.elを呼び出させることで,設定フォルダをまるっとクラウド化します.

Gitによる設定管理

エンジニアはgitが大好きです.gitはソースコードを管理するためのツールであり,Emacsの設定はelispソースコードとして記述されますから,Emacsの設定をgitで管理しない理由はないと言えるでしょう.

ユーザディレクトリあたりに.emacs-cloud.dといったフォルダを作成し,既存の.emacs.dの中身をコピーしてきます. この際,拡張は動的にインストールすることになるので,名前だけ記録して削除してしまいます.設定だけを.emacs-cloud.dに引っ越します.

引っ越しが終了したら,フォルダをgitレポジトリにします.

筆者は大規模化しがちな設定の分割にinit-loaderを使っています.設定については http://tech.kayac.com/archive/divide-dot-emacs.html などを参考にするとよいでしょう.そのうちinit-loaderについても導入方法を書きたい.

ホスティング(SSH鍵の作成)

どこからでも設定を読み込むには,どこかに設定レポジトリをホスティングしなければなりません. 接続できればどこでもいいので,GitHubかBitBucketのどちらかにアップロードしておけばよいと思います.

Windowsは標準で公開鍵ペアを作成することができないので,Gitに付属してきたGit Bashの中で鍵ペアを生成します. スタートメニューからGit Bashを起動し,ssh-keygenを利用して鍵ペアを生成します.GitHubもBitBucketもECDSAが使えるので,ECDSAが使えるならECDSAを使うといいんじゃないかと思います.Ed25519というのもあって,パフォーマンスが良いらしい( http://jnst.hateblo.jp/entry/2014/12/15/200542 )です.

el-getによるパッケージ管理

ここでは,自動的に拡張をインストールするためにel-getを利用します.以下に示す設定は,http://tarao.hatenablog.com/entry/20150221/1424518030 からの抜粋です.これを.emacs-cloud.d/common.elに記述します.

(when load-file-name
  (setq user-emacs-directory (file-name-directory load-file-name)))

(add-to-list 'load-path (locate-user-emacs-file "el-get/el-get"))
(unless (require 'el-get nil 'noerror)
  (with-current-buffer
      (url-retrieve-synchronously
       "https://raw.githubusercontent.com/dimitri/el-get/master/el-get-install.el")
    (goto-char (point-max))
    (eval-print-last-sexp)))

また,これに引き続いて利用したい拡張を定義していきます.

gitのインストール

https://git-scm.com/downloads からWindowsインストーラをダウンロードし,Cドライブ直下のGitにインストールします.理由は,パス中にスペースが入るとel-getが正しく動作しないことがあったためです. 途中で付属ツールをインストールするか聞かれるので,Git Bashをインストールしてください.このツールはEmacsの起動などに使います.

設定レポジトリのクローン

Gitがホスティングされているサービスから設定レポジトリをクローンしましょう. ここでは,ユーザーフォルダの下に.emacs-cloud.dという名前でクローンしました.

TLSを使えるようにGnuTLSをインストールする

GNU EmacsにはGnuTLSが入っておらず,TLS通信が使えなかったので,http://gnutls.org/download.html からGnuTLSをダウンロードし,bin/以下のdllファイルをemacsバイナリと同じディレクトリに配置しました.

いつも使う設定の適用

僕はSandSを使っています.SandSとは,キーボードの隅にあって押しにくいシフトキーを,スペースバーで入力できるようにしようという考えです.Emacsで人気の高い日本語入力プログラムであるDDSKKでは日本語の入力で頻繁にシフトキーを使用しますから,小指を守るためにもシフトキーを打鍵しやすいスペースバーで代用するのは理にかなっています.

keyhacのインストール

SandSを実現するために手軽にWindowsに導入できるkeyhacを使うことにします.導入できて動きさえすればどれでもいいのですが,keyhacでSandSすることについて書かれた記事はたくさんあるので,僕はこれで十分だと考えます.

VC++ 再頒布可能パッケージのインストール

keyhacを動作させるためにはVisual C++ 再頒布可能パッケージが必要なので, https://www.microsoft.com/ja-JP/download/details.aspx?id=48145 からインストーラをダウンロードしてインストールします.

keyhacのダウンロード

keyhacにはインストーラといったものは特にありません. https://sites.google.com/site/craftware/keyhac-ja からダウンロードしてきたZIPファイルを好みの場所に展開します.

設定ファイル(config.py)の作成

keyhacではGUIを使わずにPythonを用いてキーのカスタマイズを記述します.

以下の通りに記述しました.

# keyhac config.py
from keyhac import *

def configure(keymap):
    keymap_global = keymap.defineWindowKeymap()
    keymap.replaceKey("Space", "Rshift")
    keymap_global["O-RShift"] = "Space"

keyhacを起動する

keyhac.exeを起動すると,SandSが有効になっていることを確かめることができます. keyhacでは,ワンショットで打鍵したスペースバーをスペースだと認識するまでにわずかな時差が生じますが,実用上さほど問題はないと考えます.

Emacs 起動スクリプトの作成

EmacsWindowsのファイルシシステムとは相性が悪く,一部の拡張が動作しません.なぜかというとそのような拡張はWindowsで利用されると想定していないので,POSIXにのっとってmvなどのコマンド群を呼び出そうとするからです.

このような問題を解決するために,UNIX互換の環境でEmacsを動作させることにします. UNIX互換の環境といえばCygwinですが,今回はちょうどGitと一緒に付いてきたGit Bashが利用できるので,これを使います.

以下のようなバッチファイルを好きな場所に作成します.bashを呼び出す箇所ではパス区切りにバックスラッシュ(もしくは円記号)が使われているのに対して,bashに渡すコマンドではスラッシュが使われていることに注意してください.

C:\Git\bin\bash.exe -c "/c/Emacs/bin/emacs"

このスクリプトの意図するところは,bashからEmacsを起動するという事です. bashからEmacsが呼び出されることによりSHELLなどの環境変数が整備され,EmacsからはあたかもUNIXコマンドが使えるように見えます.

このスクリプトを起動すれば,見慣れたいつものEmacs環境が現れるはずです.