1 ;; $NetBSD: NetBSD.el,v 1.6 2009/02/16 21:37:12 uwe Exp $
3 (defconst netbsd-knf-style
5 ;; (c-auto-newline . nil)
6 ;; default indentation level
8 ;; in which column to add backslashes when macroizing a region
9 (c-backslash-column .
78)
10 (c-backslash-max-column .
78)
11 ;; automatically compact brace-else(if)-brace on one line and
12 ;; semi-colon after closing struct brace
13 (c-cleanup-list .
(brace-else-brace
16 ;; do not indent lines containing only start-of-comment more than default
17 (c-comment-only-line-offset .
0)
18 ;; start new lines after braces
19 ;; default is: before and after (for all other cases)
20 (c-hanging-braces-alist .
((defun-open .
(before after
))
21 (defun-close .
(before after
))
22 (block-open .
(after))
23 (block-close . c-snug-do-while
)
24 (substatement-open . after
)
25 (statement-case-open . nil
)
26 (brace-list-open . after
)
27 (brace-list-close . nil
)
29 ;; where to put newlines around colons
30 (c-hanging-colons-alist .
(quote ((label after
)
32 ;; indent comments syntactically
33 (c-indent-comments-syntactically-p . t
)
34 ;; no spaces needed before a label
35 ;; (c-label-minimum-indentation . 0)
36 ;; define offsets for some code parts
37 (c-offsets-alist .
((arglist-cont-nonempty .
4)
41 (brace-list-intro .
+)
42 (brace-list-entry .
0)
43 (brace-list-close .
0)
45 (knr-argdecl-intro .
+)
47 (member-init-intro .
++)
49 (substatement-open .
0)
51 ;; XXX: undocumented. Recognize KNR style?
52 (c-recognize-knr-p . t
)
53 ;; indent line when pressing tab, instead of a plain tab character
54 (c-tab-always-indent . t
)
55 ;; use TABs for indentation, not spaces
56 (indent-tabs-mode . t
)
57 ;; set default tab width to 8
62 (eval-when-compile (require 'whitespace nil t
))
64 (defcustom netbsd-knf-whitespace-check nil
65 "Enable NetBSD KNF whitespace cleanup when saving the buffer.
67 `whitespace-auto-cleanup',
68 `whitespace-abort-on-error',
69 `whitespace-check-leading-whitespace',
70 `whitespace-check-trailing-whitespace',
71 `whitespace-check-spacetab-whitespace',
72 `whitespace-check-indent-whitespace',
73 `whitespace-check-ateol-whitespace'.
75 1) `whitespace-check-spacetab-whitespace' will replace any RE-match of
76 \" +\\t\" with single '\\t' and hence may break tabbing.
77 2) Both `whitespace-check-spacetab-whitespace' and
78 `whitespace-check-indent-whitespace' may alter strings."
82 (defun netbsd-knf-whitespace-cleanup ()
83 ;; XXX - emacs 21.4 whitespace.el was badly behaved on blank
84 ;; buffers. This was fixed in 22.1. I don't know about other
85 ;; versions, so these conditions may need to be more restrictive.
86 (cond ((> emacs-major-version
21)
87 (whitespace-cleanup-internal))
90 (goto-char (point-min))
91 (re-search-forward "[^ \t\n]" nil t
))
93 (delete-region (point-min) (point-max))))))
95 (defun netbsd-knf-write-contents-hook ()
96 (if (and (string-equal c-indentation-style
"netbsd knf")
97 (require 'whitespace nil t
))
98 (if netbsd-knf-whitespace-check
99 (if whitespace-auto-cleanup
100 (netbsd-knf-whitespace-cleanup)
101 (if (and (whitespace-buffer) whitespace-abort-on-error
)
102 (error (concat "Abort write due to whitespaces in "
103 buffer-file-name
)))))
104 (remove-hook 'write-contents-hook
'netbsd-knf-write-contents-hook
))
107 (defun netbsd-knf-c-mode-hook ()
108 ;; Add style and set it for current buffer
109 (c-add-style "NetBSD KNF" netbsd-knf-style t
)
110 ;; useful, but not necessary for the mode
111 ;; give syntactic information in message buffer
112 ;;(setq c-echo-syntactic-information-p t)
113 ;; automatic newlines after special characters
114 (setq c-toggle-auto-state
1)
115 ;; delete all connected whitespace when pressing delete
116 (setq c-toggle-hungry-state
1)
117 ;; auto-indent new lines
118 (define-key c-mode-base-map
"\C-m" 'newline-and-indent
)
119 ;; check/cleanup whitespace when saving
120 (add-hook 'write-contents-hooks
'netbsd-knf-write-contents-hook
))
122 (add-hook 'c-mode-hook
'netbsd-knf-c-mode-hook
)