優しいEmacs-Lisp講座
一応もう1回貼っておこう.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
http://www.gentei.org/~yuuji/elisp/elisplec.html
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
上記ページの内容を読んでみる.
内容としては完全じゃないけど,これで終わり?
補完入力とその周辺
一般入力関数
(read-string プロンプト文字列 [初期入力])
(read-file-name プロンプト文字列 [ディレクトリ [デフォルト名 [要マッチ]]])
- プロンプト文字列は,ミニバッファに出る文字列.
- 初期入力は,最初から入ってる文字列.
- ディレクトリは,ファイル名を入力するデフォルトのディレクトリを指定(省略するとカレントディレクトリとなる).
- ユーザが何も指定せずにリターンしたときに返す結果.
- 要マッチがtのとき,実際に存在するディレクトリ以外の入力を認めない.
両者とも第2引数以降を省略可.
;; read-stringの例 (defun insert-date-weather () (interactive) (insert (substring (current-time-string) 0 10) "\t" (read-string "Weather: ") "\n")) ;; 実行結果例(rainと入力):Sun Jun 18 rain
補完入力関数
(completing-read プロンプト 補完テーブル 選択(述語)関数 要マッチ 初期入力)
- 補完テーブルは,スペースキーやタブキーを押したときに補完される単語を格納した変数.
- 選択関数は,補完テーブル中の要素の内,特定の条件を満たすものを候補にしたい場合に利用.使わない場合はnil.
- 要マッチは,補完候補と必ず一致すべきかを指定するフラグ.
他は一般入力関数のときと同様に.
;; 補完テーブル (defvar day-alist '(("Sun.") ("Mon.") ("Tue.") ("Wed.") ("Thu.") ("Fri.") ("Sat.")) ) ;; 補完テーブルを用いた例. (defun read-day-of-the-week () (interactive) (completing-read "Day of the week?: " day-alist nil t) ) ;; 実行時は,ちゃんと補完がきくし,指定されたの以外入力できない. ;; 補完テーブル (defvar month-alist '(("Jan." 31) ("Feb." 28) ("Mar." 31) ("Apr." 30) ("May." 31) ("Jun." 30) ("Jul." 31) ("Aug." 31) ("Sep." 30) ("Oct." 31) ("Nov." 30) ("Dec." 31)) ) ;; 選択関数を使用した例. (defun read-odd-month () (interactive) (completing-read "Odd month: " month-alist 'check-odd-month t) ) ;; 選択関数 ; 大の月のみを選択テーブルの候補とするようにする選択関数. (defun check-odd-month (list) (eq 31 (car (cdr list))) ) ;; 実行時は,Fとか押しても補完候補は何も出てこず,ちゃんと31日のものしか入力できないようになっている.
また,補完文字列の大文字小文字を無視したい場合は,
変数completion-ignore-caseをtにセットする.
(setq x '(foo "bar" 5)) ;; リスト x ;; (foo "bar" 5)と表示される. ;; listかatomかを判定する関数 (listp x) ;; tと表示される. (listp 'hoge) ;; nilと表示される. (atom x) ;; nilと表示される. (atom 'hoge) ;; tと表示される. ;; 連想リストの例. ;; 連想リスト ;; '(連想キー, 値1, 値2, ..., 値n)というリストが複数集ったもの. (setq winning-shot-alist '(("隆" "波動拳" "昇龍拳" "竜巻旋風脚") ("拳" "昇龍拳" "波動拳" "竜巻旋風脚") ("春麗" "スピニングバードキック" "百烈キック") ("E.本田" "スーパー頭付き" "百烈張り手"))) ;; 上記連想リストを使った例. (let ( ;; 標準入力からリストのキーとなるものを入力してもらい,変数keyに格納. (key (read-string "誰のわざ? ")) ;; 変数listを作成. list) (setq list ;; 連想キー(key)を要素に持つリストを取得,listに格納. (assoc key winning-shot-alist) ) (if list (message "%sの必殺技は%sです。" key (cdr list)) (message "%sって誰?" key)))
マクロ
;; (setq i (1+ i))を行うマクロ (defmacro inc(x) (list 'setq x (list '1+ x)) ) ;; とりあえず,上記マクロのテスト ;; 通常版 (setq num 1) ;; numを値1で初期化 (setq num (1+ num)) ;; numの値を1足す (message "Value is %d." num) ;; 現在のnumの値を表示 ;; マクロ版 (setq macro_num 1) ;; 変数macro_numを1で初期化 (inc macro_num) ;; macro_numの値を1増加させる (message "Value is %d." macro_num) ;; 現在のmacro_numの値を表示
マクロの方のテストしてて,
何故かエラーが出まくって何でだろうなぁ〜とか思って,
念のために変数名を変えてみたら通った.
どっかで衝突してたんだろうか?
変数名,しっかり考えないとだめだな.