summaryrefslogtreecommitdiff
path: root/lisp/tabify.el
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2006-07-25 18:06:13 +0000
committerStefan Monnier <monnier@iro.umontreal.ca>2006-07-25 18:06:13 +0000
commit49c7d1acf058d2509b6311dda0e026dbb7990478 (patch)
tree84b3db51d04ac0171593298f39fcf6fb3fc21190 /lisp/tabify.el
parent94b392396335ef8b68c6b9e1405b73e472388a21 (diff)
downloademacs-49c7d1acf058d2509b6311dda0e026dbb7990478.tar.gz
(tabify-regexp): Use more specific regexps.
(tabify): Avoid modifying the buffer unnecessarily.
Diffstat (limited to 'lisp/tabify.el')
-rw-r--r--lisp/tabify.el29
1 files changed, 20 insertions, 9 deletions
diff --git a/lisp/tabify.el b/lisp/tabify.el
index 6e12270bf47..de37f281eda 100644
--- a/lisp/tabify.el
+++ b/lisp/tabify.el
@@ -50,10 +50,10 @@ The variable `tab-width' controls the spacing of tab stops."
(delete-region tab-beg (point))
(indent-to column))))))
-(defvar tabify-regexp "[ \t][ \t]+"
+(defvar tabify-regexp " [ \t]+"
"Regexp matching whitespace that tabify should consider.
-Usually this will be \"[ \\t][ \\t]+\" to match two or more spaces or tabs.
-\"^[ \\t]+\" is also useful, for tabifying only initial whitespace.")
+Usually this will be \" [ \\t]+\" to match two or more spaces or tabs.
+\"^\\t* [ \\t]+\" is also useful, for tabifying only initial whitespace.")
;;;###autoload
(defun tabify (start end)
@@ -72,13 +72,24 @@ The variable `tab-width' controls the spacing of tab stops."
(beginning-of-line)
(narrow-to-region (point) end)
(goto-char start)
- (while (re-search-forward tabify-regexp nil t)
- (let ((column (current-column))
- (indent-tabs-mode t))
- (delete-region (match-beginning 0) (point))
- (indent-to column))))))
+ (let ((indent-tabs-mode t))
+ (while (re-search-forward tabify-regexp nil t)
+ ;; The region between (match-beginning 0) and (match-end 0) is just
+ ;; spacing which we want to adjust to use TABs where possible.
+ (let ((end-col (current-column))
+ (beg-col (save-excursion (goto-char (match-beginning 0))
+ (skip-chars-forward "\t")
+ (current-column))))
+ (if (= (/ end-col tab-width) (/ beg-col tab-width))
+ ;; The spacing (after some leading TABs which we wouldn't
+ ;; want to touch anyway) does not straddle a TAB boundary,
+ ;; so it neither contains a TAB, nor will we be able to use
+ ;; a TAB here anyway: there's nothing to do.
+ nil
+ (delete-region (match-beginning 0) (point))
+ (indent-to end-col))))))))
(provide 'tabify)
-;;; arch-tag: c83893b1-e0cc-4e57-8a09-73fd03466416
+;; arch-tag: c83893b1-e0cc-4e57-8a09-73fd03466416
;;; tabify.el ends here