Shammer's Philosophy

My private adversaria

EmacsLisp Collections - 20150419

EmacsLispのサンプル集。他にpythonLispbash などで書いているがそれと同じような位置付けのもの。他のものと比較して書く頻度が少ないだけに忘れがちだが、そういうときに参照するためのもの。他の言語と異なり、目的はテキスト編集が大半ということもあり、あまり馴染のない操作が多いのも苦労する要因の一つ。

現在のカーソル位置を取得する

(point)

ある文字の始まり位置を取得する

(search-forward "search-string" nil t)

テキスト内の指定位置の文字(startからend)を抜き出す

(buffer-substring start end)

ある文字列(<)とある文字列(>)で囲まれた文字を抜き出す

(let* ((start (search-forward "<" nil t))
          (end (search-forward ">" nil t)))
  (when (and start end)
    (buffer-substring start (- end 1))))

search-forwardでは、指定した文字+1の位置が返される。そのため、開始位置はそのままsearch-forwardの結果を使用できるが、終了位置は-1しないと終了位置の文字そのものが含まれることになる。なお、検索に正規表現を使用する場合はsearch-forwardでなくre-search-forwardを使用できる。
forwardは現在のカーソル位置から前に進みながら検索する(カーソルより後の文字を検索する)ことを意味するが、後ろに進みながら検索する(カーソルより前の文字を検索する)ときには、search-backwardやre-search-backwardを使用できる。

対話的に入力した値を使用する

interactiveを使用する
(defun test (args)
  (interactive "sWhat?:")
  (insert args))
readを使用する
(defun test ()
  (let ((value (read)))
    (insert value)))

readを使用することで一応入力を受け取ることができるが、そもそもEmacsLispの式として正当でないものはエラーになるようで正直使いにくい。後述のread-stringでは入力したものが全て文字列として処理されるのでテキスト処理という観点では使いやすい。

read-stringを使用する
(defun test ()
  (let ((value (read-string "What?: ")))
    (insert (concat "<" value ">"))))