Mercurial > emacs
changeset 5787:bef3a67ac893
(string-rectangle): Make operate-on-rectangle convert tabs.
(string-rectangle-line): After inserting string, insert the same
width of whitespace that we deleted earlier.
(operate-on-rectangle): Operate even if width is 0.
(open-rectangle-line): Clean up.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Sat, 05 Feb 1994 02:19:28 +0000 |
parents | 730053369cab |
children | 913f27480fad |
files | lisp/rect.el |
diffstat | 1 files changed, 38 insertions(+), 33 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/rect.el Sat Feb 05 01:33:12 1994 +0000 +++ b/lisp/rect.el Sat Feb 05 02:19:28 1994 +0000 @@ -51,21 +51,20 @@ (setq endlinepos (point-marker))) (if (< endcol startcol) (setq startcol (prog1 endcol (setq endcol startcol)))) - (if (/= endcol startcol) - (save-excursion - (goto-char startlinepos) - (while (< (point) endlinepos) - (let (startpos begextra endextra) - (move-to-column startcol coerce-tabs) - (setq begextra (- (current-column) startcol)) - (setq startpos (point)) - (move-to-column endcol coerce-tabs) - (setq endextra (- endcol (current-column))) - (if (< begextra 0) - (setq endextra (+ endextra begextra) - begextra 0)) - (funcall function startpos begextra endextra)) - (forward-line 1)))) + (save-excursion + (goto-char startlinepos) + (while (< (point) endlinepos) + (let (startpos begextra endextra) + (move-to-column startcol coerce-tabs) + (setq begextra (- (current-column) startcol)) + (setq startpos (point)) + (move-to-column endcol coerce-tabs) + (setq endextra (- endcol (current-column))) + (if (< begextra 0) + (setq endextra (+ endextra begextra) + begextra 0)) + (funcall function startpos begextra endextra)) + (forward-line 1))) (- endcol startcol))) (defun delete-rectangle-line (startdelpos ignore ignore) @@ -179,17 +178,19 @@ (goto-char start)) (defun open-rectangle-line (startpos begextra endextra) - (let ((column (+ (current-column) begextra endextra))) + ;; Column where rectangle ends. + (let ((endcol (+ (current-column) endextra)) + whitewidth) (goto-char startpos) - (let ((ocol (current-column))) + ;; Column where rectangle begins. + (let ((begcol (- (current-column) begextra))) (skip-chars-forward " \t") - (setq column (+ column (- (current-column) ocol)))) - (delete-region (point) - ;; Use skip-chars-backward's LIM argument to leave - ;; characters before STARTPOS undisturbed. - (progn (skip-chars-backward " \t" startpos) - (point))) - (indent-to column))) + ;; Width of whitespace to be deleted and recreated. + (setq whitewidth (- (current-column) begcol))) + ;; Delete the whitespace following the start column. + (delete-region startpos (point)) + ;; Open the desired width, plus same amount of whitespace we just deleted. + (indent-to (+ endcol whitewidth)))) ;;;###autoload (defun string-rectangle (start end string) @@ -199,21 +200,22 @@ Called from a program, takes three args; START, END and STRING." (interactive "r\nsString rectangle: ") - (operate-on-rectangle 'string-rectangle-line start end nil) + (operate-on-rectangle 'string-rectangle-line start end t) (goto-char start)) (defun string-rectangle-line (startpos begextra endextra) - (let ((column (+ (current-column) begextra endextra))) + (let (whitespace) (goto-char startpos) + ;; Compute horizontal width of following whitespace. (let ((ocol (current-column))) (skip-chars-forward " \t") - (setq column (+ column (- (current-column) ocol)))) - (delete-region (point) - ;; Use skip-chars-backward's LIM argument to leave - ;; characters before STARTPOS undisturbed. - (progn (skip-chars-backward " \t" startpos) - (point))) - (insert string))) + (setq whitespace (- (current-column) ocol))) + ;; Delete the following whitespace. + (delete-region startpos (point)) + ;; Insert the desired string. + (insert string) + ;; Insert the same width of whitespace that we had before. + (indent-to (+ (current-column) whitespace)))) ;;;###autoload (defun clear-rectangle (start end) @@ -224,12 +226,15 @@ (operate-on-rectangle 'clear-rectangle-line start end t)) (defun clear-rectangle-line (startpos begextra endextra) + ;; Find end of whitespace after the rectangle. (skip-chars-forward " \t") (let ((column (+ (current-column) endextra))) + ;; Delete the text in the rectangle, and following whitespace. (delete-region (point) (progn (goto-char startpos) (skip-chars-backward " \t") (point))) + ;; Reindent out to same column that we were at. (indent-to column))) (provide 'rect)