xyzzyで連番を振れるようにする。具体的には以下。
・Enterを押したときに作動
・行頭が・ならば次の行頭にも・を付ける
・行頭が数値+ピリオド(1.や1.)ならば次の行頭に連番を振る
・連番の後ろに文字列がない行でEnterを押せば、その連番を解除
;; ■ 連番を振る
;; 行頭が「・」あるいは「1.」「1.」の場合、Enterで連番にする
;; 連番しかないのにEnterを押した場合は連番を消す
;; 全角数字あるいは半角数字に1プラスして返す関数
(defun plus-1-string (str)
(cond
((string-match "[0-9]+" str)
(setf int (parse-integer str))
(format nil "~d" (+ int 1)))
((string-match "[0-9]+" str)
(setf str (map-to-half-width-string str :ascii t))
(setf int (parse-integer str))
(setf str (format nil "~d" (+ int 1)))
(map-to-full-width-string str :ascii t))))
;; 本体
(defun insert-serial-numbers ()
(interactive)
(if (eolp) ;;行末のときのみ作動
(save-restriction
(narrow-to-region
(progn (beginning-of-line) (point))
(progn (end-of-line) (point)))
(beginning-of-line)
(cond
((scan-buffer "^・.+" :regexp t) (end-of-line)(insert "\n・"))
((scan-buffer "^・" :regexp t) (replace-match ""))
((scan-buffer "^\\([0-9]\\|[0-9]\\)\\(\\.\\|.\\).+" :regexp t)
(end-of-line)
(let ((f (match-string 1)) (b (match-string 2)))
(insert "\n" (plus-1-string f) (format nil "~A" b))))
((scan-buffer "^\\([0-9]\\|[0-9]\\)\\(\\.\\|.\\)" :regexp t) (replace-match "\n"))
( t (end-of-line) (insert "\n"))))
(newline))) ;; 行末でなかったら普通の改行
;;(define-key *howm-create2dir-mode-map* '#\RET 'insert-serial-numbers)
(global-set-key '#\RET 'insert-serial-numbers)
僕の場合はhowm以外で使う予定はないので、自作のhowmモードでのみ作動するようにしている。

0 件のコメント:
コメントを投稿