documentation: update CodingStyle tips for Emacs users
PATCH 1/1 documentation: update CodingStyle tips for Emacs users
Describe a setup that integrates better with Emacs' cc-mode and also fixes up the alignment of continuation lines to really only use tabs.
---
Sorry, forgot linux-kernel on first send.
Documentation/CodingStyle +23 -19
@@ -474,25 +474,29 @@ make a good program). So, you can either get rid of GNU emacs, or change it to use saner values. To do the latter, you can stick the following in your .emacs file: -(defun linux-c-mode () - "C mode with adjusted defaults for use with the Linux kernel." - (interactive) - (c-mode) - (c-set-style "K&R") - (setq tab-width 8) - (setq indent-tabs-mode t) - (setq c-basic-offset 8)) - -This will define the M-x linux-c-mode command. When hacking on a -module, if you put the string -*- linux-c -*- somewhere on the first -two lines, this mode will be automatically invoked. Also, you may want -to add - -(setq auto-mode-alist (cons '("/usr/src/linux.*/.*\\.[ch]$" . linux-c-mode) - auto-mode-alist)) - -to your .emacs file if you want to have linux-c-mode switched on -automagically when you edit source files under /usr/src/linux. +(defun c-lineup-arglist-tabs-only (ignored) + "Line up argument lists by tabs, not spaces" + (let* ((anchor (c-langelem-pos c-syntactic-element)) + (column (c-langelem-2nd-pos c-syntactic-element)) + (offset (- (1+ column) anchor)) + (steps (floor offset c-basic-offset))) + (* (max steps 1) + c-basic-offset))) + +(add-hook 'c-mode-hook + (lambda () + (let ((filename (buffer-file-name))) + ;; Enable kernel mode for the appropriate files + (when (and file + (string-match "/usr/src/linux" filename)) + (setq indent-tabs-mode t) + (c-set-style "linux") + (c-set-offset 'arglist-cont-nonempty + '(c-lineup-gcc-asm-reg + c-lineup-arglist-tabs-only)))))) + +This will make emacs go better with the kernel coding style for C +files in /usr/src/linux. But even if you fail in getting emacs to do sane formatting, not everything is lost: use "indent".
Jonathan Corbet
maintainerDocumentation/CodingStyle make a good program). · line 491
Quoted 6 lines · On Fri, 04 Jul 2008 19:52:16 +0200 Johannes Weiner <[email protected]> wrote:
Documentation/CodingStyle +6
-0+(add-hook 'c-mode-hook + (lambda () + (let ((filename (buffer-file-name))) + ;; Enable kernel mode for the appropriate files + (when (and file + (string-match "/usr/src/linux" filename))
Shouldn't that be "(and filename ..." rather than "file"?
A test for /usr/src/linux seems misplaced, though; I don't think a whole lot of people keep their kernel trees there anymore. There must be a better heuristic one can use to figure out whether a kernel source file is being edited.
jon
Hi,
Quoted 11 lines · Jonathan Corbet
Documentation/CodingStyle make a good program). · line 491
Quoted 6 lines · On Fri, 04 Jul 2008 19:52:16 +0200 Johannes Weiner <[email protected]> wrote:
Documentation/CodingStyle +6
-0+(add-hook 'c-mode-hook + (lambda () + (let ((filename (buffer-file-name))) + ;; Enable kernel mode for the appropriate files + (when (and file + (string-match "/usr/src/linux" filename))Shouldn't that be "(and filename ..." rather than "file"?
Whoops, you are right.
Quoted 4 lines
A test for
/usr/src/linuxseems misplaced, though; I don't think a whole lot of people keep their kernel trees there anymore. There must be a better heuristic one can use to figure out whether a kernel source file is being edited.
Is this really needed? I think most people have their kernel trees in one directory and I used /usr/src/linux explicitely because it is so well known and whoever reads this snippet knows what to substitute it for.
But perhaps it should be "~/src/linux-trees/" to emphasize that it it matches everything descendant from this directory.
A heuristics seems overkill as this snippet is not distributed code that needs to be portable but it is just a tip for ones .emacs. I don't want heuristics in my .emacs if I know exactly where my kernel trees are.
But then, we should remove the check for linux-files completely and make people use this coding style for every code they write ;)
Hannes
Jonathan Corbet
maintainerQuoted 2 lines · On Sat, 05 Jul 2008 11:36:44 +0000 Johannes Weiner <[email protected]> wrote:
A heuristics seems overkill as this snippet is not distributed code that needs to be portable but it is just a tip for ones .emacs.
You're right, it's fine the way it is.
jon
PATCH 1/1 documentation: update CodingStyle tips for Emacs users v2
Hi,
Quoted 7 lines · Jonathan Corbet
Quoted 2 lines · On Sat, 05 Jul 2008 11:36:44 +0000 Johannes Weiner <[email protected]> wrote:
A heuristics seems overkill as this snippet is not distributed code that needs to be portable but it is just a tip for ones .emacs.
You're right, it's fine the way it is.
Okay, I fixed the file->filename mistake. How about the following?
Hannes
---
From: Johannes Weiner <[email protected]>
Subject: documentation: update CodingStyle tips for Emacs users
Describe a setup that integrates better with Emacs' cc-mode and also fixes up the alignment of continuation lines to really only use tabs.
---
Documentation/CodingStyle +23 -19
@@ -474,25 +474,29 @@ make a good program). So, you can either get rid of GNU emacs, or change it to use saner values. To do the latter, you can stick the following in your .emacs file: -(defun linux-c-mode () - "C mode with adjusted defaults for use with the Linux kernel." - (interactive) - (c-mode) - (c-set-style "K&R") - (setq tab-width 8) - (setq indent-tabs-mode t) - (setq c-basic-offset 8)) - -This will define the M-x linux-c-mode command. When hacking on a -module, if you put the string -*- linux-c -*- somewhere on the first -two lines, this mode will be automatically invoked. Also, you may want -to add - -(setq auto-mode-alist (cons '("/usr/src/linux.*/.*\\.[ch]$" . linux-c-mode) - auto-mode-alist)) - -to your .emacs file if you want to have linux-c-mode switched on -automagically when you edit source files under /usr/src/linux. +(defun c-lineup-arglist-tabs-only (ignored) + "Line up argument lists by tabs, not spaces" + (let* ((anchor (c-langelem-pos c-syntactic-element)) + (column (c-langelem-2nd-pos c-syntactic-element)) + (offset (- (1+ column) anchor)) + (steps (floor offset c-basic-offset))) + (* (max steps 1) + c-basic-offset))) + +(add-hook 'c-mode-hook + (lambda () + (let ((filename (buffer-file-name))) + ;; Enable kernel mode for the appropriate files + (when (and filename + (string-match "~/src/linux-trees" filename)) + (setq indent-tabs-mode t) + (c-set-style "linux") + (c-set-offset 'arglist-cont-nonempty + '(c-lineup-gcc-asm-reg + c-lineup-arglist-tabs-only)))))) + +This will make emacs go better with the kernel coding style for C +files below ~/src/linux-trees. But even if you fail in getting emacs to do sane formatting, not everything is lost: use "indent".
Quoted 2 lines · Johannes Weiner
Describe a setup that integrates better with Emacs' cc-mode and also fixes up the alignment of continuation lines to really only use tabs.
[...]
Quoted 10 lines
Documentation/CodingStyle +10
-0+(defun c-lineup-arglist-tabs-only (ignored) + "Line up argument lists by tabs, not spaces" + (let* ((anchor (c-langelem-pos c-syntactic-element)) + (column (c-langelem-2nd-pos c-syntactic-element)) + (offset (- (1+ column) anchor)) + (steps (floor offset c-basic-offset))) + (* (max steps 1) + c-basic-offset))) + +(add-hook 'c-mode-hook
Documentation/CodingStyle make a good program). · line 496
Quoted 10 lines
Documentation/CodingStyle +10
-0+ (lambda () + (let ((filename (buffer-file-name))) + ;; Enable kernel mode for the appropriate files + (when (and file + (string-match "/usr/src/linux" filename)) + (setq indent-tabs-mode t) + (c-set-style "linux") + (c-set-offset 'arglist-cont-nonempty + '(c-lineup-gcc-asm-reg + c-lineup-arglist-tabs-only))))))
When starting writing kernel source code last year (the hardware time stamping patch) I used this macro to format it. I very much liked the possibility to only switch on Linux style when editing Linux code (because I work on a variety of code bases with different formatting).
But the macro above did not produce the result expected by some patch reviewers (John Stultz, Dave Miller). I had to redo the formatting manually.
The sticky point is continuation after splitting a long parameter list - in other words, exactly what the "arglist-cont-nonempty" setting above changes. The macro formats it so that the continuation is aligned at the tab that is closest to the initial argument in the previous line:
int a_very_long_function_name(int arg1, char *arg2,
double arg3);
The expected style was tab plus spaces to align with the first argument:
int a_very_long_function_name(int arg1, char *arg2,
double arg3);
Is this a bug in the macro? I'm using emacs 22.1.1, in case that matters. Or are there different opinions in the Linux developer community about the right formatting?
Signature · 6 lines
Best Regards, Patrick Ohly The content of this message is my personal opinion only and although I am an employee of Intel, the statements I make here in no way represent Intel's position on the issue, nor am I authorized to speak on behalf of Intel on this matter.
Quoted 42 lines · Patrick Ohly
Quoted 2 lines · Johannes Weiner
Describe a setup that integrates better with Emacs' cc-mode and also fixes up the alignment of continuation lines to really only use tabs.
[...]
Quoted 10 lines
Documentation/CodingStyle +10
-0+(defun c-lineup-arglist-tabs-only (ignored) + "Line up argument lists by tabs, not spaces" + (let* ((anchor (c-langelem-pos c-syntactic-element)) + (column (c-langelem-2nd-pos c-syntactic-element)) + (offset (- (1+ column) anchor)) + (steps (floor offset c-basic-offset))) + (* (max steps 1) + c-basic-offset))) + +(add-hook 'c-mode-hookDocumentation/CodingStyle make a good program). · line 496
Quoted 10 lines
Documentation/CodingStyle +10
-0+ (lambda () + (let ((filename (buffer-file-name))) + ;; Enable kernel mode for the appropriate files + (when (and file + (string-match "/usr/src/linux" filename)) + (setq indent-tabs-mode t) + (c-set-style "linux") + (c-set-offset 'arglist-cont-nonempty + '(c-lineup-gcc-asm-reg + c-lineup-arglist-tabs-only))))))When starting writing kernel source code last year (the hardware time stamping patch) I used this macro to format it. I very much liked the possibility to only switch on Linux style when editing Linux code (because I work on a variety of code bases with different formatting).
But the macro above did not produce the result expected by some patch reviewers (John Stultz, Dave Miller). I had to redo the formatting manually.
The sticky point is continuation after splitting a long parameter list - in other words, exactly what the "arglist-cont-nonempty" setting above changes. The macro formats it so that the continuation is aligned at the tab that is closest to the initial argument in the previous line:
int a_very_long_function_name(int arg1, char *arg2,
double arg3);
Quoted 8 lines
The expected style was tab plus spaces to align with the first argument:
int a_very_long_function_name(int arg1, char *arg2,
double arg3);Is this a bug in the macro? I'm using emacs 22.1.1, in case that matters. Or are there different opinions in the Linux developer community about the right formatting?
Unfortunately, this seems to depend on the maintainer. Both styles are used all over the kernel but Documentation/CodingStyle and scripts/checkpatch.pl prefer what the above emacs configuration does.
I doubt that people do tab tab tab space space space space space by hand, so I strongly suspect that the tab-only zealots don't use emacs which does this adjustment automatically.
You should probably add linux-davem to the above or something. Or name the coding style after the text-editor the target maintainer uses :-)
Hannes
On Wed, 2009-02-18 at 09:59 +0000, Johannes Weiner wrote:
[formatting of line continuation in argument list]
Quoted 3 lines
Unfortunately, this seems to depend on the maintainer. Both styles are used all over the kernel but
Documentation/CodingStyleandscripts/checkpatch.plprefer what the above emacs configuration does.
checkpatch.pl didn't seem to mind either way. I haven't seen this particular aspect mentioned in the CodingStyle either.
Quoted 7 lines
I doubt that people do tab tab tab space space space space space by hand, so I strongly suspect that the tab-only zealots don't use emacs which does this adjustment automatically.
You should probably add linux-davem to the above or something. Or name the coding style after the text-editor the target maintainer uses :-)
One could also get really fancy and extend the path matching to pick the right style depending on the subdirectory ;-)
Thanks for the clarification. In the future I'll pay closer attention to existing code and turn the macro on or off accordingly.
Signature · 6 lines
Best Regards, Patrick Ohly The content of this message is my personal opinion only and although I am an employee of Intel, the statements I make here in no way represent Intel's position on the issue, nor am I authorized to speak on behalf of Intel on this matter.
Quoted 8 lines · Patrick Ohly
On Wed, 2009-02-18 at 09:59 +0000, Johannes Weiner wrote:
[formatting of line continuation in argument list]Quoted 3 lines
Unfortunately, this seems to depend on the maintainer. Both styles are used all over the kernel but
Documentation/CodingStyleandscripts/checkpatch.plprefer what the above emacs configuration does.checkpatch.pl didn't seem to mind either way. I haven't seen this particular aspect mentioned in the CodingStyle either.
This is from CodingStyle:
Outside of comments, documentation and except in Kconfig, spaces are never used for indentation, and the above example is deliberately broken.
Quoted 8 lines
Quoted 7 lines
I doubt that people do tab tab tab space space space space space by hand, so I strongly suspect that the tab-only zealots don't use emacs which does this adjustment automatically.
You should probably add linux-davem to the above or something. Or name the coding style after the text-editor the target maintainer uses :-)
Quoted 5 lines
One could also get really fancy and extend the path matching to pick the right style depending on the subdirectory ;-)
Thanks for the clarification. In the future I'll pay closer attention to existing code and turn the macro on or off accordingly.
That's probably the best way to judge such details, agreed. Integrate well with the surrounding code.
Hannes