
On 03/21/2014 08:49 AM, Daniel P. Berrange wrote:
On Fri, Mar 21, 2014 at 08:19:42AM -0600, Eric Blake wrote:
On 03/21/2014 07:11 AM, Ján Tomko wrote:
Indent labels by one space.
Add the rule to HACKING and enforce it by syntax-check. --- Adding a space helps git's function context detection, but the fallout patch is over 800K.
My reasoning for also indenting labels in nested code is that vim's cinoptions don't have a separate option for these labels (or I haven't searched hard enough?).
Alas, I don't know enough on vim to help there.
Okay, I've spent some more time on the emacs side; emacs has the option of a c-label-minimum-indent, but applies it only to top-level labels (and not to nested code labels). Where it gets weird is that c-label-minimum-indent is applied by default only for gnu mode indent, but not other modes. We want libvirt in K&R mode indent. Emacs is customizable, so you can request other indent modes to also use label minimum indent by setting c-special-indent-hook, but as a hook it is deemed dangerous when set via .dir-locals.el and warns the user on every file that you open, making that particular customization harder to set as a project-level default.
This doesn't do what you want; it sounds like you want to require all labels to have (4n+1) spaces, so you want 4n+{0,2,3} to be forbidden.
Emacs does not have an easy way to enforce (4n+1) spaces, only a minimum indent. Furthermore, it is only the top-level labels that interfere with git function locations; so at this point, I'm leaning towards a simpler @prohibit='^[_a-zA-Z0-9]+):$$' and just not worry about nested indent (we have fewer nested labels anyway).
The rest of this makes sense, if I can figure out why my emacs settings aren't doing this already, and if we update .dir-locals.el in the same patch.
FWIW, my emacs is doing the right thing wrt this proposed hacking rule and I don't have any .emacsrc file at all on this machine - just plain default settings.
I found the difference between Dan's setup and mine - in my ~/.emacs, I actually created a new style mode libvirt-c-mode (I created it back in 2010, with Jim Meyering's help, before we had .dir-locals.el). Although my mode and the settings in .dir-locals.el appear identical [basically: (defun libvirt-c-mode () "C mode with adjusted defaults for use with libvirt." (interactive) (c-set-style "K&R") (setq indent-tabs-mode nil) ; indent using spaces, not TABs (setq c-indent-level 4) (setq c-basic-offset 4)) (add-hook 'c-mode-hook '(lambda () (if (string-match "/libvirt" (buffer-file-name)) (libvirt-c-mode)))) ], where it gets different is that c-label-minimum-indent defaults to only applying to gnu style. In creating my own style, I left gnu style, so the minimum no longer applied to me. But adding: (setq c-special-indent-hook c-gnu-impose-minimum) in the list of settings in my mode fixed things so it behaves the way Dan was seeing; as did completely removing my custom mode and instead relying on .dir-locals.el. c-special-indent-hook won't work in .dir-locals.el, but now that I know the cause of the difference and how to work around it on my end, I'm okay if we force a minimum indent. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org