rubikitchさんの number-rectangleをちょっと改良 & バグフィックス

2011-02-21 - http://rubikitch.com/に移転しました

にある number-rectangle大変便利で使わせていただいているのですが、
最終行を含む場合に動作しないバグがあったのと、ある行のカラムが
挿入するカラムに満たない場合の挙動が望むものではなかったので
修正を加えました。

差分

バグフィックスはループの継続条件の部分です。最終行の場合条件が満たされない
ので、無限に挿入するということになっていました。


挙動については move-to-columnの第二引数を tにしました。
move-to-columnは第二引数を指定しない、nilの場合、挿入する
桁数より現在の桁数が小さければ現在の桁数に移動します。一方第二引数が
真値の場合強制的に第一引数の桁数まで移動します。
string-rectangle等は第二引数が真値の挙動ですので、それに合わせました。


追記
申し訳ありません。テスト条件が甘かったです。eobpのテストをする場合、
move-to-columnのあとではいつまでたってもバッファの最後まで到達しない
ケースがありました。なので、move-to-columnは insertの前に位置を変更
しました。

diff --git a/emacs b/emacs
index 32d76fb..96f9819 100644
--- a/emacs
+++ b/emacs
@@ -892,11 +892,11 @@
     (delete-rectangle start end)
     (goto-char start)
     (loop with column = (current-column)
-          while (<= (point) end)
+          while (and (<= (point) end) (not (eobp)))
           for i from from   do
+          (move-to-column column t)
           (insert (format format-string i))
-          (forward-line 1)
-          (move-to-column column t)))
+          (forward-line 1)))
   (goto-char start))
 
 (global-set-key "\C-xrN" 'number-rectangle)

関数全体

一応全体版も貼っておきます。(追記 2011年 3月14日)

;; number-rectangle
(eval-when-compile (require 'cl))
(defun number-rectangle (start end format-string from)
  "Delete (don't save) text in the region-rectangle, then number it."
  (interactive
   (list (region-beginning) (region-end)
         (read-string "Number rectangle: " (if (looking-back "^ *") "%d. " "%d"))
         (read-number "From: " 1)))
  (save-excursion
    (goto-char start)
    (setq start (point-marker))
    (goto-char end)
    (setq end (point-marker))
    (delete-rectangle start end)
    (goto-char start)
    (loop with column = (current-column)
          while (and (<= (point) end) (not (eobp)))
          for i from from   do
          (move-to-column column t)
          (insert (format format-string i))
          (forward-line 1)))
  (goto-char start))

(global-set-key "\C-xrN" 'number-rectangle)

まとめ

number-rectangleのバグフィックスと修正を紹介しました。
バグフィックスの方は取り込んでもらえるように rubikitchさんに
連絡しておこうと思います。