今日、1年半ぶりにEmacsの新バージョン(24.4)がリリースされたので、
さっそくインストールしてみました。
注意すべき点は大きくわけて4つです。
- パッケージエラーの回避方法
- Emacs組み込みWebブラウザEWW!
- ついにバイトコンパイル問題に決着!
- org-mode がorg7→org8へ変更
編集コマンドの変更点について書きました。
標準パッケージの更新点も書きました。
様々な設定ファイルが~/.emacs.d/以下になりました。
defadviceに代わる新しいアドバイス定義ができるようになりました。
ビルド
僕のところのconfigureビルドオプションはこんな感じです。環境はGNU/Linuxです。
$ wget -O- http://ftp.gnu.org/gnu/emacs/emacs-24.4.tar.xz | tar xJvf - $ cd emacs-24.4 $ ./configure --disable-largefile --with-x-toolkit=motif --without-toolkit-scroll-bars \ --without-xaw3d --without-xim --without-compress-info --without-sound --without-pop \ --without-sync-input --without-xpm --without-tiff --without-rsvg --without-gconf \ --without-gsettings --without-selinux --without-gpm --without-makeinfo --with-x && make \ && sudo make install
コンピュータの性能は一級品ではあるが、
とにかく無駄を徹底的に省くスタイルです。
packageが使えない!?→解決
まず、起動していきなりエラーが起きました。
どうやら (package-initialize) で
Debugger entered--Lisp error: (void-function package-desc-vers) package-desc-vers([(1 3) nil "Interface to ack-like source code search tools" tar ((:keywords "tools" "processes" "convenience") (:url . "https://github.com/leoliu/ack-el"))])
NEWSによると原因はこれですね。
The format of `archive-contents' files, generated by package
repositories, has changed to allow a new (fifth) element in the data
vectors, containing an associative list with extra properties.
(For example, `describe-package' uses the `:url' extra property to
display a "Homepage" header.)
package.elで使っているデータ構造が変更されたので、
melpaのパッケージがエラーを起こしているようです。
package-desc-vers と
いう関数が削除されたので
package–ac-desc-version
という関数を使えということです。
こういう非互換な変更はちゃんとNEWSに書いてほしいものです(苦笑)
正直ものすごい迷惑…
これを24.3/24.4で実行したところ
(package-initialize) (print (list :package-desc-vers (fboundp 'package-desc-vers) :package--ac-desc-version (fboundp 'package--ac-desc-version)))
$ emacs-24.3 -script package.check.el (:package-desc-vers t :package--ac-desc-version nil) $ emacs-24.4 -script package.check.el (:package-desc-vers nil :package--ac-desc-version t)
このように関数名が変わってしまいました。
対処するには以下の設定を加えます。
(fset 'package-desc-vers 'package--ac-desc-version)
追記
melpaというパッケージはもう使わないので削除してください。
削除方法はM-x list-packagesで
C-u C-s ^ SPC SPC melpa
でmelpaパッケージの行に行き、d xを押します。
quelpa-self-upgradeでエラー
package.elの自然な拡張形quelpa を使っている人は注意です。
quelpa-self-upgrade でエラーになってしまいます。
これもおそらくpackage.elのデータ構造変更が原因と思われます。
quelpa-self-upgradeはquelpa.elを自動更新するだけなので、
その行はコメントアウト(とりあえず行頭に ;; を置く)してください。
それまではバッチモードで更新すればよいです。
$ emacs -Q -batch -f package-initialize -f quelpa-self-upgrade
EWW: Emacs組み込みWebブラウザ
ついにEmacs標準にWebブラウザ(テキストブラウザ)までついてきました!!!!
一言で言うと、 emacs-w3m が標準で使えるようなものです。
インライン画像も表示できますし、
libxml2を使っているので速度も申し分ありません。
Windowsでemacs-w3mの設定に悪戦苦闘している人には嬉しい話ですね。
Fig1: M-x eww http://www.gnu.org/software/emacs/
org-modeがorg8へ変更
org-mode がorg 7.9.3からorg 8.2.10に変更されました。
大幅に変更が加えられているので、
org-mode ジャンキーは戸惑うことでしょう。
org7→org8の相異点(Worg)
7.9.3、7.9.4、8.0.3の相異点(ReleaseNote) と
8.1と8.2の相異点(ReleaseNote) を見てください。
とくに org-export での操作性が大幅に変わった上、
example, srcブロックの可読性がひどいことに なりました。
load-prefer-newer: バイトコンパイル忘れでハマることはもうない
load-prefer-newer 変数は、 バイトコンパイル問題 を解決してくれます。
従来のEmacsではバイトコンパイルされていないファイル(.el)の方が新しい場合、
古いバイトコンパイル済みのファイル(.elc)がろロードされましたが、
(setq load-prefer-newer t)
を設定することで、新しい方を読み込んでくれます。
今更な感じはしますが、嬉しいことです。
eshell $ cd /tmp eshell $ echo '(setq x "old")' > test.el eshell $ byte-compile-file test.el eshell $ echo '(setq x "new")' > test.el eshell $ emacs -Q -batch -eval '(progn (setq load-prefer-newer nil) (load "/tmp/test")(print x))' Loading /tmp/test (compiled; note, source file is newer)... "old" eshell $ emacs -Q -batch -eval '(progn (setq load-prefer-newer t) (load "/tmp/test")(print x))' Loading /tmp/test.el (source)... "new"
view-modeの操作性がよくなった!
view-mode で何も設定しなくてもSPCでスクロール、
S-SPCで逆スクロールしてくれます。
デフォルトでページャらしくなりました。
僕はとっくの昔にキーを設定していますが、
デフォルトで使いやすくなるのはいいですね!
C-x 2: split-window→split-window-below
split-window (C-x 2) はコマンドではなくなったので、
もしキーに割り当てているのならば
split-window-below に置き換えてください。
比較関数が複数個の引数を取るようになった
比較演算子(=, <, >, <=< , >=)が
複数の引数を取るようになりました。
なぜ今まで2つしか取らなかったのかが意味不明です。
(< 1 2 3) ; => t
with-eval-after-load: eval-after-loadのマクロ版
with-eval-after-load は eval-after-load のマクロ版です。
eval-after-loadはquoteとprognが必要で
すげーダサかったけど、with-eval-after-loadを使えば
すっきり書けます。
(eval-after-load 'foo
'(progn
(setq x 1)
(setq y 2)))
↓
(with-eval-after-load 'foo
(setq x 1)
(setq y 2))
総評
とりあえず、package.el関連のエラーに悩まされると思いますが、
今のところ他に目立つエラーは出ていません。
ただ、Emacs初級者はリリース直後のバージョンには手を出さない方がいいです。
なぜなら、Emacs本体に非互換な変更が含まれるので、
使っているパッケージがエラーになることがあるからです。
パッケージの作者の対応待ちがあるので、
あせらず数週間くらい待ってれば安定してきます。
もちろん自力で問題解決できる人ならばすぐにアップグレードしてもいいです。
他にもここでは述べていない細かい変更点があるので、
追々紹介していきたいと思っています。
本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。