;;; tabify.el --- tab conversion commands for Emacs
-;; Copyright (C) 1985, 1994, 2001, 2002, 2003, 2004,
-;; 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+;; Copyright (C) 1985, 1994, 2001-2013 Free Software Foundation, Inc.
;; Maintainer: FSF
;; Package: emacs
;;; Code:
;;;###autoload
-(defun untabify (start end)
+(defun untabify (start end &optional _arg)
"Convert all tabs in region to multiple spaces, preserving columns.
+If called interactively with prefix ARG, convert for the entire
+buffer.
+
Called non-interactively, the region is specified by arguments
START and END, rather than by the position of point and mark.
The variable `tab-width' controls the spacing of tab stops."
- (interactive "r")
- (save-excursion
- (save-restriction
- (narrow-to-region (point-min) end)
- (goto-char start)
- (while (search-forward "\t" nil t) ; faster than re-search
- (forward-char -1)
- (let ((tab-beg (point))
- (indent-tabs-mode nil)
- column)
- (skip-chars-forward "\t")
- (setq column (current-column))
- (delete-region tab-beg (point))
- (indent-to column))))))
+ (interactive (if current-prefix-arg
+ (list (point-min) (point-max) current-prefix-arg)
+ (list (region-beginning) (region-end) nil)))
+ (let ((c (current-column)))
+ (save-excursion
+ (save-restriction
+ (narrow-to-region (point-min) end)
+ (goto-char start)
+ (while (search-forward "\t" nil t) ; faster than re-search
+ (forward-char -1)
+ (let ((tab-beg (point))
+ (indent-tabs-mode nil)
+ column)
+ (skip-chars-forward "\t")
+ (setq column (current-column))
+ (delete-region tab-beg (point))
+ (indent-to column)))))
+ (move-to-column c)))
(defvar tabify-regexp " [ \t]+"
"Regexp matching whitespace that tabify should consider.
\"^\\t* [ \\t]+\" is also useful, for tabifying only initial whitespace.")
;;;###autoload
-(defun tabify (start end)
+(defun tabify (start end &optional _arg)
"Convert multiple spaces in region to tabs when possible.
A group of spaces is partially replaced by tabs
when this can be done without changing the column they end at.
+If called interactively with prefix ARG, convert for the entire
+buffer.
+
Called non-interactively, the region is specified by arguments
START and END, rather than by the position of point and mark.
The variable `tab-width' controls the spacing of tab stops."
- (interactive "r")
+ (interactive (if current-prefix-arg
+ (list (point-min) (point-max) current-prefix-arg)
+ (list (region-beginning) (region-end) nil)))
(save-excursion
(save-restriction
;; Include the beginning of the line in the narrowing