突発性CL勉強会1回 SLIMEについて
突発性CL勉強会でSLIMEについて勉強。
id:g000001さん、id:mokeheheさん、NANRIさんとid:tszの4人で実施。
新宿大ガード横店は改装工事をしていたので、近くの別店に移動しました。
新宿のルノアールで7時間実施。SLIMEの話題自体は2〜3時間で終わりましたが、
その後の話が熱かったです。gooやdylanにも興味が出てきました。
以下は勉強会の内容と、その後自宅でおさらいした内容。
SLIME概要
emacs向けのCommonLisp開発環境。
SLIMEはemacsで動作する部分と、lisp側で動作する部分からなる。
lisp側で動作する部分はswankと呼ばれる。
emacsはswankとはS式と通じて通信する。
つまり、swankのプロトコルを理解する処理系であればCommonLispでなくても良い。
schemeやgoo,dylanなどのswankがある模様。
今回はCVS版を題材にした。
使用形態
emacsのslimeからswankサーバも一緒に起動。あるいは、swankサーバを別に立ててemacsから明に接続する。
一緒に起動するのは特に設定が必要なく、お手軽。
swankサーバに明に接続する方法の場合、lispが同一ホストで動作している必要はない。
複数のlispを相手にする場合、swankサーバに接続する方法にする。
swankサーバを含んだimageファイルを作っておくと起動が速くなる。
明に接続する方法
swankはasdfで使用可能なため、asdfのリポジトリからswank.asdへ
シンボリックリンクを張る。
sbclの場合、~/.sbcl/systemsから張れば良い。
$ pwd ~/.sbcl/systems $ ln -s ~/cl/slime/swank.asd
sbclでswankサーバを起動
$ sbcl This is SBCL 1.0.16, an implementation of ANSI Common Lisp. More information about SBCL is available at <http://www.sbcl.org/>. SBCL is free software, provided as is, with absolutely no warranty. It is mostly in the public domain; some portions are provided under BSD-style licenses. See the CREDITS and COPYING files in the distribution for more information. * (require :asdf) ("ASDF") * (require :swank) ; loading #P"/Users/TakayukiSuzuki/.slime/fasl/2008-04-24/sbcl-1.0.16-darwin-x86/swank-backend.fasl" ; loading #P"/Users/TakayukiSuzuki/.slime/fasl/2008-04-24/sbcl-1.0.16-darwin-x86/swank-source-path-parser.fasl" ; loading #P"/Users/TakayukiSuzuki/.slime/fasl/2008-04-24/sbcl-1.0.16-darwin-x86/swank-source-file-cache.fasl" ; loading #P"/Users/TakayukiSuzuki/.slime/fasl/2008-04-24/sbcl-1.0.16-darwin-x86/swank-sbcl.fasl" ; loading #P"/Users/TakayukiSuzuki/.slime/fasl/2008-04-24/sbcl-1.0.16-darwin-x86/swank-gray.fasl" ; loading #P"/Users/TakayukiSuzuki/.slime/fasl/2008-04-24/sbcl-1.0.16-darwin-x86/swank.fasl" WARNING: These Swank interfaces are unimplemented: (CALLS-WHO DISASSEMBLE-FRAME SLDB-BREAK-AT-START SLDB-BREAK-ON-RETURN WHO-SPECIALIZES) ("SB-GROVEL" "SB-BSD-SOCKETS" "SB-INTROSPECT" "SB-POSIX" "SB-CLTL2") * (swank:create-server :port 6006) ;; Swank started at port: 6006. 6006 *
swankサーバへの接続は、M-x slime-connetで行える。
IPアドレスとポート番号を指定する。
slime/contrib以下のファイル
色々おまけ機能がある。
(slime-setup '(...))で読みこむらしい。
取りあえず片っ端から取り込む。
(slime-setup '( inferior-slime slime-asdf slime-autodoc slime-banner slime-c-p-c slime-editing-commands slime-fancy-inspector slime-fancy slime-fuzzy ; slime-highlight-edits slime-parse slime-presentation-streams slime-presentations slime-references slime-scratch slime-tramp ; slime-typeout-frame slime-xref-browser ))
便利な機能(コンパイル編)
オススメマークは、tszが多分よく使うと思う機能。
オススメ | キーバインド | 機能 |
---|---|---|
x | C-c C-c | 現在編集中の関数をコンパイル |
x | C-x C-e | 直近のS式を評価してMessage領域へ表示 |
C-x C-r | リージョンを評価してMessage領域へ表示 | |
x | C-x C-p | 直近のS式を評価して新バッファへ表示。バッファはqでクローズ |
x | C-M-x | 編集中のS式をトップレベルから評価 |
C-c C-k | 現在編集中のファイルをコンパイルしてロード | |
C-c C-l | 現在編集中のファイルをロード | |
x | M-n | コンパイルエラーの箇所へ移動(次) |
x | M-p | コンパイルエラーの箇所へ移動(前) |
C-c M-d | 関数の逆アセンブル結果を新バッファへ表示。バッファはqでクローズ |
便利な機能(編集/調査編)
オススメ | キーバインド | 機能 |
---|---|---|
x | M-. | 定義場所へ移動 |
x | M-, | 移動前の場所へ戻る |
C-M-t | S式の位置の入れ替え。C-M-tした位置の前後にあるS式の位置を入れ替える。 | |
x | M-C-i | シンボル補完 m-v-b => multiple-value-bindなど |
x | C-c C-i | 同上 |
C-c M-i | fuzzyにシンボル補完。関数名をうろ覚えのとき便利。別バッファに候補一覧が表示されるのでC-n/C-pで選択しスペースで決定 | |
C-c C-z | replを表示 | |
x | M-x slime-selector | いろんなバッファへ簡単移動。C-;あたりにバインドしておくと便利 |
C-c C-d C-d | シンボルの情報表示 | |
C-c C-d C-f | シンボルの関数情報表示 | |
C-c C-d C-a | Apropos検索 | |
C-c C-d C-p | Apropos検索。パッケージ限定 | |
C-c C-d h | シンボルをHyperSpec検索。カーソル位置のシンボルの仕様を表示。 | |
C-c C-d ~ | Format directiveをHyperSpec検索。 | |
x | C-c C-m | マクロ展開 |
x | C-c M-m | マクロ全展開 |
C-c C-f | シンボルの関数情報表示 | |
x | C-c C-] | トップレベルまでの括弧を閉じる |
C-c M-q | 関数の再インデント | |
C-c | 呼び出しもと関数一覧を表示。 qで終了 | |
C-c > | 呼び出し先関数一覧を表示。 qで終了 | |
C-c I | オブジェクトのインスペクト |
便利な機能(移動編)
オススメ | キーバインド | 機能 |
---|---|---|
C-M-a | 関数単位で移動(前) | |
C-M-e | 関数単位で移動(後ろ) | |
C-M-f | S式単位で移動(前) | |
C-M-b | S式単位で移動(後ろ) | |
C-M-n | リスト単位で移動(前) | |
C-M-p | リスト単位で移動(後ろ) | |
C-M-u | 上位のリストに移動 | |
C-M-d | リストの中に入る |
便利な機能(デバッグ編)
オススメ | キーバインド | 機能 |
---|---|---|
C-c C-b | Replをbreak | |
x | C-c C-t | 関数トレースのトグル |
x | C-c C-y | 現在編集中の関数名をreplへ送る。ちょっとしたテストに便利 |
C-c E | シンボル値の編集。別バッファが開いて値の編集が可能に。C-c C-cでcommit | |
C-c ~ | パッケージの同期 | |
C-c C-x c | 接続しているLispのリストを表示する。 dでdefault接続のlispを変更できる | |
C-c C-x t | default接続のスレッド一覧を表示する。 | |
M-x slime-toggle-profile-fdefinition | 指定した関数のプロファイリングをトグル | |
M-x slime-profile-report | プロファイル結果をレポート | |
M-x slime-unprofile-all | 全関数のプロファイルを中止する | |
M-x slime-profiled-functions | プロファイリングをしている関数の一覧を表示 |