今日、1年半ぶりにEmacsの新バージョン(24.4)がリリースされたので、
さっそくインストールしてみました。

注意すべき点は大きくわけて4つです。

  • パッケージエラーの回避方法
  • Emacs組み込みWebブラウザEWW!
  • ついにバイトコンパイル問題に決着!
  • org-mode がorg7→org8へ変更

カテゴリ「Emacs 24.4」記事全体

<2014-12-21 Sun> melpaパッケージの削除について追記
<2014-10-22 Wed> 編集コマンドの変更点について書きました。
<2014-10-23 Thu> 標準パッケージの更新点も書きました。
<2014-10-29 Wed> 様々な設定ファイルが~/.emacs.d/以下になりました。
<2014-10-30 Thu> 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)

<2014-12-21 Sun>追記

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の設定に悪戦苦闘している人には嬉しい話ですね。

20141021135204.png
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-loadeval-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本体に非互換な変更が含まれるので、
使っているパッケージがエラーになることがあるからです。

パッケージの作者の対応待ちがあるので、
あせらず数週間くらい待ってれば安定してきます。

もちろん自力で問題解決できる人ならばすぐにアップグレードしてもいいです。

他にもここでは述べていない細かい変更点があるので、
追々紹介していきたいと思っています。

本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。