優しい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の値を表示

マクロの方のテストしてて,
何故かエラーが出まくって何でだろうなぁ〜とか思って,
念のために変数名を変えてみたら通った.
どっかで衝突してたんだろうか?
変数名,しっかり考えないとだめだな.