diff options
Diffstat (limited to 'emacs.d/site-lisp/smarttabs.el')
-rw-r--r-- | emacs.d/site-lisp/smarttabs.el | 58 |
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) |