過去に作った elisp 関数をとりあえず置いてみる修行
, とか = とかで桁合せするための elisp 関数。久々に書いてあんまりきれいなコードじゃないけど、使えてるからまあいいか、と思ってみる。
(defun tdk-桁あわせ (start end anchor) (interactive "r\nsAnchor (like =): ") (let ((a nil) (b nil) ) (save-excursion ;(message (format "start = %s, end = %d" start end)) ;; 各行の anchor の位置と、行頭からの距離を計測 (let ( (current-point start) ) (while (< current-point end) (goto-char current-point) (next-line 1) ;(message (format "[%s-%s]" current-point n)) (if (search-forward anchor current-point t -1) (setq a (cons (cons (point) (- (point) current-point)) a)) ) (goto-char current-point) (next-line 1) (setq current-point (point)) )) (setq b a) (and a (let ((max 0) (x )) (while a (setq x (car a)) (if (< max (cdr x)) (setq max (cdr x))) (setq a (cdr a)) ) (setq a b) (while a (setq x (car a)) (goto-char (car x)) (let ((str "") (y (- max (cdr x)))) (setq str "") (while (< 0 y) (setq y (- y 1)) (setq str (concat " " str)) ) (insert str) ) (setq a (cdr a)) ) ) ; let ) ; and ) ; save-excursion ;(message (format "%s, %d" b max)) ) ; let )
ついでに、5 年前に作った「Emacs 系のエディタで dired を使っていて、なおかつソース管理を Source Safe を使っている」というよくいる人のための emacs lisp も置いてみる。 dired で対象ファイルを a で checkin, b でcheckout。
(defun dired-ss-checkout() (interactive) (dired-source-safe-action 'checkout)) (defun dired-ss-checkin() (interactive) (dired-source-safe-action 'checkin)) (defun dired-source-safe-action (action) (let (filename b-point e-point buffer) (save-excursion (move-to-column 57) ; ファイル名の先頭へ飛ぶ (setq b-point (point)) (end-of-line) ; 行末 (ファイル名の末尾) へ飛ぶ (setq e-point (point)) (setq buffer (current-buffer)) (setq filename (buffer-substring b-point e-point)) (set-buffer (get-buffer-create "*SS*")) (erase-buffer) (cond ((eq action 'checkout) ; checkout の場合 (insert (format "ss checkout %s\n" filename)) (start-process "ss" "*SS*" "ss" "checkout" filename) ) ((eq action 'checkin) ; checkin の場合 (insert (format "ss checkin %s\n" filename)) (start-process "ss" "*SS*" "ss" "checkin" filename) ) (t (message "unknown action %s" action) ) ) ; end of cond (switch-to-buffer-other-window "*SS*") (set-buffer buffer) (revert-buffer) ) ; end of save-excursion ) ; end of let ) (add-hook 'dired-mode-hook '(lambda () (define-key dired-mode-map "a" 'dired-ss-checkout) (define-key dired-mode-map "b" 'dired-ss-checkin) ))
これもおまけ。C のヘッダファイル全体を #ifndef, #endif で囲ってくれる関数。10 年以上前のものだろうな。
(defun tdk-c-header-file(symbol-name) (interactive "sThe symbol name specified this header file: ") (save-excursion (goto-char (point-min)) (insert "#ifndef " symbol-name "\n") (insert "#define " symbol-name "\n") (goto-char (point-max)) (insert "\n#endif //" symbol-name "\n") ) ; end of save-excursion )