Hatena::ブログ(Diary)

ありの日記 このページをアンテナに追加 RSSフィード

2009-02-23

Emacs + SLIMEでCommon Lisp環境を整える

| 22:48 |  Emacs + SLIMEでCommon Lisp環境を整えるのブックマークコメント

Ubuntu8.10にEmacsCommon Lispの開発環境をセットアップする方法をcametanさんに教えてもらったので早速インストール!

まず、Emacsインストール

[システム]→[システム管理]→[日本語セットアップヘルパ]を起動し、「emacs-env-ja」にチェックを入れる。(ここに来るまでに何度かOKボタンを押さないといけない。)

f:id:hiro_nemu:20090223224251p:image

次に必要になるパッケージのインストール

[システム]→[システム管理]→[Synaptic パッケージ・マネージャ]を開き以下のパッケージにチェックを入れ、「適用」を押してインストール

(cametanさんそのまま使わせていただきましたm(_ _)m)

f:id:hiro_nemu:20090223224317p:image

Emacs初期化ファイルをコピー

cp /usr/share/doc/emacs-env-ja/dot.emacs.example ~/.emacs

Emacsの設定とかを行うファイルらしい。コメントも日本語でかかれてるのでわかりやすい。後でいじってみる。

SLIME等の設定を行う。

↓下のリンクにある設定をさっきコピーしてきた「.emacs」ファイルに書いてやれば動くらしいのだけど、何かうまくいかなかった^^;

Emacs による Lisp Hacking

なので、↓ここの設定をおこなって見たところ動いたので、その内容を載せときます。

EmacsにSLIMEを導入 - とりあえず暇だったし何となく始めたブログ

~/.emacsの最後に以下の内容を追加

;SLIME
;UbuntuでSLIMEをインストールした場合、ここにインストールされる「/usr/share/emacs/site-lisp/slime」
(setq load-path (cons (expand-file-name "/usr/share/emacs/site-lisp/slime") load-path))
(setq inferior-lisp-program "sbcl")     ; sbcl用

