Thanks Driven Life

日々是感謝

カーソルの位置にある数字列をインクリメントする emacs lisp

久々に elisp 書いたよー。
vim だと C-a とかでできるらしいものなんだけど、emacs には無いみたい。
ありそうなんだけどなーと思いつつ、とりあえず書いてみた。

(defun increment-string-as-number (number)
  "Replace progression string of the position of the cursor
by string that added NUMBER.
Interactively, NUMBER is the prefix arg.
 
examle:
  At the cursor string \"12\"
 
  M-x increment-string-as-number        ;; replaced by \"13\"
  C-u 10 M-x increment-string-as-number ;; replaced by \"22\"
 
  At the cursor string \"-12\"
 
  M-x increment-string-as-number         ;; replaced by \"-11\"
  C-u 100 M-x increment-string-as-number ;; replaced by \"89\""
  (interactive "P")
  (if (string=~ "[0-9]" (char-to-string (char-after)) t)
      (save-excursion
        (save-restriction
          (let ((p (if (integerp number) number 1))
                begin end augend)
            (re-search-backward "^\\\|[^0-9]")
            (if (string=~ "[^-0-9]" (char-to-string (char-after)) t)
                (forward-char))
            (setq begin (point))
            (re-search-forward "[0-9]+")
            (setq end (point))
            (narrow-to-region begin end)
            (setq augend (string-to-number (buffer-string)))
            (delete-region (point-min) (point-max))
            (insert (number-to-string (+ augend p)))
            (widen)
            )))
    (error "Can't calculation because not number at cursor point")))

おおむね良好な動作だとは思うが、不満としてはインクリメント後に、その数字列の
先頭に移動してしまうこと。narrow -> widen だとカーソル位置覚えてないんだっけ?
一応 save-excursion は入れてるけど・・あんまよくわかりませんね。


まぁ、久々の elisp ってだけで満足してるのでいいです。誰か書き直してください。