unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
* How to whip Emacs into weird indentation rules with tabs+spaces?
@ 2008-07-18  0:35 Juanma
  2008-07-18 16:51 ` Alan Mackenzie
  0 siblings, 1 reply; 7+ messages in thread
From: Juanma @ 2008-07-18  0:35 UTC (permalink / raw)
  To: help-gnu-emacs

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)

Many thanks.
-- 
Juanma

"Having a smoking section in a restaurant is like
 having a peeing section in a swimming pool."
       -- Edward Burr








^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: How to whip Emacs into weird indentation rules with tabs+spaces?
       [not found] <mailman.14916.1216341367.18990.help-gnu-emacs@gnu.org>
@ 2008-07-18 10:04 ` Xah
  0 siblings, 0 replies; 7+ messages in thread
From: Xah @ 2008-07-18 10:04 UTC (permalink / raw)
  To: help-gnu-emacs

> The question is, for C++ code, how to make Emacs insert tabs for "main
> indentation" and spaces for "sub-indentation". Example: ..

Maybe someone has thought this up before... but if it comes down to
write your own, here's a suggestion.

Tab key runs the c-indent-command in c mode. So, you might define tab
to run my-own-c-indent.  The command will first check if the beginning
of line is a tab. If so, move to the end of white spaces and insert
spaces. If the beginning of line is a not white-space, then your
command can call the c indent command. you might look up the source
code and borrow pieces...

  Xah
∑ http://xahlee.org/

☄

On Jul 17, 5:35 pm, Juanma <juanma_bel...@yahoo.es> 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)
>
> Many thanks.
> --
> Juanma
>
> "Having a smoking section in a restaurant is like
>  having a peeing section in a swimming pool."
>        -- Edward Burr



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: How to whip Emacs into weird indentation rules with tabs+spaces?
  2008-07-18  0:35 Juanma
@ 2008-07-18 16:51 ` Alan Mackenzie
  2008-07-18 21:53   ` Nikolaj Schumacher
  2008-07-19 18:18   ` Juanma
  0 siblings, 2 replies; 7+ messages in thread
From: Alan Mackenzie @ 2008-07-18 16:51 UTC (permalink / raw)
  To: Juanma; +Cc: help-gnu-emacs

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).




^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: How to whip Emacs into weird indentation rules with tabs+spaces?
  2008-07-18 16:51 ` Alan Mackenzie
@ 2008-07-18 21:53   ` Nikolaj Schumacher
  2008-07-19  1:56     ` Juanma
  2008-07-19 18:18   ` Juanma
  1 sibling, 1 reply; 7+ messages in thread
From: Nikolaj Schumacher @ 2008-07-18 21:53 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: help-gnu-emacs

Alan Mackenzie <acm@muc.de> wrote:

> On Fri, Jul 18, 2008 at 02:35:57AM +0200, Juanma wrote:
>
>> |---| = 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)

The way I see it, that would be the only /sane/ way to use tabs at all. :)
Because no matter what tab-width is set to, the code will always look
right...  Unfortunately there's probably not a single editor out there that
supports the scheme, so it's even less portable.

> (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))))))))

Great, but it leaves the point at the beginning of space-only lines.
A quick fix would be to replace the last two lines with this:

(insert-before-markers (make-string (/ anchor-col tab-width) ?\t))
(insert-before-markers (make-string (- indent-col (current-column)) ?\ )))))))


regards,
Nikolaj Schumacher




^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: How to whip Emacs into weird indentation rules with tabs+spaces?
  2008-07-18 21:53   ` Nikolaj Schumacher
@ 2008-07-19  1:56     ` Juanma
  0 siblings, 0 replies; 7+ messages in thread
From: Juanma @ 2008-07-19  1:56 UTC (permalink / raw)
  To: help-gnu-emacs

On Friday 18 July 2008, Nikolaj Schumacher wrote:
> Alan Mackenzie <acm@muc.de> wrote:
> 
> > On Fri, Jul 18, 2008 at 02:35:57AM +0200, Juanma wrote:
> >
> >> |---| = 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)
> 
> The way I see it, that would be the only /sane/ way to use tabs at all. :)
> Because no matter what tab-width is set to, the code will always look
> right...

Well, actually I agree with you. I'd prefer no tabs, but if there are tabs,
this way is the only good one I can think of. But I thought it would be an
eLisp insanity.

> Unfortunately there's probably not a single editor out there that
> supports the scheme, so it's even less portable.

That supports it *automatically*. My colleagues, to whom I owe this
pleasure, use editors that insert actual tab characters when they press TAB
key. Go figure  :-)

Many thanks to everybody for help. I'll try it and tell you how good it is.
-- 
Juanma

"Having a smoking section in a restaurant is like
 having a peeing section in a swimming pool."
       -- Edward Burr







^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: How to whip Emacs into weird indentation rules with tabs+spaces?
  2008-07-18 16:51 ` Alan Mackenzie
  2008-07-18 21:53   ` Nikolaj Schumacher
@ 2008-07-19 18:18   ` Juanma
  2008-07-20 22:13     ` Nikolaj Schumacher
  1 sibling, 1 reply; 7+ messages in thread
From: Juanma @ 2008-07-19 18:18 UTC (permalink / raw)
  To: help-gnu-emacs

On Friday, 18 July 2008 6:51:12 pm Alan wrote:
>  M-: (add-hook 'c-special-indent-hook 'ms-space-for-alignment nil t)

I added that sexp to .emacs and I eveluated it. Then, on failing, I removed
the 4th argument to force the value globally. Nothing changed. The function
is not being called.

I checked the documentation of c-special-indent-hook:
----------------------------------------
c-special-indent-hook is a variable defined in `cc-vars.el'.
Its value is 
(ms-space-for-alignment)
[...] It is only called if `c-syntactic-indentation' is non-nil.
----------------------------------------

So let's see that variable:
----------------------------------------
c-syntactic-indentation is a variable defined in `cc-vars.el'.
Its value is t
----------------------------------------

I instrumented ms-space-for-alignment for Edebug, but it's not being called
at all, either when I press TAB or when I type C-j, or during region
reformatting, or anything. Can anyone figure why?

Best regards,
-- 
Juan

"Having a smoking section in a restaurant is like
 having a peeing section in a swimming pool."
       -- Edward Burr






^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: How to whip Emacs into weird indentation rules with tabs+spaces?
  2008-07-19 18:18   ` Juanma
@ 2008-07-20 22:13     ` Nikolaj Schumacher
  0 siblings, 0 replies; 7+ messages in thread
From: Nikolaj Schumacher @ 2008-07-20 22:13 UTC (permalink / raw)
  To: Yo mismo; +Cc: help-gnu-emacs

Juanma <juanma_bellon@yahoo.es> wrote:

> I instrumented ms-space-for-alignment for Edebug, but it's not being called
> at all, either when I press TAB or when I type C-j, or during region
> reformatting, or anything. Can anyone figure why?

Try instrumenting `c-indent-line'.  That's where the hook should be run.
And check what `indent-line-function' is set to.

regards,
Nikolaj Schumacher




^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2008-07-20 22:13 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <mailman.14916.1216341367.18990.help-gnu-emacs@gnu.org>
2008-07-18 10:04 ` How to whip Emacs into weird indentation rules with tabs+spaces? Xah
2008-07-18  0:35 Juanma
2008-07-18 16:51 ` Alan Mackenzie
2008-07-18 21:53   ` Nikolaj Schumacher
2008-07-19  1:56     ` Juanma
2008-07-19 18:18   ` Juanma
2008-07-20 22:13     ` Nikolaj Schumacher

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).