Sync to HEAD
[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
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
bb8143d9
KH
52(defvar tabify-regexp "[ \t][ \t]+"
53 "Regexp matching whitespace that tabify should consider.
54Usually this will be \"[ \\t][ \\t]+\" to match two or more spaces or tabs.
55\"^[ \\t]+\" is also useful, for tabifying only initial whitespace.")
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)
bb8143d9 74 (while (re-search-forward tabify-regexp nil t)
a2535589
JA
75 (let ((column (current-column))
76 (indent-tabs-mode t))
77 (delete-region (match-beginning 0) (point))
78 (indent-to column))))))
c88ab9ce 79
85588571
RS
80(provide 'tabify)
81
6b61353c 82;;; arch-tag: c83893b1-e0cc-4e57-8a09-73fd03466416
c88ab9ce 83;;; tabify.el ends here