unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Re: Supporting tabs for indentation, spaces for alignment
@ 2019-04-11  9:02 Alan Mackenzie
  2019-04-11 10:24 ` Ergus
  0 siblings, 1 reply; 8+ messages in thread
From: Alan Mackenzie @ 2019-04-11  9:02 UTC (permalink / raw)
  To: Ergus; +Cc: emacs-devel

Hello again, Ergus.

You were asking in your post Subject: Re: C style alist question? for a
way of indenting CC Mode modes with "tabs for indentation and spaces for
alignment."

The topic has come up before, and I answered back in 2008 with the
following post to the OP and bug-cc-mode@gnu.org.  It's a bit wordy, I
admit, but does provide a way of getting what you're asking for.  I
admit not having tried it out recently.

-- 
Alan Mackenzie (Nuremberg, Germany).


----- Forwarded message from Alan Mackenzie <acm@muc.de> -----

X-Spam-Checker-Version: SpamAssassin 3.2.0 (2007-05-01) on colin2.muc.de
X-Spam-Level: 
X-Spam-Status: No, score=0.1 required=5.0 tests=AWL,BAYES_50 autolearn=no version=3.2.0
Date: Fri, 11 Apr 2008 20:31:42 +0000
To: Mike Sullivan <msully4321@gmail.com>
Subject: Re: Supporting tabs for indentation, spaces for alignment
X-Delivery-Agent: TMDA/1.1.5 (Fettercairn)
From: Alan Mackenzie <acm@muc.de>
X-Primary-Address: acm@muc.de
X-detected-kernel: by monty-python.gnu.org: FreeBSD 4.6-4.9
Cc: bug-cc-mode@gnu.org
X-BeenThere: cc-mode-help@lists.sourceforge.net
X-Mailman-Version: 2.1.8
Reply-To: bug-cc-mode@gnu.org
List-Id: "Bug reports, feature requests, and general talk about CC Mode." <cc-mode-help.lists.sourceforge.net>
List-Unsubscribe: <https://lists.sourceforge.net/lists/listinfo/cc-mode-help>,  <mailto:cc-mode-help-request@lists.sourceforge.net?subject=unsubscribe>
List-Archive: <http://sourceforge.net/mailarchive/forum.php?forum_name=cc-mode-help>
List-Post: <mailto:cc-mode-help@lists.sourceforge.net>
List-Help: <mailto:cc-mode-help-request@lists.sourceforge.net?subject=help>
List-Subscribe: <https://lists.sourceforge.net/lists/listinfo/cc-mode-help>, <mailto:cc-mode-help-request@lists.sourceforge.net?subject=subscribe>

Hi, Mike,

Sorry it's taken me so long to answer.

On Wed, Jan 09, 2008 at 02:04:40AM -0600, Mike Sullivan wrote:
> Currently, cc-mode offers no simple way to use tabs for indentation,
> but spaces for alignment (as described many places on the web,
> including http://wiki.chad.org/wiki?IndentationUsingTabs).  Is there
> any chance that this will be added as a feature in a future version?
 
OK: Here's what I think that page means.  Supposing your tab-width is 8,
in

{
        if (a really long conditional that won't fit
            onto one line) { ....
	....
	}
}

, you want (I think), tabs here:
tttttttt
, yet spaces here:
        ....

If your tab-width were 2, you'd want to see this:

{
  if (a really long conditional that won't fit
      onto one line) { ....
  ....
  }
}

, with tabs here:
tt
, and spaces here:
  ....

.

Currently, assuming indent-tabs-mode is set, with a sufficiently large
tab-width (say, 8), this is what you'll get, but with a smaller
tab-width (2), the four spaces will be replaced by two tabs, not what
you want.

No, there are no plans for putting such a feature into CC Mode at the
moment.  One could opine that the opinions on that web page are somewhat
opinionated, capable of triggering religious wars.  ;-)  My own view is
that that indentation strategy would be a right royal pain, unless it
somehow got enforced 100% by the project's management and _every_ editor
in use supported it.  To implement the idea "properly" in CC Mode would
entail a non-trivial amount of work.

However, this is the sort of thing that seems tailor-made for
c-special-indent-hook (see page "Other Indentation" in the CC Mode
manual), and shows just how flexible Emacs (in general) and CC Mode (in
particular) are, and just how superior they are to lesser editors.  ;-)

I've written a quick hack, to give you an idea how this sort of thing
could work.  Here's the source file I tried it on, _without_ tabs here
(it goes more easily into an email that way), with c-basic-offset = 3:


int foo (char a, char b, char c, char d, char e,
         char f, char g) {
   if (a = 'a'
       && b = 'b'
       && c = 'c')
      {
      print "hi!\n" ;
      return 0 ;
      }
   return 1 ;
}


As a quick tip, to _see_ tabs in a buffer, do M-x hi-lock-mode, then C-x
w h.  On being prompted for a regexp just do C-q <tab> <CR>, then select
some highlighting face.

OK, here's the hack:

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

    M-: (setq indent-tabs-mode t)
    M-: (setq tab-width 3)
    M-: (setq c-basic-offset tab-width)
    (add-hook 'c-special-indent-hook 'ms-space-for-alignment nil t)


If you were to develop this hack into fully working code, I would be
willing to put it into the next full version of CC Mode (subject to the
customary copyright assignment to the FSF, which we all have to do).


> Thanks, Mike Sullivan

Happy hacking!

-- 
Alan Mackenzie (Nuremberg, Germany).

-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
Don't miss this year's exciting event. There's still time to save $100. 
Use priority code J8TL2D2. 
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone

----- End forwarded message -----



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

end of thread, other threads:[~2019-04-13 15:56 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-04-11  9:02 Supporting tabs for indentation, spaces for alignment Alan Mackenzie
2019-04-11 10:24 ` Ergus
2019-04-11 13:29   ` Eli Zaretskii
2019-04-11 14:43     ` Ergus
2019-04-12 15:54   ` Alan Mackenzie
2019-04-12 17:00     ` Ergus
     [not found]     ` <b483d42ddde945b3a479800566aa257c@lanl.gov>
2019-04-13 13:54       ` Alan Mackenzie
2019-04-13 15:56         ` Ergus

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

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