EmacsLisp

EmacsLispで下のように書いて怒られた。

(defun declease-point (n)
    (lambda () (- (point) n)))

EmacsLispにはクロージャがない
(Scheme) (Lisp)に「cl パッケージの lexical-let を使えばクロージャにできるようだ.」って書いてあるけどせっかくどう書くorgを作っているのでどう書くorgで調べてみる。クロージャを使いそうなお題はn日後を返す関数を返す関数 Emacs Lispで どう書く?orgだな。

2人による4件の投稿があって、片方はlexical-letを使っているけど、もう片方は識別子の前にカンマを置いて何かしている。知らない構文だ。調べてみよう。

    • -

こうなった。

(defun declease-point (n)
    `(lambda () (backward-char ,n)))

(funcall (declease-point 5))

2つめの式を評価するとカーソルが5つ手前に戻る。

    • -

えっと、こういうことがしたかったわけなのだけど

(define-abbrev-table 'django-html-mode-abbrev-table '(
    ("bl" "{% blocktrans %}{% endblocktrans %}" (move-backward 19))

1行目の行末から2文字目に注目。クオートされてる。
つまり(move-backward 19)は評価されて関数としてテーブルに入らず、'(move-backward 19)として入る。というわけでInvalid functionエラーorz

    • -

「クオート 一部 評価」で検索。バッククオートを使うらしい。あ、前のほうで使っている`はバッククオートか。普通のクオートのつもりで使っていた(ぉ)
まぁ、バッククオートを使えばカンマで一部だけ評価を強制することができるそうな。

(define-abbrev-table 'django-html-mode-abbrev-table `(
    ("bl" "{% blocktrans %}{% endblocktrans %}" ,(move-backward 19))

これで無事、補完をした後にタグの真ん中にカーソルが移動するようになった。

後でラボブログに書く。

参考文献
Emacs Lisp プログラミング: 関数定義の書き方
GNU Emacs Lispリファレンスマニュアル: 29. バッファ内の位置