aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--etc/NEWS4
-rw-r--r--lisp/ChangeLog7
-rw-r--r--lisp/rect.el40
3 files changed, 51 insertions, 0 deletions
diff --git a/etc/NEWS b/etc/NEWS
index 7cedb072be..178631bc28 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -303,6 +303,10 @@ set `x-select-enable-clipboard' to nil.
*** Support for X cut buffers has been removed.
+** New command `rectangle-number-lines', bound to `C-x r N', numbers
+the lines in the current rectangle. With an prefix argument, this
+prompts for a number to count from and for a format string.
+
* Changes in Specialized Modes and Packages in Emacs 24.1
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 9d49d3e0b7..13a5a35854 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,10 @@
+2010-12-15 Jari Aalto <[email protected]>
+ Scott Evans <[email protected]>
+
+ * rect.el (rectange--default-line-number-format)
+ (rectangle-number-line-callback): New functions.
+ (rectangle-number-lines): New command, bound to C-x r N (Bug#4382).
+
2010-12-15 Chong Yidong <[email protected]>
* rect.el (operate-on-rectangle-lines, string-rectangle-string):
diff --git a/lisp/rect.el b/lisp/rect.el
index aedddebe4f..e24331ebbb 100644
--- a/lisp/rect.el
+++ b/lisp/rect.el
@@ -38,6 +38,7 @@
;;;###autoload (define-key ctl-x-r-map "y" 'yank-rectangle)
;;;###autoload (define-key ctl-x-r-map "o" 'open-rectangle)
;;;###autoload (define-key ctl-x-r-map "t" 'string-rectangle)
+;;;###autoload (define-key ctl-x-r-map "N" 'rectangle-number-lines)
;;; Code:
@@ -370,6 +371,45 @@ rectangle which were empty."
(delete-region pt (point))
(indent-to endcol)))))
+;; Line numbers for `rectangle-number-line-callback'.
+(defvar rectangle-number-line-counter)
+
+(defun rectangle-number-line-callback (start end format-string)
+ (move-to-column start t)
+ (insert (format format-string rectangle-number-line-counter))
+ (setq rectangle-number-line-counter
+ (1+ rectangle-number-line-counter)))
+
+(defun rectange--default-line-number-format (start end start-at)
+ (concat "%"
+ (int-to-string (length (int-to-string (+ (count-lines start end)
+ start-at))))
+ "d "))
+
+;;;###autoload
+(defun rectangle-number-lines (start end start-at &optional format)
+ "Insert numbers in front of the region-rectangle.
+
+START-AT, if non-nil, should be a number from which to begin
+counting. FORMAT, if non-nil, should be a format string to pass
+to `format' along with the line count. When called interactively
+with a prefix argument, prompt for START-AT and FORMAT."
+ (interactive
+ (if current-prefix-arg
+ (let* ((start (region-beginning))
+ (end (region-end))
+ (start-at (read-number "Number to count from: " 1)))
+ (list start end start-at
+ (read-string "Format string: "
+ (rectange--default-line-number-format
+ start end start-at))))
+ (list (region-beginning) (region-end) 1 nil)))
+ (unless format
+ (setq format (rectange--default-line-number-format start end start-at)))
+ (let ((rectangle-number-line-counter start-at))
+ (apply-on-rectangle 'rectangle-number-line-callback
+ start end format)))
+
(provide 'rect)
;; arch-tag: 178847b3-1f50-4b03-83de-a6e911cc1d16