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

APEL非依存版elscreenをバイトコンパイル可能にしてみた

私は普段Emacsでelscreen.elを使っている.
このパッケージにより,windowの分割を保って別のwindow(スクリーン)に切り替えることが可能になる.
オリジナルのelscreen.elは以下のサイトで入手可能である.
興味を持たれた方は使ってみるとよいだろう.
ElScreen | Fragments of Reality

さて,このオリジナルのelscreen.elであるが,APELという古いパッケージに依存している.
現在,開発が事実上停止していると思われ,Emacsのバージョンアップにも追随できていない.
なお,2012年9月22日現在,公式ページからのAPELのダウンロードは不可能な状況である*1

そこで最近,elscreen.elのAPEL依存性の問題を解決したfork版が登場した.
shosti/elscreen · GitHub
APEL非依存となったためインストールが楽になったメリットが大きい.
load-pathの通ったところに置いて

(require 'elscreen)
(elscreen-start)

とすればOKである.
しかしながら,バイトコンパイルが通らないという問題があった.
実際,以下のようなエラーメッセージを吐かれる.

In elscreen-get-screen-to-name-alist:
elscreen.el:671:21:Warning: `mapcar' called for effect; use `mapc' or `dolist' instead
elscreen.el:672:22:Warning: `mapcar' called for effect; use `mapc' or `dolist' instead

In elscreen-find-screens:
elscreen.el:770:9:Warning: `mapcar' called for effect; use `mapc' or `dolist' instead
elscreen.el:1463:30:Error: Symbol's function definition is void: elscreen--set-alist

Warningはさして重要なメッセージではない.
問題はErrorである.
今回,このErrorを吐かれないよう,コードを一部修正してみた.

バイトコンパイルを通るようにした以外での変更点をまとめると以下のとおりである.

  →Warning抑制のため.

  • get_alistというelscreen.el内部で定義された関数をassoc-defaultで置換.

  →両者の関数の動作は同等である.

  • 一部関数名に'-e21-'が使われているのを消去

  →おそらくemacs 21が由来なのだろうが.

  • elscreen-startup-line-processingに関するコードを削除

  →Window切り替えを目的とする私にとっては,これは必要ない.

  • elscreen-save-screen-excursion内のmapcar関数をmapc関数に変更

  →mapcarの戻り値を使っていないので.Warning抑制のため.

  • elscreen-get-screen-to-name-alist内の一部のmapcar関数をmapc関数に変更

  →mapcarの戻り値を使っていないので.Warning抑制のため.

以下がpatchファイルへのリンクである.
内容はついては無保証である.
気に入らなければご自分で修正されるのがよいだろう.
patch file for elscreen.el

追記

Errorだけでなく,Warningも出ないように修正しておいた.

追記2

上記elscreenをforkし,githubに自分のリポジトリを作成.パッチ適用済のソースはこちらから.
https://github.com/tam17aki/elscreen

追記3

本家shosti/elscreen · GitHubにpull requestを出してある.
残念ながら,取り込まれる見込みは薄かろう.

追記4

一部の関数名に変更が入っているので,従来のelscreenのコードを元にした拡張(elscreen-mewやelscreen-wlなど)は動かない可能性があるので注意.

*1:githubにクローンが存在しており,APELのダウンロード自体は可能.https://github.com/wanderlust/apel