summaryrefslogtreecommitdiffstats
path: root/emacs.d/site-lisp/smarttabs.el
diff options
context:
space:
mode:
Diffstat (limited to 'emacs.d/site-lisp/smarttabs.el')
-rw-r--r--emacs.d/site-lisp/smarttabs.el58
1 files changed, 58 insertions, 0 deletions
diff --git a/emacs.d/site-lisp/smarttabs.el b/emacs.d/site-lisp/smarttabs.el
new file mode 100644
index 0000000..facfaf5
--- /dev/null
+++ b/emacs.d/site-lisp/smarttabs.el
@@ -0,0 +1,58 @@
+;;
+;; Emacs smart tabs functionality
+;; Intelligently indent with tabs, align with spaces!
+;;
+;; Note: Indenting only uses tabs when indent-tabs-mode is non-nil,
+;; otherwise it uses spaces as usual.
+;;
+;; To use: save as smarttabs.el in your .emacs.d directory, and add
+;; "(require 'smarttabs)" to your .emacs file.
+;;
+;; Code is GPLv2, derived from http://www.emacswiki.org/emacs/SmartTabs
+;;
+;; Modifications by John Croisant:
+;; * Remembers and re-applies window start, so that indenting doesn't
+;; cause the window to visibly scroll. (2009-09-18)
+;;
+
+
+(defadvice align (around smart-tabs activate)
+ (let ((indent-tabs-mode nil)) ad-do-it))
+
+(defadvice align-regexp (around smart-tabs activate)
+ (let ((indent-tabs-mode nil)) ad-do-it))
+
+(defadvice indent-relative (around smart-tabs activate)
+ (let ((indent-tabs-mode nil)) ad-do-it))
+
+(defadvice indent-according-to-mode (around smart-tabs activate)
+ (let ((indent-tabs-mode indent-tabs-mode))
+ (if (memq indent-line-function
+ '(indent-relative
+ indent-relative-maybe))
+ (setq indent-tabs-mode nil))
+ ad-do-it))
+
+(defmacro smart-tabs-advice (function offset)
+ (defvaralias offset 'tab-width)
+ `(defadvice ,function (around smart-tabs activate)
+ (cond
+ (indent-tabs-mode
+ (save-excursion
+ (beginning-of-line)
+ (while (looking-at "\t*\\( +\\)\t+")
+ (replace-match "" nil nil nil 1)))
+ (setq tab-width tab-width)
+ (let ((tab-width fill-column)
+ (,offset fill-column)
+ (wstart (window-start)))
+ ad-do-it
+ (set-window-start (selected-window) wstart)))
+ (t
+ ad-do-it))))
+
+(smart-tabs-advice c-indent-line c-basic-offset)
+(smart-tabs-advice c-indent-region c-basic-offset)
+
+
+(provide 'smarttabs)