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 とコマンドを打つと、正規表現を入力するための小さいウィンドウが開かれる:
ここで正規表現を入力すると、元のバッファでマッチするテキストがハイライトされるので、結果を確認しながら正規表現を編集できてラクチンですね、というお話。
RubyのRubularみたいなものかな。
Rubular: a Ruby regular expression editor and tester
Emacs Lispを基礎から学ぶ (1)
- 作者: るびきち
- 出版社/メーカー: 技術評論社
- 発売日: 2011/11/26
- メディア: 単行本(ソフトカバー)
- 購入: 4人 クリック: 203回
- この商品を含むブログを見る
↑るびきちさんの本を参考にelispの勉強中。
もともとLispに触れること自体は初めての経験ではなく、学部時代に半期のLisp学習コースに出席して再帰的処理の書き方とか基礎的なことはその頃習得した。
また指導教官が元々Lispで人口知能の研究をしていたLisperだったこともあり、言語としては結構親しみもあったのだが、元々文系だしプログラミングそんなに得意じゃないし、日常生活でLispを書く機会なぞ皆無なものだから半年間のコースで学んだことは忘却の彼方に消し飛んでしまった。
そんなわけでelispをマスターするため基礎の基礎から勉強し直すことにした。練習用に書いたコード片は後で参照できるようにgistに逐次貼り付けることにする。
まずはプログラミング言語のお決まり、変数宣言とデータ構造から。
次に条件分岐とループ処理。
とりあえず今日はこんなところかな。
gist.elを試してみる
gistを試してみて、コード片を保存したり公開するのにはとても便利そうなのだけど、コードの貼付けをいちいちブラウザから行うのは面倒くさい。
そんな私に朗報、emacsからgistコードの作成・管理を行えるelispがあるようなので試してみた:
インストールの手引きを読むと、たくさんのelispに依存しているのでパッケージマネージャを使うのがオススメ、と書いてある。package.elならこの間入れたばかりだ。
ということでM-x package-install RET gist RETとコマンド打って marmaladeからパッケージごとインストール。インストール後↓
まだあまり使いこんでないけれど、M-x gist-listで自アカウントのgist一覧を取得、M-x gist-regionで選択中のリージョンをgistにアップロード、といったことができるみたい。なかなか便利そう。