よろずや

Emacs メモ

もの覚えが悪いので,忘れないようにメモっておく.

eshell メモ

eshell の特徴

Welcome to the Emacs shell

~ $ echo hogehoge >#<buffer *scratch*>
~ $ 

スクラッチバッファに echo の出力をリダイレクト(追加のときは >> を使う)

~ $ echo hogehoge >/dev/kill

キルリングに出力

~ $ echo hogehoge >/dev/clip

クリップボードに出力

List Comprehension - defmacro によるリストの内包表記

Common Lisp 用に移植した list-of マクロ が Emacs でも動くことに気がついた. destructuring-bind って elisp でも動くのか…あとはダイナミックスコープに注意 すればそれなりに使えるかも.

(defun upto (a b) (if (< b a) nil (cons a (upto (1+ a) b))))
(defun fold-left (f b l)
  (if (null l) b (fold-left f (funcall f b (car l)) (cdr l))))
(defmacro list-of (expr &rest rest)
  `(nreverse (list-of-tail nil ,expr ,@rest)))
(defmacro list-of-tail (base expr &rest rest)
  (cond ((null rest) `(cons ,expr ,base))
	((equal (nth 1 (car rest)) 'in)
	 (destructuring-bind (var in generator)
	     (car rest)
	   (declare (ignore in))
	   (let ((f (gensym))
		 (z (gensym)))
	     `(labels ((,f (,z ,var) (list-of-tail ,z ,expr ,@(cdr rest))))
	       (fold-left #',f ,base ,generator)
	     ))))
	(t `(if (funcall (lambda () ,(car rest)))
	     (list-of-tail ,base ,expr ,@(cdr rest))
	     ,base))))

ただ,upto は elisp だと再帰の深さの限界があるので,↓のように変更する.

(defun upto (from to)
  (let ((acc nil))
    (dotimes (i (1+ (- to from)) (nreverse acc))
      (push (+ i from) acc))))
(list-of (list x y) (x in '(1 2 3)) (y in '(a b c)))
=> ((1 a) (1 b) (1 c) (2 a) (2 b) (2 c) (3 a) (3 b) (3 c))

(list-of (list x y) (x in '(1 2 3)) (y in '(1 2 3)) (= (% (+ x y) 2) 0))
=> ((1 1) (1 3) (2 2) (3 1) (3 3))

apropos が使えなくなった時

bug-gnu-emacs: apropos aborts too easily のパッチをあてる.本体をいじる権限 が無いときは,パッチをあてた apropos.el を手動でロードする.

置換

lml で使われていたリンク形式から emacs-wiki のリンクへ変更する.

(a :href "http://www.geocities.co.jp/SiliconValley-SanJose/7474" [自分のページ])
(a :href "http://www.python.com/" [Python のページ(本家)])
(a :href "http://www.python.jp/" [Python のページ(日本)])

lml のリンク

一行につきリンクが一つある.これを,

[[http://www.geocities.co.jp/SiliconValley-SanJose/7474][自分のページ]]
[[http://www.python.com/][Python のページ (本家)]]
[[http://www.python.jp/][Python のページ (日本)]]

emacs-wiki のリンク

こーしたい.よって,必要な関数は

(defun lml->wiki (beg end)
  (interactive "r")
  (replace-regexp "^.*:href \"\\([^\"]*\\)\" \\[\\([^[]*\\)\\].*" "[[\\1][\\2]]" nil beg end))

のように定義できる.正規表現に自信がなければ迷わず re-builder を使って確認し よう.また,開発中は replace-regexp ではなく query-replace-regexp を使うほー がいい.