jeudi 4 novembre 2010

Coder efficacement avec Emacs - Partie 5: Scripts utiles

Ou comment sauver un temps précieux avec quelques fonctions simples. Voici deux scripts glanés ici, adaptés par mes soins, qui facilitent la vie. Ajoutez les à votre .emacs, et voyez si ça vous plaît.

Ce script écrit de lui-même les #ifndef / #define / #endif des fichiers en-tête C et C++, en se basant sur le nom du fichier et du répertoire courant.


(defun headerize ()
"Adds the #define HEADER_H, etc."
(interactive)
(let ((flag-name (replace-regexp-in-string
"[\. \(\)]" "_"
(upcase (file-name-nondirectory (buffer-name)))))
(dir-name (upcase(file-name-nondirectory (directory-file-name(file-name-directory (buffer-file-name)))))))
(goto-char (point-max))
(insert "\n#endif\n")
(goto-char (point-min))
(insert (concat "#ifndef __" dir-name "_" flag-name "__\n"))
(insert (concat "#define __" dir-name "_" flag-name "__\n"))
)
)


Ouvrez un fichier, et tapez M-x headerize. Hop, voilà les en-têtes! Le fichier peut être modifié pour ajouter une mention de copyright, un auteur, etc. C'est toujours ça de moins à taper.

J'adore celui-ci: en pressant la touche F9, l'on passe automatiquement du fichier source au fichier d'en-tête, et réciproquement (à condition que les fichiers aient le même nom et soient dans le même répertoire, c'est pas magique non plus!).


(define-key global-map [f9] 'switch-on-extensions)

(defun rewrite-filename (filename rules)
(if rules (or
(let ((current-rule (car rules)))
(and (string-match (car current-rule) filename)
;; The current rule can be applied, return the
;; modified filename
(let ((name (replace-regexp-in-string
(car current-rule) (cadr current-rule)
filename)))
;; We return the name if either it can be
;; created (the rule has 't' for third value) or
;; if it exists already.
(and (or (cadr (cdr current-rule)) (file-exists-p name))
name))))

;; In any other case, we go on looking for other rules
(rewrite-filename filename (cdr rules)))

(error (concat "No rewriting rule applicable for '" filename "'"))))

(defun switch-on-extensions ()
"Switches to a file whose name is derived from the name of the
current buffer. The rewriting rules are specified in
`switch-on-extensions-rules'."
(interactive)
(if (buffer-file-name)
(find-file (rewrite-filename (buffer-file-name) switch-on-extensions-rules))
(error "No file attached to this buffer!")))

(setq switch-on-extensions-rules '(
("\\.cpp$" ".h" t)
("\\.h$" ".cpp" t)
("\\.cc$" ".h" t)
("\\.h$" ".cc")
("\\.ml$" ".mli" t)
("\\.mli$" ".ml" t)
("" "" )
))

Aucun commentaire: