This is probably only interesting to emacs users who, like me, have
never liked the way indentation works in emacs' tex-mode.  I want it
to work like this:

  * if I hit tab on a blank line, I want to indent, even if I'm right
    below a blank line -- that's why I hit the tab key!

  * if I hit tab under an indented line, I want to indent to the
    beginning of the previous line.

  * using four-space tab stops so tex looks good

... and I can always use M-i to indent further that the previous
line. 

Here's some emacs lisp code that does all that (try it on
non-essential files first -- I'm no lisp guru).  It's based on stuff
in indent.el, and I haven't really optimized it for style.  ;)


(defun indent-tab-stop-or-relative (&optional unindented-ok)
"indent even under blank line.  indent to beginning of last line if
non-blank"
  (interactive "P")
  (if (and abbrev-mode
           (eq (char-syntax (preceding-char)) ?w))
      (expand-abbrev))
  (let ((start-column (current-column))
        (indent nil))
    (save-excursion
      (beginning-of-line)
      ;; if preceding line is not blank
      (if (not (re-search-backward "^[ \t]*\n" nil t))
          (progn
            (forward-line -1)
            (move-to-column start-column)
            ;; Is start-column inside a tab on this line?
            (if (> (current-column) start-column)
                (backward-char 1))
            (if (looking-at "[ \t]")
                (progn
                  (skip-chars-forward " \t")
                  (setq indent (current-column)))))))
    (let ((opoint (point-marker)))
      (delete-horizontal-space)
      (if indent
          (indent-to indent)
        (tab-to-tab-stop))
      (if (> opoint (point))
          (goto-char opoint))
      (move-marker opoint nil))))

; (setq tex-mode-hook nil)
(add-hook
 'tex-mode-hook
 '(lambda ()
    "my own tex stuff.  enough misery!!!"
    ; (let ((k (make-sparse-keymap))
    (make-local-variable 'tab-stop-list)
    (setq tab-stop-list                 ; four-space stops
          '(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60
              64 68 72 76 80 84 88 92 96 100 104 108 112
              116 120 124 128 132 136 140 144 148 152 156
              160 164 168 172 176 180 184 188 192 196 200
              204 208 212 216 220 224 228 232 236 240))
    (make-local-variable 'indent-line-function)
    (setq indent-line-function 'indent-tab-stop-or-relative)
    (local-set-key "\C-j" 'newline-and-indent)
    (local-set-key "\t" 'indent-tab-stop-or-relative)))



-- 
--Ed L Cashin            |   PGP public key:
  [EMAIL PROTECTED]        |   http://noserose.net/e/pgp/

Reply via email to