Jan Misol wrote:
[...]
c-x c-f test.h
should automatically insert:
#ifndef _TEST_H_
#ifndef _TEST_H_
#endif
[...]
(defun new-c-header ()
"Insert c-header skeleton."
(interactive "")
(progn
(setq bname (upcase(buffer-name)))
(insert
(message "#ifndef %s\n\#define %s\n\n#endif"
bname bname))))
Apart from knowing that "message" might not be the right
choice here, I don't know how to modify the value of bname!?
"replace-regexp" doesn't seem to be the what I'm looking for.
Well, how about using `file-name-sans-extension' to strip the
trailing .h, and then insert using `format'.
(defun my-new-c-header ()
(interactive)
(let ((name (upcase (file-name-sans-extension (buffer-file-name)))))
;; Only insert if _name_H isn't already defined.
(unless (save-excursion
(goto-char (point-min))
(search-forward (format "#ifndef _%s_H" name))
(insert (format "#ifndef _%s_H\n#define _%s_H\n\n#endif"))))))
(and how could the new-c-header() be invoked by creating a
new .h/.cpp file?)
You could then either add this as a hook to `c-mode-hook' or
`find-file-hooks'. In the case of the latter, you'd want to
predicate it on being a header file. In fact, you'd want to do
the same for the former too.
You could do this by adding an extra test to the `unless' form
in the above function.
say:
(unless (and (string-match "\\.h") (buffer-file-name)
...)
...)
Slightly orthogonal to all this, you may find reading the Emacs
Lisp Introduction enlightening.
Alternately, instead of trying to roll your own function, it may
well be that Emacs already has the functionality you need
built-in. See the info node "autotype", in Emacs, you can get
there via C-h i d m Autotype RET.
Hope some of this helps.