[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: How to whip Emacs into weird indentation rules with tabs+spaces?
From: |
Alan Mackenzie |
Subject: |
Re: How to whip Emacs into weird indentation rules with tabs+spaces? |
Date: |
Fri, 18 Jul 2008 16:51:12 +0000 |
User-agent: |
Mutt/1.5.9i |
Hi, Juanma,
On Fri, Jul 18, 2008 at 02:35:57AM +0200, Juanma wrote:
> Hi ... again.
> The question is, for C++ code, how to make Emacs insert tabs for "main
> indentation" and spaces for "sub-indentation". Example:
> |---| = tab . = space
> |---|while ( something &&
> |---|........some_else )
> |---|---|then_do_something();
> The idea is that tab goes one level further, but for same-level adjustments
> only spaces should be used.
> How to force Emacs into that insanity? (no, it's not my personal choice)
I got precisely this request on bug-cc-mode@gnu.org in January, from a
Mike Sullivan (Subject: Supporting tabs for indentation, spaces for
alignment, Date: Wed, 9 Jan 2008 02:04:40 -0600, Message-ID:
<a2dd74f90801090004r347ae528oc274782f5ae91f5c@mail.gmail.com>). I
replied to the effect that I would consider such a contribution for
incorporation into CC Mode. :-)
However, I also supplied a quick hack which can be installed on
c-special-indent-hook. (Don't anybody ever accuse CC Mode of lack of
flexibility!). It's probably not production quality code, but try it and
see what you think:
#########################################################################
(defun ms-space-for-alignment ()
"Make the current line use tabs for indentation and spaces for alignment.
It is intended to be called from the hook
`c-special-indent-hook'. It assumes that `indent-tabs-mode' is
non-nil and probably assumes that `c-basic-offset' is the same as
`tab-width'."
(save-excursion
(let* ((indent-pos (progn (back-to-indentation) (point)))
(indent-col (current-column))
(syn-elt (car c-syntactic-context))
(syn-sym (c-langelem-sym syn-elt)))
(when (memq syn-sym '(arglist-cont-nonempty)) ;; <==============
(let* ((syn-anchor (c-langelem-pos syn-elt))
(anchor-col (progn (goto-char syn-anchor)
(back-to-indentation)
(current-column)))
num-tabs)
;;
(goto-char indent-pos)
(delete-horizontal-space)
(insert-char ?\t (/ anchor-col tab-width))
(insert-char ?\ (- indent-col (current-column))))))))
To enable it, do this, or similar:
M-: (setq indent-tabs-mode t)
M-: (setq tab-width 3)
M-: (setq c-basic-offset tab-width)
M-: (add-hook 'c-special-indent-hook 'ms-space-for-alignment nil t)
#########################################################################
> Many thanks.
> --
> Juanma
--
Alan Mackenzie (Nuremberg, Germany).