* 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 How to whip Emacs into weird indentation rules with tabs+spaces? 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 --
2008-07-18 0:35 How to whip Emacs into weird indentation rules with tabs+spaces? 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
[not found] <mailman.14916.1216341367.18990.help-gnu-emacs@gnu.org>
2008-07-18 10:04 ` Xah
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).