Add "Package:" file headers to denote built-in packages.
[bpt/emacs.git] / lisp / tabify.el
CommitLineData
c88ab9ce
ER
1;;; tabify.el --- tab conversion commands for Emacs
2
c90f2757 3;; Copyright (C) 1985, 1994, 2001, 2002, 2003, 2004,
114f9c96 4;; 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
a2535589 5
58142744 6;; Maintainer: FSF
bd78fa1d 7;; Package: emacs
58142744 8
a2535589
JA
9;; This file is part of GNU Emacs.
10
eb3fa2cf 11;; GNU Emacs is free software: you can redistribute it and/or modify
a2535589 12;; it under the terms of the GNU General Public License as published by
eb3fa2cf
GM
13;; the Free Software Foundation, either version 3 of the License, or
14;; (at your option) any later version.
a2535589
JA
15
16;; GNU Emacs is distributed in the hope that it will be useful,
17;; but WITHOUT ANY WARRANTY; without even the implied warranty of
18;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19;; GNU General Public License for more details.
20
21;; You should have received a copy of the GNU General Public License
eb3fa2cf 22;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
a2535589 23
d9ecc911
ER
24;;; Commentary:
25
26;; Commands to optimize spaces to tabs or expand tabs to spaces in a region
27;; (`tabify' and `untabify'). The variable tab-width does the obvious.
28
22a89ee8 29;;; Code:
a2535589 30
f9f9507e 31;;;###autoload
a2535589
JA
32(defun untabify (start end)
33 "Convert all tabs in region to multiple spaces, preserving columns.
e47b2570
RS
34Called non-interactively, the region is specified by arguments
35START and END, rather than by the position of point and mark.
36The variable `tab-width' controls the spacing of tab stops."
a2535589
JA
37 (interactive "r")
38 (save-excursion
39 (save-restriction
5119b412 40 (narrow-to-region (point-min) end)
a2535589
JA
41 (goto-char start)
42 (while (search-forward "\t" nil t) ; faster than re-search
bb8143d9 43 (forward-char -1)
2d8e81a5 44 (let ((tab-beg (point))
bb8143d9
KH
45 (indent-tabs-mode nil)
46 column)
47 (skip-chars-forward "\t")
48 (setq column (current-column))
2d8e81a5 49 (delete-region tab-beg (point))
a2535589
JA
50 (indent-to column))))))
51
49c7d1ac 52(defvar tabify-regexp " [ \t]+"
bb8143d9 53 "Regexp matching whitespace that tabify should consider.
e5b1b45c 54Usually this will be \" [ \\t]+\" to match a space followed by whitespace.
49c7d1ac 55\"^\\t* [ \\t]+\" is also useful, for tabifying only initial whitespace.")
bb8143d9 56
f9f9507e 57;;;###autoload
a2535589
JA
58(defun tabify (start end)
59 "Convert multiple spaces in region to tabs when possible.
60A group of spaces is partially replaced by tabs
61when this can be done without changing the column they end at.
e47b2570
RS
62Called non-interactively, the region is specified by arguments
63START and END, rather than by the position of point and mark.
64The variable `tab-width' controls the spacing of tab stops."
a2535589
JA
65 (interactive "r")
66 (save-excursion
67 (save-restriction
7be313ea
RS
68 ;; Include the beginning of the line in the narrowing
69 ;; since otherwise it will throw off current-column.
70 (goto-char start)
71 (beginning-of-line)
72 (narrow-to-region (point) end)
a2535589 73 (goto-char start)
49c7d1ac
SM
74 (let ((indent-tabs-mode t))
75 (while (re-search-forward tabify-regexp nil t)
76 ;; The region between (match-beginning 0) and (match-end 0) is just
77 ;; spacing which we want to adjust to use TABs where possible.
78 (let ((end-col (current-column))
79 (beg-col (save-excursion (goto-char (match-beginning 0))
80 (skip-chars-forward "\t")
81 (current-column))))
82 (if (= (/ end-col tab-width) (/ beg-col tab-width))
83 ;; The spacing (after some leading TABs which we wouldn't
84 ;; want to touch anyway) does not straddle a TAB boundary,
85 ;; so it neither contains a TAB, nor will we be able to use
86 ;; a TAB here anyway: there's nothing to do.
87 nil
88 (delete-region (match-beginning 0) (point))
89 (indent-to end-col))))))))
c88ab9ce 90
85588571
RS
91(provide 'tabify)
92
49c7d1ac 93;; arch-tag: c83893b1-e0cc-4e57-8a09-73fd03466416
c88ab9ce 94;;; tabify.el ends here