星田さんの記事に対するコメント。
追記:ようやくdotspacemacs-configuration-layers に書き込むってのが分かった・・で、Common-lispとSchemeを書き込んだんだけど、どうやってそのモードに変えるのかが分からないw。
あ、モードチェンジ動作はないです。
common-lispとschemeとdotspacemacs-configuration-layersに書き込んで保存、再起動したら、あとはファイルを開く際に拡張子でEmacsが「勝手に判断して」モードを起動します。
例:
1. Spacemacsを起動する。
2. Common Lispファイルを作りたい場合は.lispが拡張子。
Emacsでファイルを開く場合はC-x C-f、つまりCtrlキーを押しながらxキーを叩き、そのままCtrlキーを押しながらfキーを叩く。そうするとSpacemacsの下部が開き、現時点いるディレクトリ直下のファイル一覧が表示される。既存ファイルの場合はカーソルキーでファイルを探してリターンで決定、そうじゃなければタイピングして新しいファイルを作成すれば良い。この辺はフツーのファイルマネージャとあまり変わらない操作だ。
例えば試験的にtest.lispとタイピングしてtest.lispファイルを作成する。細かい話をすると、実はこの時点ではtest.lispファイルは作成されていない。保存(C-x C-s)しない限り「test.lisp」と言う実体はまだ存在しないのだ。いずれにせよ、test.lispと打った後リターンキーを叩いてみよう。
これで「test.lisp」と名付けられたバッファが開き、この時点でCommon Lispモードになっている。
3. SLIMEを起動
SLIMEはSLIMEで別口に起動出来る。が、ここではtest.lispと連帯させる。基本的にはSLIMEはANSI Common Lisp処理系のリスナーをEmacs上で起動させるツールで、なお、現在編集中の.lispファイル上のプログラムとのやり取りを司る。まずはスペースキーを叩いてEmacsの下段を表示させる。
再度スペースキーを叩く。そうすると、コマンド履歴か、あるいはM-x「なんか要入力」になる。初回の場合はslimeと打ってリターン、そうじゃなければコマンド履歴からカーソルキーで目的のブツを選んでリターンする。なお、M-xと言うのは「メタキーとxキーを同時に押す事」の意で、Windows等ではメタキーはキーボードにあるAltキーを指す(Windowsキーの右隣にあるはず)。で、このコマンド(キーバインド)は「Emacs Lispで書かれた関数を直接起動せよ」と言う意味。深く知りたくなければ覚えなくてもいいが(笑・※1)。
SLIMEによってCommon Lispリスナーが起動される(EmacsではInferior-lisp process、等と呼ばれる)。ここでの処理系は、貴方が選んだ処理系(WindowsだとCLISP?)になっている(設定を忘れないように・笑)。なお、どの実装を使おうがプロンプトは"CL-USER>"になっている。このCL-USERと言うのはANSI Common Lispを起動した際、デフォルトで起動する名前空間(Common Lispでは「パッケージ」と呼ぶ)の事だ。ANSI Common Lispは一つのパッケージに最低でも7つの名前空間があり、それを保護するように「パッケージ」と言う大枠の名前空間が存在する。デフォルトでユーザーが使うようになってるのがCL-USERだ。「デフォルトで」と言う事は当然別の「パッケージ」があり、当然自分で作る事も可能で、このように、ANSI Common Lispの「名前空間保護」と言うのはどんな言語より混みいってて、完璧にプログラム実行環境をガードするように設計されている。とは言っても通常はCL-USERを使いつつ、必要が出たら新たにパッケージを作って行く、と考えて良いだろう。
4. プログラムを書いてみる
Spacemacsはデフォルトだとviモードになっている。プログラムを書く場合は編集モード、正確には挿入モードにする。そのためにはまずはキーボードでiを叩く(挿入=insertのi)。そうすると、あとはフツーのテキストエディタのようにプログラムの編集/記述が可能だ。なお、viだとカーソルキーの代わりにh、j、k、lキーを使わないとならない、等と言われてるが、実際問題、昨今のデファクトスタンダードのvimでさえ、編集モードの時にはフツーにカーソルキーが使えるようになってる、んで気にせんで良い(と言う事はオリジナルのviでは挿入モード時にカーソルは移動出来なかった、って事だ・笑!)。挿入モードを解除する時にはEscキーを使い、そうすれば保護モードに入ってプログラムは書き換えられなくなる。プログラムを書く際には、一旦関数を書き上げればEscキーを叩く癖を付けておけば良い。取り敢えずSpacemacsの場合、保護モードの時にiキーを叩いて挿入モードに入る、プログラムを記述し終わったらEscキーを叩く、の2つさえ覚えていれば良い(他にも便利なコマンドがあるが、それはアンチョコでも印刷しておいて、PCの傍にでも置いておけば良いだろう)。なお、Spacemacsだとカッコ"("を書くとコッカ")"が勝手に補完されるし、ANSI Common Lispの標準関数やマクロ等もガンガン自動補完候補が上がるんでラクだ。「IDEでラクするなんて!」とか言う古典的テキストエディタ信者もいるがほっとけ(笑)。ラクして悪いってこたぁねぇし、少なくともLispの長い歴史ではこういう「自動補完」が当たり前、と言う環境でLispは発展してきてるので恥じる必要はない。バンバンラクして横着しよう。なお、改行+インデントはC-m(Ctrlを押しながらmキーを叩く)で行う。これは必須なんで覚えておこう(と言うか、これが無いとプログラムを書くのが嫌になる、って程強力なコマンドだ)。
5. コンパイル+ロードする
SLIMEで書いたプログラムをリスナーにロードするにはC-c C-k(Ctrlキーを押しながらcキーを叩き、そのままkキーを叩く)する。この時点で、ファイル(今回はtest.lisp)がセーブされて無ければ「保存しますか?」と聞いてくる。yキーを叩いておこう。
C-c C-kによってリスナーにプログラムファイル(この場合はtest.lisp)がコンパイルされてロードされる(なお、コンパイル済みファイルの拡張子はfaslである)。ここまで来ればあとは、リスナーで「実際キチンと動くかどうか」確認可能だ。
当然リスナーでも自動補完は効く。自分が定義した関数でも自動補完候補になってるんで、開発環境としてはすごくラクだ、って事が分かるだろう。
リスナーで定義した関数をテストしてみる。性交成功だ!
とまぁ、こういうルーティンがSpacemacsでのANSI Common Lispのプログラム開発、です。
なお、標準Schemeの場合、scmが拡張子、Racket対象だとrktがモード切り替えのサインとなり、また、SchemeでのslimeコマンドにあたるのがSpacemacsではrun-geiserです。
Geiser(ANSI Common LispでのSLIME代わり)も自動補完アリ、なんでRacketプログラミングでもかなり便利な環境です(とは言っても、Racket開発者はDr. Racket IDEの方を推している)。
なお、SLIMEのC-c C-kにあたるのが(コンパイルはしないけど)ファイル一括ロードのSPC m e b(スペースキーを叩いて、mキーを叩いて、eキーを叩いて bキーを叩く)、です。これでRacketのリスナーに書いてたRacketプログラムを一括ロード出来ます。
宿直待機中に見返してて気づいたんですけど、;;ってコメントアウト記号じゃないなコレw ここに設定書くんか!明日が楽しみだ!
いや、コメントアウト記号です(笑)。間違ってない。
要するに、そこでコメントアウトされてるのは「Spacemacsの作者のオススメ」です。;;を外せばその機能が起動するようになる。
例えば自動補完を活かしたかったらauto-completionのコメントアウトを外す。
better-defaltsってのはEmacsっぽい編集キーバインドをいくつか追加する。
orgってのはEmacsで人気のメモ/To Doリスト作成モード。
shellはSpacemacs上で(Windowsなら)DOSを使えるようにする機能。
spell-checkingやsyntax-checkingは言わずもがな、でしょう。
いずれにせよ、Emacsには「色々ある」。
他のIDEだとプラグインは所詮プラグインなんだけど、Emacsの場合は殆どソフトウェア、と言って良いモノが揃ってるんで、自分で色々探してはインストールして実行する事が可能です。
EmacsデフォルトのWebブラウザeww。プログラムを書いてる最中、なんか調べたい、と言った場合、別にブラウザを開かなくてもEmacs上からアクセス可能だ。
ご存知、数独。Emacsにはゲームもかなりある。
Emacsは事実上、テキストエディタと言うよりコンピュータそのもの、言い換えるとこれ自体が仮想マシン、と言って良いです。
「Emacsは環境だ」と言われるのはこれが理由ですね(※2)。必ずしもLisperではないんですが、Emacs Lisperと言えるようなまた別種のLisper(むしろプログラマとしてはLisp以外の言語ユーザーが多い)がこの世には存在しています(※3)。
世界の最高のエンジニアたちはみんなEmacsを使っている。世界を変えるようなタイプの人たちは、ということだ。あなたの隣のキュービクルにいるすごい彼女のことじゃない。向こうの部屋にいるすごいフレッドのことでもない。我々の分野で最高のソフトウェア開発者たち、業界の様相を変えるような人たちのことを言っている。ジェームズ・ゴスリング、ドナルド・クヌース、ポール・グレアム、ジェイミー・ザウィンスキー、エリック・ベンソン。本物のエンジニアは皆Emacsを使う。Emacsをうまく使えるためには相当頭が良くなければならないが、マスターすれば驚くほど力を与えてくれる。信じないなら、ポール・ノードストロムが仕事しているとき肩越しにのぞき込んでごらん。Visual Hoge.NETみたいなIDEしか使ったことのない人は本当に驚くことになると思う。Emacsは100年のエディタだ。
〜中略〜
シェルは天才だ。Emacsは天才だ。非技術系の人たちでさえEmacsを愛している。私は今Emacsでタイプしている。私が自主的に別なエディタを使うことは決してない。この惑星上で他には見つけられないタイピングのショートカットやテキスト編集機能が生産性を押し上げてくれるというだけじゃない。私は自由形式の文章であれば、Emacs上で1分間に130から140語を間違いなしでタイプできる。自分で書いたタイピングテスト用のEmacsアプリケーションで計測したのだ。しかしEmacsにはそれ以上のものがある。Emacsには名のない資質があるのだ(※4)。
※1: Emacs Lispの大きな特徴は、通常のプログラミング言語だとある意味「閉じた環境」を形成し、標準入出力以外受け付けないような設計になってるが、Emacs LispはEmacsと言うテキストエディタを介しつつ直接外部(キーボード)とやり取りするように設計されてる辺りである。
例えばフツーのLispで関数を書いても僕らはそれを端末かあるいはインタプリタでコマンドとして打たないと起動できない。
一方、基本的にEmacs Lispで書かれた関数はM-x + 関数名でEmacsから直接的に呼び出す事が可能だ。これがEmacs Lispの恐るべき実装なのである。
これがEmacs Lispで書かれた関数の扱いのポイントで、じゃあ、コントロールキー(Ctrl)で駆使されるコマンドが何か、と言うと、基本的にはM-x + 関数名を使った複雑なコントロールへのショートカットとして定義されている。
※2: EmacsはかつてのMITのAI研と共に発展したが、AI研のプログラマの大量解雇(リストラ)に一役買った、と言う噂がある。
Emacs自体があまりに面白すぎて、AI研に所属してたプログラマがEmacsばかり弄りまくって全然本業のプログラミングをしなかった、と言う逸話だ。
いずれにせよ、Emacsは「巨大な遊び場」なのは事実であり、Emacs Lispをマスターすると「帰ってこれない」人たちが山ほどいる、のである。
(結局この辺は「GUIプログラミング程メンド臭くなく」「端末上で動くCLIプログラミング程地味ではない」と言うEmacsプログラミングの位置が「丁度良い」ポジションを占めてる事を指している)
なお、viユーザーの中には
「Emacsはプログラマをプログラミングに集中させない。Emacsのカスタマイズに熱中させる。
だからEmacsには近づくな。シンプルなviを使うべきだ。」
とアジる人たちもいる。
※3: 日本での有名なEmacs Lispハッカーにるびきち氏がいる。
また、Emacs自動補完機能のauto-complete.elやポップアップ機能を司るpopup.el等は日本人Emacs Lispハッカーの手に拠る制作物で世界中に衝撃を与えた。
Emacs Lispハッカーの中では世界で活躍する日本人プログラマがいるのだ。
※4: ちなみに、翻訳文にも書いてあるが、Lispハッカー、ポール・グレアムは、Emacsを割に引き合いには出すけど、実はviユーザーであってEmacsユーザーではない。