基本的構成を確立する - lisp-cookbook-ja/common-lisp GitHub Wiki

eli

基本的構成を確立する

  • eli は the Emacs-Lisp Interface の略で、Franz社が提供するLisp統合開発環境です。
  • 処理系は Allegro Common Lisp のみに対応しています。
  • Emacs は GNU Emacs (18 以降) と XEmacs に対応しているようです。
  • このエントリでは eli の基本的な構成を確立する手順を説明します。
  • 公式マニュアル も提供されていますので、このエントリの主な価値は日本語で書いてあるということです。

取得と配置

  • Allegro Common Lisp の配布に同梱されています。EmacsWiki等での提供は、このエントリ執筆時点では存在しません。
  • Allegro Common Lisp をインストールしたディレクトリの中に、eliディレクトリとxeliディレクトリがあり、ここにフラットにelispファイルが存在します。xeliディレクトリの中身は、ほとんどがeliディレクトリの中のファイルへのシンボリックリンクです。
  • 結局、Allegro Common Lisp の取得と配置以外は何もしなくてもOKです。

設定

  • .emacs などの Emacs 初期化ファイルに次の行を加えます。
;; Allegro Common Lisp を配置した位置を/usr/local/acl181とします。
;; Emacs の場合
(load "/usr/local/acl81/eli/fi-site-init")
;; XEmacs の場合
(load "/usr/local/acl81/xeli/fi-site-init")

REPLの起動と終了

  • REPL の起動は、M-x fi:common-lisp でOKです。REPL 起動時に Lisp image ファイル等を聞かれますので、入力します。入力のデフォルト値を指定しておくには、.emacs等で、
  (setq fi:common-lisp-image-name "/usr/local/acl81/alisp")
  (setq fi:common-lisp-image-file "/usr/local/acl81/alisp.dxl")
  (setq fi:common-lisp-directory "~/tmp/")

などと指定しておきます。いつも同じならば、「もうちょっと整備するときは」のところのexamplesにあるように run-common-lisp を定義してしまうのがよいでしょう。

  • この手順の場合、Common Lisp は Emacs のサブプロセスとして起動されます。

  • REPLの終了は、REPL 上で :exit と入力します。

  • REPL 起動時の引数指定は、Emacs を再起動するかしない限り、残りつづけます。なので、M-x fi:common-lisp とすると対話なしに、以前指定した指定で Lisp が起動します。例えば、mlisp に切り替えるためなど起動時引数を変更することがREPL再起動の目的である場合は、C-u M-x fi:common-lisp としてください。再度対話的に起動できます。

モードについて

  • fi:common-lisp で起動したREPL(バッファ)のメジャーモードは、Inferior Common Lisp モードになります。
  • eli にはたくさんのモードが用意されています。一覧は次のとおりです。
fi:inferior-common-lisp-mode
fi:lisp-listener-mode
fi:common-lisp-mode
fi:definition-mode
fi:inverse-definition-mode
fi:scan-stack-mode
fi:shell-mode
fi:su-mode
fi:remote-su-mode
fi:telnet-mode
fi:rlogin-mode
  • この中でもっとも利用頻度が高いのは、fi:common-lisp-mode でしょう。Lisp のソースファイルを編集するためのメジャーモードです。

fi:common-lisp-mode について

  • 編集対象である Common Lisp ソースファイルの解釈について EmacsとLispが間違いなくコミュニケーションするために、package と readtable を指定することが可能です。
  • 特段指定しなくとも、package については、Emacs が Common Lisp ソースファイルをパースして、(in-package ...) というマクロの存在を関知して自動的に設定してくれますので、問題なく動作します。
  • 指定には Emacs の mode specification (別名 file mode line) を使います。フルに指定する例は次のとおりです。
;; -*- mode: fi:common-lisp-mode; package: mypack; readtable: myrt -*-
(in-package :mypack)
(eval-when (compile 
            load
            eval)
  (setq *readtable* (named-readtable :myrt)))

各種マイナーモードとの相性

  • Paredit、Show-Paren、Yas/Minor、Auto-Complete 等と一緒に使ったところ、気になる衝突はありませんでした。

  • Redshank は、C-c C-s が衝突しているので調整が必要です。

  • Inferior Common Lisp mode : C-c C-s fi:re-search-forward-input

  • Common Lisp mode : C-c C-s fi:lisp-eval-or-compile-last-sexp

  • Redshank mode : C-c C-s redshank-complete-form

もうちょっと整備するときは

  • eli/examples/emacs.el misc/dot-emacs.elに .emacs のちょっと便利な設定例があり、参考になります。