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