diff options
| author | Richard M. Stallman | 1994-02-05 02:19:28 +0000 |
|---|---|---|
| committer | Richard M. Stallman | 1994-02-05 02:19:28 +0000 |
| commit | bc8ea5430e719711c5d7071d9c0cda36a9a725eb (patch) | |
| tree | e9ba99a9de5369fb83bc97c12ae495e182d2af83 | |
| parent | 9d721a9e79c5dfd2807dca9a310dffcb6f5103ae (diff) | |
| download | emacs-bc8ea5430e719711c5d7071d9c0cda36a9a725eb.tar.gz emacs-bc8ea5430e719711c5d7071d9c0cda36a9a725eb.zip | |
(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.
| -rw-r--r-- | lisp/rect.el | 71 |
1 files changed, 38 insertions, 33 deletions
diff --git a/lisp/rect.el b/lisp/rect.el index ce29111f2e1..60a94877bbc 100644 --- a/lisp/rect.el +++ b/lisp/rect.el | |||
| @@ -51,21 +51,20 @@ Point is at the end of the segment of this line within the rectangle." | |||
| 51 | (setq endlinepos (point-marker))) | 51 | (setq endlinepos (point-marker))) |
| 52 | (if (< endcol startcol) | 52 | (if (< endcol startcol) |
| 53 | (setq startcol (prog1 endcol (setq endcol startcol)))) | 53 | (setq startcol (prog1 endcol (setq endcol startcol)))) |
| 54 | (if (/= endcol startcol) | 54 | (save-excursion |
| 55 | (save-excursion | 55 | (goto-char startlinepos) |
| 56 | (goto-char startlinepos) | 56 | (while (< (point) endlinepos) |
| 57 | (while (< (point) endlinepos) | 57 | (let (startpos begextra endextra) |
| 58 | (let (startpos begextra endextra) | 58 | (move-to-column startcol coerce-tabs) |
| 59 | (move-to-column startcol coerce-tabs) | 59 | (setq begextra (- (current-column) startcol)) |
| 60 | (setq begextra (- (current-column) startcol)) | 60 | (setq startpos (point)) |
| 61 | (setq startpos (point)) | 61 | (move-to-column endcol coerce-tabs) |
| 62 | (move-to-column endcol coerce-tabs) | 62 | (setq endextra (- endcol (current-column))) |
| 63 | (setq endextra (- endcol (current-column))) | 63 | (if (< begextra 0) |
| 64 | (if (< begextra 0) | 64 | (setq endextra (+ endextra begextra) |
| 65 | (setq endextra (+ endextra begextra) | 65 | begextra 0)) |
| 66 | begextra 0)) | 66 | (funcall function startpos begextra endextra)) |
| 67 | (funcall function startpos begextra endextra)) | 67 | (forward-line 1))) |
| 68 | (forward-line 1)))) | ||
| 69 | (- endcol startcol))) | 68 | (- endcol startcol))) |
| 70 | 69 | ||
| 71 | (defun delete-rectangle-line (startdelpos ignore ignore) | 70 | (defun delete-rectangle-line (startdelpos ignore ignore) |
| @@ -179,17 +178,19 @@ but instead winds up to the right of the rectangle." | |||
| 179 | (goto-char start)) | 178 | (goto-char start)) |
| 180 | 179 | ||
| 181 | (defun open-rectangle-line (startpos begextra endextra) | 180 | (defun open-rectangle-line (startpos begextra endextra) |
| 182 | (let ((column (+ (current-column) begextra endextra))) | 181 | ;; Column where rectangle ends. |
| 182 | (let ((endcol (+ (current-column) endextra)) | ||
| 183 | whitewidth) | ||
| 183 | (goto-char startpos) | 184 | (goto-char startpos) |
| 184 | (let ((ocol (current-column))) | 185 | ;; Column where rectangle begins. |
| 186 | (let ((begcol (- (current-column) begextra))) | ||
| 185 | (skip-chars-forward " \t") | 187 | (skip-chars-forward " \t") |
| 186 | (setq column (+ column (- (current-column) ocol)))) | 188 | ;; Width of whitespace to be deleted and recreated. |
| 187 | (delete-region (point) | 189 | (setq whitewidth (- (current-column) begcol))) |
| 188 | ;; Use skip-chars-backward's LIM argument to leave | 190 | ;; Delete the whitespace following the start column. |
| 189 | ;; characters before STARTPOS undisturbed. | 191 | (delete-region startpos (point)) |
| 190 | (progn (skip-chars-backward " \t" startpos) | 192 | ;; Open the desired width, plus same amount of whitespace we just deleted. |
| 191 | (point))) | 193 | (indent-to (+ endcol whitewidth)))) |
| 192 | (indent-to column))) | ||
| 193 | 194 | ||
| 194 | ;;;###autoload | 195 | ;;;###autoload |
| 195 | (defun string-rectangle (start end string) | 196 | (defun string-rectangle (start end string) |
| @@ -199,21 +200,22 @@ This command does not delete or overwrite any existing text. | |||
| 199 | 200 | ||
| 200 | Called from a program, takes three args; START, END and STRING." | 201 | Called from a program, takes three args; START, END and STRING." |
| 201 | (interactive "r\nsString rectangle: ") | 202 | (interactive "r\nsString rectangle: ") |
| 202 | (operate-on-rectangle 'string-rectangle-line start end nil) | 203 | (operate-on-rectangle 'string-rectangle-line start end t) |
| 203 | (goto-char start)) | 204 | (goto-char start)) |
| 204 | 205 | ||
| 205 | (defun string-rectangle-line (startpos begextra endextra) | 206 | (defun string-rectangle-line (startpos begextra endextra) |
| 206 | (let ((column (+ (current-column) begextra endextra))) | 207 | (let (whitespace) |
| 207 | (goto-char startpos) | 208 | (goto-char startpos) |
| 209 | ;; Compute horizontal width of following whitespace. | ||
| 208 | (let ((ocol (current-column))) | 210 | (let ((ocol (current-column))) |
| 209 | (skip-chars-forward " \t") | 211 | (skip-chars-forward " \t") |
| 210 | (setq column (+ column (- (current-column) ocol)))) | 212 | (setq whitespace (- (current-column) ocol))) |
| 211 | (delete-region (point) | 213 | ;; Delete the following whitespace. |
| 212 | ;; Use skip-chars-backward's LIM argument to leave | 214 | (delete-region startpos (point)) |
| 213 | ;; characters before STARTPOS undisturbed. | 215 | ;; Insert the desired string. |
| 214 | (progn (skip-chars-backward " \t" startpos) | 216 | (insert string) |
| 215 | (point))) | 217 | ;; Insert the same width of whitespace that we had before. |
| 216 | (insert string))) | 218 | (indent-to (+ (current-column) whitespace)))) |
| 217 | 219 | ||
| 218 | ;;;###autoload | 220 | ;;;###autoload |
| 219 | (defun clear-rectangle (start end) | 221 | (defun clear-rectangle (start end) |
| @@ -224,12 +226,15 @@ When called from a program, requires two args which specify the corners." | |||
| 224 | (operate-on-rectangle 'clear-rectangle-line start end t)) | 226 | (operate-on-rectangle 'clear-rectangle-line start end t)) |
| 225 | 227 | ||
| 226 | (defun clear-rectangle-line (startpos begextra endextra) | 228 | (defun clear-rectangle-line (startpos begextra endextra) |
| 229 | ;; Find end of whitespace after the rectangle. | ||
| 227 | (skip-chars-forward " \t") | 230 | (skip-chars-forward " \t") |
| 228 | (let ((column (+ (current-column) endextra))) | 231 | (let ((column (+ (current-column) endextra))) |
| 232 | ;; Delete the text in the rectangle, and following whitespace. | ||
| 229 | (delete-region (point) | 233 | (delete-region (point) |
| 230 | (progn (goto-char startpos) | 234 | (progn (goto-char startpos) |
| 231 | (skip-chars-backward " \t") | 235 | (skip-chars-backward " \t") |
| 232 | (point))) | 236 | (point))) |
| 237 | ;; Reindent out to same column that we were at. | ||
| 233 | (indent-to column))) | 238 | (indent-to column))) |
| 234 | 239 | ||
| 235 | (provide 'rect) | 240 | (provide 'rect) |