過去に作った 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
 )