2018年11月28日水曜日

xyzzyで連番を振る



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 件のコメント:

コメントを投稿