4/07/2011

第3回 SLIMEの使い方 基礎編

前回はQuicklispによるライブラリ管理について説明しました。今回はSLIMEの 基本的な使い方について説明します。

SLIMEとは

SLIMEは(Common) Lispのための統合開発環境(IDE)です。他のIDEとは異なり、 対話的にプログラムを構築できるのが特徴です。一度ハマれば他の開発環境は 使えなくなるでしょう。詳しい情報は次のURLを参照してください。
http://common-lisp.net/project/slime/

インストールと設定

SLIME

SLIMEのCVSスナップショット(本家推奨)をインストールします。OSは GNU/LinuxやMac OS XなどのUNIX系OSを想定しています。
$ wget http://common-lisp.net/project/slime/snapshots/slime-current.tgz
$ tar xvzf slime-current.tgz
$ mv slime-* ~/.emacs.d/slime
展開したディレクトリはslime-2011-04-07のような名前になりますが、ここ ではslimeという名前で~/.emacs.d/直下に移動します。
次にEmacsの設定を行います。次のコードを~/.emacsに書いてください。
;; Clozure CLをデフォルトのCommon Lisp処理系に設定
(setq inferior-lisp-program "ccl")
;; ~/.emacs.d/slimeをload-pathに追加
(add-to-list 'load-path (expand-file-name "~/.emacs.d/slime"))
;; SLIMEのロード
(require 'slime)
(slime-setup '(slime-repl slime-fancy slime-banner slime-indentation))
これで基本的な設定は完了です。
2011/7/10追記
若干設定項目が足りなかったので補足します。
;; SLIMEからの入力をUTF-8に設定
(setq slime-net-coding-system 'utf-8-unix)
2013/09/20追記
slime-indentationを追加しました。これで後述のcl-indent-patchesの設定は不要です。

popwin.el

使い始めれば気付くと思いますが、SLIMEは事あるごとにEmacsのウィンドウを 分割したり、他のウィンドウのバッファを切り替えたりします。これではせっ かくの優れた開発環境も台無しです。そこで、拙作のpopwin.elをインストール することをお勧めします。popwin.elはウィンドウの分割等を極力抑制し、プロ グラマが快適に作業することを助けてくれる優れものです。
インストール方法や使い方は次のURLを参照してください。
http://d.hatena.ne.jp/m2ym/20110120/1295524932
インストールが完了したら次のコードを~/.emacsに書いてください。
;; Apropos
(push '("*slime-apropos*") popwin:special-display-config)
;; Macroexpand
(push '("*slime-macroexpansion*") popwin:special-display-config)
;; Help
(push '("*slime-description*") popwin:special-display-config)
;; Compilation
(push '("*slime-compilation*" :noselect t) popwin:special-display-config)
;; Cross-reference
(push '("*slime-xref*") popwin:special-display-config)
;; Debugger
(push '(sldb-mode :stick t) popwin:special-display-config)
;; REPL
(push '(slime-repl-mode) popwin:special-display-config)
;; Connections
(push '(slime-connection-list-mode) popwin:special-display-config)

ac-slime

ac-slimeはauto-complete.elのSLIME拡張です。SLIME(SWANKサーバー)の情報を 利用するため、非常に高精度のコード補完が行えます。
ac-slimeは次のURLから入手できます。
https://github.com/purcell/ac-slime
なおauto-complete.elをあらかじめインストールしておく必要があります。イ ンストールしていない方は次のURLを参照してください。
http://cx4a.org/software/auto-complete/index.ja.html
ac-slimeをインストールするには、先のURLからac-slime.elをダウンロードし、 load-pathの通ったディレクトリにコピーします。install-elispや auto-installがある場合は次のコードを評価することでインストールできます。
;; install-elisp
(install-elisp "https://github.com/purcell/ac-slime/raw/master/ac-slime.el")
;; auto-install
(auto-install-from-url "https://github.com/purcell/ac-slime/raw/master/ac-slime.el")
最後に~/.emacsに次のコードを書いてインストール完了です。
(require 'ac-slime)
(add-hook 'slime-mode-hook 'set-up-slime-ac)
(add-hook 'slime-repl-mode-hook 'set-up-slime-ac)
これで.lispファイルやREPLでauto-complete.elを使った自動コード補完が行え るようになりました。

cl-indent-patches.el

↓SLIMEに取り込まれたため、このcl-indent-patches.elの導入は不要です。(2013/09/20)
この節は2011/7/10に追記しました
Emacs標準のインデント機能には若干問題があります。特にloopマクロのイン デントが変です。例えば次のようなインデントになってしまいます。
(loop for x in lst
      if (oddp x)
      collect x)
本来は次のようにインデントされるべきです。
(loop for x in lst
      if (oddp x)
        collect x)
このあたりに気をきかせてくれるのがcl-indent-patches.elです。次のURLから 入手できます。
http://boinkor.net/lisp/cl-indent-patches.el
このファイルをload-pathの通ったディレクトリに配置してください。後は .emacsに次のような設定を書けばOKです。
(when (require 'cl-indent-patches nil t)
  ;; emacs-lispのインデントと混同しないように
  (setq lisp-indent-function
        (lambda (&rest args)
          (apply (if (memq major-mode '(emacs-lisp-mode lisp-interaction-mode))
                     'lisp-indent-function
                     'common-lisp-indent-function)
                 args))))

SLIMEの使い方

SLIMEの起動

インストールと設定が完了したらM-x slimeとやってみましょう。次のような 表示の*slime-repl ccl*というREPLバッファが表示されれば成功です。
CL-USER> 
SLIMEを使って開発するに際して、まずやることはこのM-x slimeです。これ を行わなければ、後で説明するエディタコマンドやインデント、コード補完、 その他諸々が全く機能しません。まずM-x slime、これだけ覚えておいてくだ さい。
なお表示されたREPLバッファはちょっとした確認などを行ったりする場合を除 いて基本的には使用しません。

SLIMEの操作

SLIMEを起動して次にすることはlispファイルを開くことです。試しに foo.lispなどの適当なファイルを開いてください。
lispファイルのメジャーモードはlisp-modeです。このモードには様々なキー が割り当てられていますが、今回はその中でも覚えておくべきキーバインドを 紹介します。

C-c C-c

C-c C-cは現在ポイントしているトップレベルフォームをコンパイルします。 例えば次のような関数を編集しているとします。
(defun f (a)
  "Hello, World")
ここでC-c C-cすると関数fがコンパイルされます。実際にやってみれば分 かると思いますが、上の関数をコンパイルすると、SLIMEは変数aが未使用で あると警告してくれます。もし警告があればそれを修正してC-c C-c、という のが基本的な開発サイクルになります。

C-c C-k

C-c C-kは現在のファイルをコンパイルしてロードします。トップレベルフォー ムを一つずつC-c C-cするのが面倒なときに重宝します。また、C-c C-c同 様、ソースコードに問題があれば警告してくれるので、ファイルの最終的な確 認にも利用できます。

C-c C-z

C-c C-zは現在接続しているサーバーのREPLバッファを表示してくれます。何 か確認したいときや、前回紹介したQuicklispでライブラリをロードしたいとき にC-c C-zします。例えばCL-TEST-MOREというライブラリをロードし忘れてい たとしたら、C-c C-zでREPLバッファを表示して、次のように入力します。
CL-USER> (ql:quickload :cl-test-more)
REPLは使いこなせば非常に強力なので是非活用してください。

困った時

より本格的な開発サイクルは次回で説明しますが、SLIMEにおけるEmacsの C-g的な存在としてM-x slime-restart-inferior-lispを紹介しておきます。
これは現在接続しているサーバーを再起動してクリーンな状態に戻すコマンド です。SLIMEで開発していると、変にシンボルがインターンされたり、おかしな 値の変数ができたりします。また、正しく動作しているとしても、実は古い変 数などが残っていて偶然動作しているだけだったりもします。そういった状態 をリセットするのにM-x slime-restart-inferior-lispは非常に便利です。是 非覚えておいてください。

まとめ

今回は「SLIMEの使い方 基礎編」ということで、SLIMEのインストールと設定、 および非常に基本的な使い方を紹介しました。実際のところ、今回の内容だけ でSLIMEで開発を行うにはかなり情報が不足しています。Common Lisperなら気 付いていると思いますが、パッケージの扱いなど、様々な重要な点を端折って います。次回以降、より実際的なSLIMEの使い方を紹介していきたいと思います。

0 件のコメント:

コメントを投稿