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. バッファ内の位置