Emacs Lispを基礎から学ぶ (3): コマンドの定義

interactiveスペシャルフォームでコマンドを宣言

M-x ...でユーザがコマンドとして呼び出す関数を定義するには、関数定義の頭で(interactive)と宣言をすればよい。
この時、英数字1文字をinteractiveの引数として渡すと、ユーザーに指定したフォーマットで入力を要求するコマンドを作成できる(find-fileコマンドでファイル名の入力を要求されるのと同様)。
英数字1字に続く文字列は、コマンド実行時にミニバッファに表示されるプロンプト文字列となる。
また、ユーザー入力はその関数の引数として扱われる。

interactiveフォームに渡せる文字種と、対応する入力の種類は次の通り:

b 既存バッファ名
B バッファ名(新規含む)
d ディレクトリ名
f 既存ファイル名
F ファイル名(新規含む)
n 数値
s 文字列
r リージョン

練習コード


以上!

Emacs Lispを基礎から学ぶ (2): 正規表現

elisp正規表現はむずかしい

残念なことにelispには正規表現リテラルが存在しないため、関数やコマンドに正規表現を渡すためには文字列として渡す必要がある。

他の言語の正規表現と同様、elisp正規表現でもバックスラッシュを含むメタ文字("\w"とかグルーピング用の"\("とか)が多用されるワケだけど、文字列中ではこれらのメタ文字に含まれるバックスラッシュをエスケープ文字として処理しなければならない。

たとえば、正規表現"\(\w.\)"を文字列で表現するためには"\\(\\w*\\)"と書く必要があり、ただでさえ読みにくく書きにくい正規表現が大量のバックスラッシュにより暗号のようになってしまう。テキスト処理がメインの言語のはずなのに...

re-builderで対話的に正規表現を書く

ただ、るびきちさんの本にも書かれている通り正規表現を少しでもラクに書くためのworkaroundはいくつか用意されている。ひとつはemacs標準添付のre-builderというツールで正規表現を対話的に書く方法。
検索対象のテキストを含むバッファで M-x re-builder とコマンドを打つと、正規表現を入力するための小さいウィンドウが開かれる:
f:id:yhashy:20120714120628p:plain
ここで正規表現を入力すると、元のバッファでマッチするテキストがハイライトされるので、結果を確認しながら正規表現を編集できてラクチンですね、というお話。

RubyのRubularみたいなものかな。
Rubular: a Ruby regular expression editor and tester

正規表現を生成する関数・マクロを使う

もうひとつの方法は、正規表現自体を自分で書かずに関数で生成してしまおう、という方法。
関数regexp-optに文字列のリストを渡すと、その文字列すべてにマッチする最適化された正規表現を返してくれる。
また、rxマクロは独自のミニ言語で生成する正規表現を記述することができる(ただこの言語の書き方覚えるのが少しめんどくさそう)。

正規表現にマッチする関数

練習コード書いたのに忘れてた。

正規表現と文字列を渡して、マッチした部分のインデックスを返す関数はstring-match.
対して、正規表現マッチ時にグルーピング指定した文字列を取り出す関数はmatch-stringとなる(どっちがどっちかややこしい)。

Emacs Lispを基礎から学ぶ (1)

Emacs Lispテクニックバイブル

Emacs Lispテクニックバイブル


↑るびきちさんの本を参考にelispの勉強中。

もともとLispに触れること自体は初めての経験ではなく、学部時代に半期のLisp学習コースに出席して再帰的処理の書き方とか基礎的なことはその頃習得した。

また指導教官が元々Lispで人口知能の研究をしていたLisperだったこともあり、言語としては結構親しみもあったのだが、元々文系だしプログラミングそんなに得意じゃないし、日常生活でLispを書く機会なぞ皆無なものだから半年間のコースで学んだことは忘却の彼方に消し飛んでしまった。

そんなわけでelispをマスターするため基礎の基礎から勉強し直すことにした。練習用に書いたコード片は後で参照できるようにgistに逐次貼り付けることにする。

まずはプログラミング言語のお決まり、変数宣言とデータ構造から。

次に条件分岐とループ処理。

とりあえず今日はこんなところかな。

gist.elを試してみる

gistを試してみて、コード片を保存したり公開するのにはとても便利そうなのだけど、コードの貼付けをいちいちブラウザから行うのは面倒くさい。
そんな私に朗報、emacsからgistコードの作成・管理を行えるelispがあるようなので試してみた:

defunkt/gist.el · GitHub

インストールの手引きを読むと、たくさんのelispに依存しているのでパッケージマネージャを使うのがオススメ、と書いてある。package.elならこの間入れたばかりだ。
ということでM-x package-install RET gist RETとコマンド打って marmaladeからパッケージごとインストール。インストール後↓

f:id:yhashy:20120709234023p:plain

まだあまり使いこんでないけれど、M-x gist-listで自アカウントのgist一覧を取得、M-x gist-regionで選択中のリージョンをgistにアップロード、といったことができるみたい。なかなか便利そう。

gist記法のテスト

はてなブログでgistのコードの貼付けができるらしいのでテスト。

gistにアップしたコードを貼付けるには、 [gist:gistのid] という記法でコードのIDを指定してあげればよい:

EmacsでC-wのデフォルト挙動が気に入らないので先日書いたコマンド。