new version
[bpt/emacs.git] / lisp / tabify.el
CommitLineData
c88ab9ce
ER
1;;; tabify.el --- tab conversion commands for Emacs
2
040d52ec 3;; Copyright (C) 1985, 1994 Free Software Foundation, Inc.
a2535589 4
58142744
ER
5;; Maintainer: FSF
6
a2535589
JA
7;; This file is part of GNU Emacs.
8
9;; GNU Emacs is free software; you can redistribute it and/or modify
10;; it under the terms of the GNU General Public License as published by
e5167999 11;; the Free Software Foundation; either version 2, or (at your option)
a2535589
JA
12;; any later version.
13
14;; GNU Emacs is distributed in the hope that it will be useful,
15;; but WITHOUT ANY WARRANTY; without even the implied warranty of
16;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17;; GNU General Public License for more details.
18
19;; You should have received a copy of the GNU General Public License
b578f267
EN
20;; along with GNU Emacs; see the file COPYING. If not, write to the
21;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
22;; Boston, MA 02111-1307, USA.
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
2d8e81a5 43 (let ((tab-beg (point))
a2535589
JA
44 (column (current-column))
45 (indent-tabs-mode nil))
2d8e81a5
RS
46 (skip-chars-backward "\t" start)
47 (delete-region tab-beg (point))
a2535589
JA
48 (indent-to column))))))
49
f9f9507e 50;;;###autoload
a2535589
JA
51(defun tabify (start end)
52 "Convert multiple spaces in region to tabs when possible.
53A group of spaces is partially replaced by tabs
54when this can be done without changing the column they end at.
e47b2570
RS
55Called non-interactively, the region is specified by arguments
56START and END, rather than by the position of point and mark.
57The variable `tab-width' controls the spacing of tab stops."
a2535589
JA
58 (interactive "r")
59 (save-excursion
60 (save-restriction
7be313ea
RS
61 ;; Include the beginning of the line in the narrowing
62 ;; since otherwise it will throw off current-column.
63 (goto-char start)
64 (beginning-of-line)
65 (narrow-to-region (point) end)
a2535589
JA
66 (goto-char start)
67 (while (re-search-forward "[ \t][ \t][ \t]*" nil t)
68 (let ((column (current-column))
69 (indent-tabs-mode t))
70 (delete-region (match-beginning 0) (point))
71 (indent-to column))))))
c88ab9ce 72
85588571
RS
73(provide 'tabify)
74
c88ab9ce 75;;; tabify.el ends here