概要
この文書では、2015年4月10日にリリースされた 「Emacs 24.5」 を Mac OS X へインストールする手順と、 Emacs 24 で注目の新機能を中心に解説しています。
初期設定、基本操作等に関しては Emacs23 (Cocoa Emacs) 入門から中毒まで を参照してください。
この文書は時々修正、更新されます。
Emacs24 のリリース日
- 2012年6月10日:Emacs 24.1
- 2012年8月27日:Emacs 24.2
- 2013年3月10日:Emacs 24.3
- 2014年10月20日:Emacs 24.4
- 2015年4月10日:Emacs 24.5
Emacs24 バイナリ
すぐに Emacs を利用したい場合はコンパイル済みのバイナリを利用するのが簡単です。
Emacs24.2、Emacs24.3 でインランパッチを有効にしてコンパイルされたバイナリが以下で配布されています。
インラインパッチが有効でない素のバイナリが以下で配布されています。
以下のパッケーマネージャを利用してインストールすることもできます。
- MacPorts : sudo port install emacs-app +patches
- Homebrew : brew install emacs --cocoa
- http://www.bach-phys.ritsumei.ac.jp/OSXWS/
Emacs24 のソースからのインストール
ソースからのインストール手順を解説します。
インストールには XCode のインストールが必要です。 XCode は App Sotre からインストールしてください。
Emacs のコンパイルは、Terminal 上での作業となりますので、簡単な Terminal 操作はできる物として説明します。
self-contained バイナリの生成
self-contained バイナリとは、 「Emacs.app」の中に起動に必要な物全てが含まれるバイナリのことで、どこに移動しても Emacs が正常に起動します。
以下の手順でコンパイルすると、self-contained バイナリが生成されます。
EMACS_VER=24.5
curl -O http://ftp.gnu.org/pub/gnu/emacs/emacs-${EMACS_VER}.tar.gz
tar xvfz emacs-${EMACS_VER}.tar.gz
cd emacs-${EMACS_VER}
./configure --with-ns --without-x
make
make install
open nextstep/Emacs.app
install 時 sudo は不要です。
self-contained バイナリの特徴は以下となります。
- 利点
- Carbon Emacs パッケージ(Emacs22のバイナリ)を利用していた方は移行しやすい
- 生成後 Emacs.app 単体を他の Mac 等に移動しても正常に起動する
- 他人に配布しやすい
- 複数バージョンの Emacs の同居が比較的容易
- 欠点
- Mac 独自の方式なので、Linux 関連の Emacs 解説の通りだと上手く動作しない場合がある
利点、欠点を理解した上で選択するようにしてください。
/usr/local 以下へのバイナリの生成
以下の手順でコンパイルすると、/usr/local 以下に Emacs コマンドがインストールされます。
EMACS_VER=24.5
curl -O http://ftp.gnu.org/pub/gnu/emacs/emacs-${EMACS_VER}.tar.gz
tar xvfz emacs-${EMACS_VER}.tar.gz
cd emacs-${EMACS_VER}
./configure --with-ns --without-x --disable-ns-self-contained
make
sudo make install
open nextstep/Emacs.app
--disable-ns-self-contained を付与し、 install 時 sudo でインストールします。
Emacs.app は /Applications 以下に移動しても問題なく起動しますので、移動しておくのが良いでしょう。
この方法は以下のような方にお勧めです。
- Unix/Linux の利用に慣れている方
- 一般に販売されている書籍の通りに動作させたい方
- Terminal内で動作させる方
IMEパッチの適用
IME パッチは Taiichi Hashimoto さんが作成している Emacsから IME を操作する機能を付与するためのパッチで、ATOK、Google IME 等を利用している方にはかなり重要な機能が含まれています。
MacEmacs JP の SVN で開発されています。
公式の配布物は Emacs 24.3 までに対応しています。
IME パッチを適用した Emacs をコンパイルするには autoconf が必要 です。事前に MacPorts や Homebrew を利用して autoconf をインストールしておいてください。
パッチを取得して、コンパイルする手順は以下となります。
EMACS_VER=24.3
curl -O http://ftp.gnu.org/pub/gnu/emacs/emacs-${EMACS_VER}.tar.gz
svn co http://svn.sourceforge.jp/svnroot/macemacsjp/inline_patch/trunk inline_patch
tar xvfz emacs-${EMACS_VER}.tar.gz
cd emacs-${EMACS_VER}
patch -p0 < ../inline_patch/emacs-inline.patch
./configure --with-ns --without-x
make bootstrap
make install
open nextstep/Emacs.app
make bootstrap する必要があります。
疑問点等は MacEmacs JP のメーリングリスト等に投稿すると回答が得られるかもしれません。
http://lists.sourceforge.jp/mailman/listinfo/macemacsjp-users
experimental/hackers-only パッチの適用
experimental/hackers-only パッチは ftp://ftp.math.s.chiba-u.ac.jp/emacs/ で公開されているパッチです。
「experimental/hackers-only」とは「実験者/ハッカー用」の意味ですので、ある程度自分で問題が解決できる方以外は利用しないでください。
EMACS_VER=24.5
MACPORT_VER=5.7
curl -O http://ftp.gnu.org/pub/gnu/emacs/emacs-${EMACS_VER}.tar.gz
curl -O ftp://ftp.math.s.chiba-u.ac.jp/emacs/emacs-${EMACS_VER}-mac-${MACPORT_VER}.tar.gz
tar xvfz emacs-${EMACS_VER}.tar.gz
tar xvfz emacs-${EMACS_VER}-mac-${MACPORT_VER}.tar.gz
cd emacs-${EMACS_VER}
# -p の次の数字は「1」です(このバージョンからの変更。古い物は「0」でした)
patch -p 1 < ../emacs-${EMACS_VER}-mac-${MACPORT_VER}/patch-mac
cp -r ../emacs-${EMACS_VER}-mac-${MACPORT_VER}/mac mac
cp ../emacs-${EMACS_VER}-mac-${MACPORT_VER}/src/* src
cp ../emacs-${EMACS_VER}-mac-${MACPORT_VER}/lisp/term/mac-win.el lisp/term
cp nextstep/Cocoa/Emacs.base/Contents/Resources/Emacs.icns mac/Emacs.app/Contents/Resources/Emacs.icns
./configure --with-mac --without-x
make
sudo make install
open mac/Emacs.app
バイナリが以下で配布されています。
https://github.com/railwaycat/emacs-mac-port/wiki/Downloads
このパッチを適用するとIMEパッチはそのままでは適用できません。
ミニバッファでの日本語を制御したいだけならば、以下を設定してみてください。
(mac-auto-ascii-mode t)
開発版のビルド
Emacs は日々開発されていますので最新の機能を利用したい場合は開発版をコンパイルする必要があります。
ただし、開発版は日によってビルド不可能状態になったり、非常に大きなバグが含まれている場合もありますので、ビルドはある程度知識のある方のみ実施してください。
最新版のソースは Git を利用して取得することができます。Emacs がコンパイルできる環境であれば Git はインストールされているはずです。
Emacs の最新ソースを以下の手順で取得し、コンパイルが可能です。
git clone git://git.sv.gnu.org/emacs.git
cd emacs
./autogen.sh
./configure --with-ns --without-x
make bootstrap
make install
open nextstep/Emacs.app
設定
.emacs.d/init.el の利用
設定は、積極的に ${HOME}/.emacs.d/init.el に移行してください。 ${HOME}/.emacs や ${HOME}/.emacs.el を利用するのは避けた方が良いでしょう。
マウス関連の動作変更
Emacs 23 と 24 ではマウスを利用した場合の動作が大きく異なります。
マウスを利用して Emacs を操作する方は任意で以下の設定を init.el に追加してください。
;; マウスで選択するとコピーする Emacs 24 ではデフォルトが nil
(setq mouse-drag-copy-region t)
後方互換性に関して
互換性の無い変更が入っていますので一部の Emacs Lisp が動作しません。
動作しない物に関しては Emacs 24 対応が必要になります。
自信がない方は移行はもうしばらく待っても良いでしょう。
24.5 での非互換性
調査中
24.4 での非互換性
24.4 で非互換の比較的大きな変更があります。影響範囲調査中ですが、個人的に影響があった物を以下に記述します。
ad-advised-definition-p 削除
「ad-advised-definition-p」が無くなりましたので動作しない物が存在します。
無理やり動作させたい場合は以下を設定ファイルの極力先頭の方に記述してください。
(if (not (fboundp 'ad-advised-definition-p))
(defun ad-advised-definition-p (definition)
"Return non-nil if DEFINITION was generated from advice information."
(if (or (ad-lambda-p definition)
(macrop definition)
(ad-compiled-p definition))
(let ((docstring (ad-docstring definition)))
(and (stringp docstring)
(get-text-property 0 'dynamic-docstring-function docstring))))))
flymake-current-line-no 削除
「flymake-current-line-no」が無くなりました。自作の物に利用しているかもしれません。
「line-number-at-pos」に変更すれば良いです。
不安定
experimental/hackers-only パッチの適用 を実施していると安定するはずです。
どうしても不安定な場合は「FontBackend」を古い物に変更すると安定する場合があるようですが、あまりお勧めしません。
24.3 での非互換性
- 「modeline」が無くなり「mode-line」に統一されました
- DDSKK 14.4 以下は modeline を利用していますので、DDSKK 15.1 以降にアップデートする必要があります
- color-theme の配布テーマの一部が modeline を利用していますので動作しません。利用テーマの配布サイトをご確認ください
- viewer.el は modeline を利用しています。v 1.13 以降にアップデートする必要があります
- 「string-to-sequence」が無くなり、「string-to-list」か「string-to-vector」に変更する必要があります
Emacs24 の新機能
新機能は非常に多いので、その一部だけ解説します。
パッケージ管理
Emacs24 では Emacs Lips パッケージの管理機能が追加されています。
M-x list-packages でインストール可能なパッケージ一覧が表示されます。
インストールしたいパッケージで i を押すとインストール候補になり、 x でインストールを実行するか確認されますので、 yes でインストールします。
インストールしたパッケージはデフォルトでは .emacs.d/elpa/ に保存されます。
初期設定ではパッケージ一覧は http://elpa.gnu.org/packages/ から取得しますが、追加することも可能です。
現在以下の二つのURLが安定して利用できます。
追加するには .emacs.d/init.el に以下のように設定します。
(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/") t)
(add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/"))
(package-initialize)
M-x list-packages すると候補が増えます。
Emacs Lisp における Lexical binding
プログラミング言語のスコープには Lexical Scope と Dynamic Scope があり、現在利用されているプログラミング言語のほとんどは Lexical Scope です。
しかし Emacs23 までの Emacs Lisp は Dynamic Scope でした。Emacs24 ではファイル毎の設定に依存しますが、Lexical Scope を利用できるようになりました。
現代プログラムでは Lexical Scope しか利用しないのであまり意識していないかもしれませんが、Lexical Scope と Dynamic Scopeを簡単に説明しておきます。
他言語でのLexical Scope の確認
まずは普通のプログラミング言語でのスコープをおさらいしておきます。
例えば、Python の場合以下のように記述して、「sample.py」の名前で保存します。
python sample.py で実行すると表示される値は「10」です。
関数の中で値を変更しても、外の変数に影響を与えません。普通ですね。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
x = 10
def one():
return x
def two():
x = 5 # x に代入している
return one()
print '%d' % two() # 10 が表示される
従来のEmacs Lisp の Dynamic Scope
Emacs Lisp は 以下のように記述して、「sample.el」の名前で保存します。
emacs --script sample.el で実行すると表示される値は「5」です。
関数の中での変更が、外の変数に影響を与えています。
;;; -*- coding: utf-8 -*-
(setq x 10)
(defun one ()
x)
(defun two ()
(let ((x 5)) ;; x に代入している
(one)))
(message "%d" (two)) ;; 5 が表示される
Emacs Lisp ではこれを回避するために cl パッケージに「lexical-let」がありますがあまり利用されていません。
利用されていない原因はエミュレートしているだけで、本当の Lexical Scope ではないからでしょう。
また cl パッケージなのでバイトコンパイル時に注意が出てしまいます。
;;; -*- coding: utf-8 -*-
(require 'cl)
(setq x 10)
(defun one ()
x)
(defun two ()
(lexical-let ((x 5)) ;; lexical-let
(one)))
(message "%d" (two)) ;; 10 が表示される
Emacs24 からの Lexical Scope
Emacs24 からは Emacs Lisp ファイルの先頭に -*- lexical-binding: t -*- を追加することで、 setq で宣言した変数は本当の Lexical Scope になります。
;;; -*- coding: utf-8; lexical-binding: t -*-
(setq x 10)
(defun one ()
x)
(defun two ()
(let ((x 5))
(one)))
(message "%d" (two)) ;; 10 が表示される
defvar ( defcustom ) で変数宣言した変数は Common Lisp 同様にいかなる場合でも Dynamic Scope になります。
;;; -*- coding: utf-8; lexical-binding: t -*-
(setq x 1)
(defvar y 2)
(defun one ()
(message "x = %d, y = %d" x y) ;; x = 1, y = 5
(+ x y))
(defun two ()
(let ((x 3)
(y 5))
(one)))
(message "%d" (two)) ;; 6 が表示される(x = 1, y = 5の加算)
これがどうすばらしいかと言うと、現在利用されている他の言語と同じになったことがすばらしい、ということです。
特に Common Lisp や Scheme を利用している人には朗報です。 Emacs Lisp へのスクリプトの移植が比較的容易になったので、今後スクリプトの移植が進むかもしれません。
ただ、既存の Emacs Lisp に与える影響が大きいので、移行は徐々にしか行なわれないでしょう。
Attention!
;;; -*- coding: utf-8; lexical-binding: t -*-
の行は必ずファイルの先頭に書いてください。空白行は無視しません。
また、スクリプトとして動作させる場合、普通は
#!/usr/bin/env emacs --script
の行を一行目に書きますが、これを一行目に書いてしまうと lexical-binding が有効になりません。
Note
setq 、 defvar 、 defcustom の違いが認識できていないと意味が不明な部分がありますので、補足します。
Common Lisp では setq と defvar はどちらも変数を宣言しますが、 setq は Lexical Scope、 defvar は Dynamic Scope になります。
Emacs Lisp において setq と defvar の違いを、 setq は値を上書きする、 defvar は値を上書きしない、のような理解している方は正確には間違いです。
これらは Common Lisp の setq と defvar の動作を近似させようとした物であり、上書きする、しないの違いに見える動作は、 Emacs Lisp が Dynamic Scope しかないための動作です。
defcustom は 内部的には defvar です。
テーマ機能の同梱
従来 Emacs の色を設定するために color-theme がありましたが、同様の機能が同梱されました。
M-x customize-themes にてテーマのカスタマイズが可能です。
また、 custom-theme-directory (デフォルトは .emacs.d 以下) に themes ディレクトリを作成し、作成したテーマファイルを配置することで、テーマを設定することも可能です。
color-theme と互換性が無いため、まだテーマは少ないですがいくつか作成されています。
アニメーションGIF対応
Image API が更新されて、透過GIFやアニメーションGIFが Emacs 内部で表示できるようになっています。
Linux 環境等で ImageMagick がインストールされていると、 ImageMagick 関連の関数も利用できるようになります。
GnuTLS サポート
GnuTLS は SSL/TLSプロトコルの実装の一つです。
GnuTLS がインストールされた環境でコンパイルすると Emacs ネイティブで SSL/TLS な通信が可能になります。
libxml2 サポート
libxml2 がサポートされ、libxml2 を利用した HTML と XML パース関数が増えています。
- libxml-parse-xml-region
- libxml-parse-html-region
例えば以下のように利用します。 xml-parse-region 関数を利用するよりも早く、正確なパースが実行できます。
(require 'xml)
(let* ((xml "<chapter title=\"Emacs24 のインストールと新機能\" id=\"emacs24\">
<section>概要</section>
<body>主に日本語にしてみている</body>
<info>情報</info>
</chapter>")
(root (with-temp-buffer
(insert xml)
(libxml-parse-xml-region (point-min) (point-max))))
(chapter (rest root))
(attras (xml-node-attributes root))
(title (rest (assq 'title attras)))
(body (first (xml-get-children chapter 'body)))
(text (first (xml-node-children body)))
)
(message "title: %s, text: %s" title text))
Emacs24 に同梱されている Gnus(メール、ニュースリーダ)には libxml-parse-html-region 関数が組込まれており、 Gnus 単体で HTML メールをレンダリングして、表示します。
バッファの状態を保存
Emacs 24.4 から、終了時のバッファの状態をある程度保存できるようになりました。
(desktop-save-mode t)
詳細は以下をご覧ください。
https://www.gnu.org/software/emacs/manual/html_node/emacs/Saving-Emacs-Sessions.html
まとめ
Emacs 24 は非常に多くの機能が追加されており、おもしろいバージョンです。
多少過去の Emacs Lisp が動作しない場合がありますが、興味がある方は移行してみると良いのではないでしょうか。
変更履歴
- 2015-04-18: Emacs 24.5 の記述を追加
- 2015-02-15: 非互換関数を追加
- 2015-02-11: Emacs 24.4 の記述を追加
- 2013-08-09: experimental/hackers-only パッチのバージョン番号修正
- 2013-05-09: experimental/hackers-only パッチのバージョン番号修正
- 2013-04-14: Emacs 24.3 対応インラインパッチ記述修正
- 2013-04-09: Emacs Lisp 非互換に関しての記述を修正、インラインパッチのパッチファイル名のミス修正
- 2013-04-06: Emacs 24.3 の記述を追加
- 2012-11-16: autoconf のインストールに補足記述を追加
- 2012-08-28: Emacs 24.2 の記述を追加
- 2012-07-28: autoconf と マウス関連に関しての記述を追加
- 2012-06-24: Emacs24 コンパイル済みバイナリに関して記述を追加
- 2012-06-12: experimental/hackers-only パッチビルド手順にミスがあったのを修正
- 2012-06-10: Emacs 24.1 に対応。 self-contained ビルドの方が人気がある模様なので、 self-contained ビルドを標準的な解説に変更。
- 2012-06-02: setq、defvar に関して補足を追加
- 2012-06-02: rc に対応。libxml2に使い方を追加。テーマ機能の解説追加。誤植修正
- 2012-05-31: 公開
以下はゲストコメント可能です。名前とメールアドレスは任意の物を入力していただいてかまいません。 blog comments powered by Disqus