(require 'slime)
(slime-setup)
;HyperSpecを読み込む.
;HyperSpecがインストールされている場所「/usr/share/doc/hyperspec/」
(setq common-lisp-hyperspec-root
      (concat "file://" (expand-file-name "/usr/share/doc/hyperspec/"))
      common-lisp-hyperspec-symbol-table
      (expand-file-name "/usr/share/doc/hyperspec/Data/Map_Sym.txt"))

;w3mの設定
(require 'w3m-load)

;; HyperSpecをw3mで見る
(defadvice common-lisp-hyperspec
  (around hyperspec-lookup-w3m () activate)
  (let* ((window-configuration (current-window-configuration))
         (browse-url-browser-function
          `(lambda (url new-window)
             (w3m-browse-url url nil)
             (let ((hs-map (copy-keymap w3m-mode-map)))
               (define-key hs-map (kbd "q")
                 (lambda ()
                   (interactive)
                   (kill-buffer nil)
                   (set-window-configuration ,window-configuration)))
               (use-local-map hs-map)))))
    ad-do-it))

;日本語利用
(setq slime-net-coding-system 'utf-8-unix)

;; カーソル付近にある単語の情報を表示
(slime-autodoc-mode)

;=======================================================================
; 対応する括弧を光らせる
;=======================================================================
(show-paren-mode)

;=======================================================================
; リージョンに色を付ける
;=======================================================================
(setq transient-mark-mode t)

と、内容の詳細は先ほどのサイトを見てもらうとして・・・

(追記 cametanさんから「対応する括弧を光らせる」方法と「リージョンに色をつける」方法をおしえてもらいました)

Common Lispを呼び出す(?)

Emacsを起動する。

$ emacs

Emacsが起動したらAltとxを同時に押した(これはM-xと表記されるらしい)後に、slimeと入力。すると、こんな感じになりました。あってる?

f:id:hiro_nemu:20090223224429p:image

いやー。しかし、Emacsの使い方全然わからん。学生の時挫折して以来だもんね。

やりなおしEmacs講座でもやろうかな(ーー;

cametancametan 2009/02/23 23:23 おお、成功してますね。

>↓下のリンクにある設定をさっきコピーしてきた「.emacs」ファイルに書いてやれば動くらしいのだけど、何かうまくいかなかった^^;

あれ?
ああ、何かページ崩れ起こしてますね(苦笑)。すいません。
ここのサイトの保有者が確か、「実践Common Lisp」の翻訳者のうちの一人だと思ったんで、「確実性」から紹介したんですが、確認怠ってました。
ごめんなさい。
Wikiの<pre>タグにあたるトコが一部分消えてたりしてますもんね。

あと、便利なのは、一つは

;=======================================================================
; 対応する括弧を光らせる
;=======================================================================
(show-paren-mode)
;;

の追加です。これで括弧と括弧の対応が視覚的に分かるようになるんで、見た目便利でしょう。Lisp系は括弧の多さに「どことどこが結びついてんだ???」って分かりづらいですから。
後は、

;=======================================================================
; リージョンに色を付ける
;=======================================================================
(setq transient-mark-mode t)
;;

です。これで選択範囲の色が変わります。
Emacsの「良くない」トコは、これはデフォルトであるべきだろ、とかちょっと思うトコ、なんですよね(笑)。腹立つ(笑)。

>こんな感じになりました。あってる?

あってます(笑)。パーフェクト、です。

>いやー。しかし、Emacsの使い方全然わからん。学生の時挫折して以来だもんね。

うん、とは言っても、最近のEmacsは矢印キーも受け付けますし、メニューなんかもあるんで、実際大して敷居が高い、ってわけでもないです。むしろ、解説する側の方が「昔ながらの」解説するんでややこしかったりして(笑)。
実際の「今現在のEmacsの姿」と「昔ながらの拘り」が乖離してきてんですよね。

まあ、「実践Common Lisp」にも書いてましたけど、「Emacsがどうの」と言うより、SLIMEで「CL専用のIDEフロントエンド」って解釈する程度で構わない、と思います。実際CL使う以上はそんなに難しくない、です。と言うか、SLIMEがかなり出来が良いんですよ。多分、Emacsの拡張emacs lispファイルとしては一番の使い勝手、でしょうね。

基本的にマウスででもいいんで[File]→[New]辺りで新規ファイルを作成(キーだったらC-x C-f)、Common Lispでコードを書いて(ちなみに、コードを改行する場合は[RET]使うよりC-jにした方が同時にインデントしてくれるんで便利です)、C-c C-kでコンパイル(するとセーブするか?って尋ねられるんでyと答える)、Lispインタプリタ側で評価を見る、って単にそれだけの流れ、です。大した事無いですよね。と言うか、これが本当に「ラク」なんですよ(笑)。
SLIME知る前だと、いちいちファイルをセーブして、Lispインタプリタ側で(load "何とやら")とかやってましたから(笑)。これがもうメンド臭くって(笑)。

あとは、実践Common Lispの方に、基本的な使い方は書いてあるんで、それをフォローしていけば十分だと思います。
ただ、Lispboxとキーバインドが違うとこが一つだけあるんで、紹介しておきます。

>p15:C-c C-qとタイプするだけで、slime-close-parens-at-pointコマンドを呼び出すことができる。このコマンドは、その場所で必要な閉じ括弧をすべて閉じてくれる。

これはLispboxではそうなんですけど、純正のSLIMEですとキーバインドはC-c C-] となっています。

cametancametan 2009/02/24 05:29 追加情報、です。

>やりなおしEmacs講座でもやろうかな(ーー;

最近、Emacs初心者向けの講座記事、みたいなのが出てきました。

Emacs ビギナーに贈る、これからバリバリ使い隊!!人のための設定講座 その1。:
http://d.hatena.ne.jp/tomoya/20090121/1232536106

Emacs(中略)設定講座 その2「elisp のインストールと設定編」。:
http://d.hatena.ne.jp/tomoya/20090124/1232822594

Emacs設定講座 その3「scratch バッファと eval(評価)」。:
http://d.hatena.ne.jp/tomoya/20090215/1234692209

今まさに「連載開始」したばっかなんで、追いつくには丁度良い、と思います。
はてな、なんで同じシステムでご近所さん、でしょ(笑)。
Ruby用のEmacsプラグインを色々と製作されているrubikichiさんなんかも出没してるんで、楽しいと思いますよ(笑)。

hiro_nemuhiro_nemu 2009/02/24 23:46 >ああ、何かページ崩れ起こしてますね(苦笑)。すいません。

いえいえ。とんでもないです。私の書き方の問題かもしれませんので。もっと分かるようになればどこに間違いがるのか分かるんですけどね^^;

>Emacsの「良くない」トコは、これはデフォルトであるべきだろ、とかちょっと思うトコ、なんですよね(笑)。腹立つ(笑)。

すごーい。これは素晴らしい。ホントなんでデフォルトじゃないんですかねーこれ。むかし触ったときリージョンとかマークとかすぐに分かんなかったんですよねー。これあったら見れば分かりますねv
ありがとうございます^^

>あってます(笑)。パーフェクト、です。
こんなすぐできたのはcametanさんのおかげです。ホントにありがとうございます。

>C-c C-kでコンパイル(するとセーブするか?って尋ねられるんでyと答える)、Lispインタプリタ側で評価を見る、って単にそれだけの流れ、です。

と、今日はここでつまづいてしまいました。コマンドがないっぽい感じになっていまいました。また、明日頑張ります(笑

>SLIME知る前だと、いちいちファイルをセーブして、Lispインタプリタ側で(load "何とやら")とかやってましたから(笑)。これがもうメンド臭くって(笑)。
やっぱどんな言語でもすぐれたツールってのは重要ですよね。言語の生産性も重要かも知れないですけど、こういう補助的なツールもホントに大事ですよね。

>今まさに「連載開始」したばっかなんで、追いつくには丁度良い、と思います。
はてな、なんで同じシステムでご近所さん、でしょ(笑)。
Ruby用のEmacsプラグインを色々と製作されているrubikichiさんなんかも出没してるんで、楽しいと思いますよ(笑)。

追加情報ありがとうございますwまさに今の私にぴったりな講座っぽいです。これを機にいろんなところにかおを出していこうかなw

cametancametan 2009/02/25 02:16 >今日はここでつまづいてしまいました。コマンドがないっぽい感じになっていまいました。

あれ?おかしいな。
参考にした設定見る限り、特に特殊なキーバインド設定してるわけじゃなさそうなんですが……とか思ったんですが、分かりました(笑)。多分理由はこれ、です。書き忘れてたんで僕が悪いんですけど(苦笑)。
ええと、Common Lispのプログラムを書く際に、作成ファイルの拡張子をデフォルトでは".lisp"にしないといけない、んです。これでEmacsとSLIMEが「あ、これはCLプログラムだな」って判断します。
例えば、「hoge」と言うファイルを作っても、それはCLのソースファイルだと認識されないで単なるテキストファイルだ、って認識されるんです。だから"hoge.lisp"にしないといけません。そうするとC-c C-kが「効く」ようになります。

ご存知の通り、Windowsとは違って、Linuxでは「拡張子」ってのは全く意味が無い、と言えば無いんですが、ことEmacs使いに対しては「何のソースファイルなんだ?」とEmacsが「自動判別する為の」手がかりなんです。ここが結構重要なんです。
デフォルトで搭載されている対応言語ですと、例えば、C言語があったり、Pascalがあったりするわけですけど、例えば".c"と言う拡張子が付いてるファイルを開けようとすると自動的にc-modeが立ち上がって「C言語専用の」エディタに化けますし、".pas"と言う拡張子が付いてると今度はPascal専用のエディタに化けます。デフォルトで搭載されている以上、あまり設定は必要ないんで、まあ、可能性は低いでしょうが(笑)、例えばPascalをどうしてもコーディングしなきゃいけない、とか言う場合、そのままEmacsに頼れます。
".el"ってファイルもそうですよね。".el"って拡張子は「Emacs Lispとしての」ソースコードで、これが/usr/share/emacs/site-lisp/以下に突っ込まれる「プラグイン」の正体です。SLIMEもご多分に漏れません。

この辺がEmacsファンがEmacsが好きな理由の一つ、です。例えば、Eclipseなんかもそうですが、ある言語でソースを書こう、とすると十中八九、「モードを一々切り替えなきゃならない」と思います。Emacsはそう言うスタイルではない、んです。比較すると、どうしてもEclipseなんかはワンアクション多くなります。
ただ、Eclipseなんかの場合は、例えばworkspace以下に「整然と並んだソースファイル群」ってスタイルがピッタシで、やっぱり出自的にはJavaで多人数で大規模開発をするにはどうすんだ?って設計意図がどっかにあるんじゃないのか、と思います。下手に「自動切り替え」になってソースが混在したりすると大変だろ、みたいな。
反面、Emacsの方がどっちかと言うと「個人的なハッキング用途」に向いてる、んですよね。$HOME以下がゴチャゴチャ、で、そこから任意のソースを探せ、みたいな(笑)。
そもそも$HOMEはそう言う「突っ込み用途向け」ディレクトリですし、整理整頓対象じゃない、って言えばそうなわけです。「整理が必要な」場所は他でツリー然としてますし、汚いWindowsのゴチャゴチャになったデスクトップよろしく、本来は$HOMEって「無秩序状態」でいいんですよね(笑)。必要なファイルはlsで一発検索ですし、何ならgrep使えば良いや、みたいな(笑)。「見えるから」腹立つ雑然さも、本来テキストベースだとそれ程でもないや、と言うのとEmacs流儀ってのは「凄く合う」んですよね。
んで、それが「共有コンピュータ」での「マルチユーザーOS」としての解決法、だったんじゃないか、と思います。「管理」はroot権限で必要なんだけど個人ユーザーの$HOMEレベルではゴチャゴチャしてて構わん、みたいな(笑)。ログインさせる以上、他人の$HOMEには干渉させない、と言う辺りの設計哲学と言うか、設計の上手さがUNIX系OSの特徴だよな、とか思うわけです。

ちなみに、「紫藤のページ」経由ですと、恐らくDrScheme使ってますよね?「紫藤のページ」でもEmacs設定がちょこっと紹介されていますが、恐らくDrSchemeの方が便利で……って感じだと思います。僕も当初はそうでした(笑)。
EmacsはSchemeモードってのがやっぱりデフォルトで入っていて、".scm"だと、Schemeモードが立ち上がるんですけど……やっぱ現代的なGUIのIDEに慣れるとイマイチだよな、と。当初やっぱり僕もそう感じてました。
反面、今はScheme書くのもEmacsです。と言うのも、SLIMEっぽい「Scheme用の」Emacsファイル見つけちゃったから、に他なりません。この辺がやっぱりEmacsの「強み」なんです。
今、一番美味しいScheme開発環境が二つあって、これは残念ながらSynapticでは入らないんですが、紹介しておきます。

Quack:
http://www.neilvandyke.org/quack/

Scheme Complete:
http://synthcode.com/

今まで見てきた通り、これらのフォルダは「解凍して」Ubuntuだったら、/usr/share/emacs/site-lisp以下に突っ込む事。あとは.emacsに適当に設定を追加する事。これでどんどんどんどん「Emacs環境」が強化されていく、わけです。この辺気づいてくると「Emacsにハマって」来るんですよね(笑)。面白くなってくる(笑)。
また、特に××complete、って名前が付くと「TABキーで自動補完」機能が大体狙いなんで、特定の言語に合わせた「自動補完機能」が欲しい場合は、××complete.elでググれば大体見つかります。見つからない場合は、諦める、と(笑)。その場合はその言語はそこまでメジャーじゃない、って意味になります(笑)。

Quack+Scheme Completeの設定の参考は以下のページが有用でしょう。

http://www29.atwiki.jp/sicpstudygroup/pages/45.html

Quackはプルダウンメニュー中心ですし、また、色んなScheme処理系を「インストールさえしていれば」切り替えて使えます。
DrSchemeの場合、本体はMzSchemeと言う名前なんで、MzSchemeに合わせればEmacsからDrSchemeをコントロールする事が可能、ですね(と言うか、元々の開発目的は、EmacsからMzSchemeをコントロールするため、に開発された模様です)。
また、R5RSとかの仕様書へアクセスする機能や、SRFIと言う準公式ライブラリの仕様書にアクセスする機能がプルダウンメニューに含まれているんで、なかなか便利ですよ。DrSchemeはEmacs「以上に」立ち上がりが遅いんで、Quack慣れたら多分、DrSchemeと言うIDEを使うことはなくなるんじゃないのかな、と思います。

ついでにもう一つ情報を。
Ubuntu界隈では「初心者に対する端末講座」とか、あとは玄人の人たちはzshellへの移行、と言う話をしています。
でも、僕がお気に入りなのはEmacs Shell、なんですよね。これが使い勝手が凄く良い、です。最近は端末でbashを立ち上がる事が殆ど無くなりました。
Emacs Shellは略称Eshell、と言って、特に何か追加する必要はありません。Emacs22ならデフォルトで搭載されているんで、M-x eshellと打てばEmacs上でeshell端末が立ち上がります。使いようでは、例えばeshell上で

gedit hoge.lisp

とか打って「テキストエディタのEmacsから」別のテキストエディタを立ち上げる、とか(笑)。ちょっとメタ循環な状況になるんで笑えます(笑)。でも、場合によっては複数のテキストエディタを立ち上げると便利な場合があるんで重宝しますよね。
元々、Emacs ShellってのはEmacs21辺りだったら「追加が」必要だったんですが、Emacs22では標準仕様になった模様です。こうやって人気があって定番化するとFSFの方でEmacsにデフォルトで新機能として追加するようになる模様です。キッチンシンクアプローチ様々、ですよね(笑)。
また、Eshellの良いところは、例えば

Emacs設定講座 その3「scratch バッファと eval(評価)」。:
http://d.hatena.ne.jp/tomoya/20090215/1234692209

にはEmacs Lispを*scratch*バッファで評価する、ってやり方を推奨してるんですけど、ある種これは古いやり方で、実はEshellはそのままEmacs Lispも評価してくれる、んです。つまり、「Emacs Lispインタプリタ」としても動作する、んです。
これはかなり快適です。
と言うわけで、端末+bash離れでEshellを使うともっと幸せになれる、と言う情報です(笑)。

hiro_nemuhiro_nemu 2009/02/25 23:46 >多分理由はこれ、です。書き忘れてたんで僕が悪いんですけど(苦笑)。

ぃゃぃゃぃゃぃゃ。何をおっしゃいますかー。

.lispにしないといけなかったんですね。「実践Common Lisp」の方に.lispか.clで保存する習慣があるって書いてたから、短い方でいいやって思ったんです。.lispも試してみりゃよかったーっ。爪が甘い_| ̄|○

>そうするとC-c C-kが「効く」ようになります。
.lispにしたら効きました。えへ。

>ことEmacs使いに対しては「何のソースファイルなんだ?」とEmacsが「自動判別する為の」手がかりなんです。ここが結構重要なんです。

ですよね。ソースファイル作って保存して、こいつをLispと認識させるには何か一手間いるんじゃなかろうかと思って、、それが拡張子だったとは。いやー。恥ずかし^^;

>反面、Emacsの方がどっちかと言うと「個人的なハッキング用途」に向いてる、んですよね。$HOME以下がゴチャゴチャ、で、そこから任意のソースを探せ、みたいな(笑)。

HOMEの下ってゴチャゴチャでいいもんなんですね。.ディレクトリがいっぱい出来てるから何か気持ち悪かったりしたんですけど、、、必要な物をさがすなら確かにlsとgrep使えば何とでもなりますね。ほほう。これは新しい考え方ですねー(私の中で(笑))
そう思えば、気兼ねなく汚せる気がします。$HOMEはNautilusで見るようなもんじゃない、とw

>ちなみに、「紫藤のページ」経由ですと、恐らくDrScheme使ってますよね?

そうです、Schemeを書くときはこっちを使ってます。

>SLIMEっぽい「Scheme用の」Emacsファイル見つけちゃったから、に他なりません。この辺がやっぱりEmacsの「強み」なんです。

どっかで、誰かが作ってくれてるもんですねー。確かにEmacsでSLIMEっぽいSchemeってのがあったらそっち使っちゃいますよね。自動補完機能とかも、EclipseとかVisualStudioとかGUIのIDEにしか無いものだと思ってましたし(笑


>Quack+Scheme Completeの設定の参考は以下のページが有用でしょう。

ホントなになから何までありがとうございます。次にScheme勉強するときにQuackインストールしてみますねv

>Emacs Shellは略称Eshell、と言って、特に何か追加する必要はありません。Emacs22ならデフォルトで搭載されているんで、M-x eshellと打てばEmacs上でeshell端末が立ち上がります

おお。シェルですねwエディタからエディタが開きましたよ(笑)EmacsOSですね。まったく。

>実はEshellはそのままEmacs Lispも評価してくれる、んです。つまり、「Emacs Lispインタプリタ」としても動作する、んです。
これはかなり快適です。
おおー。ちょっとしたこと試したいときはこれが便利かも!

>と言うわけで、端末+bash離れでEshellを使うともっと幸せになれる、と言う情報です(笑)。

これ、おもしろいです、まじで。Emacsネタが尽きないですねー。また色々試して報告します!