highlight

2016年3月10日木曜日

include guard 用文字列を uuid にして elisp で自動挿入

OSDN の wordpress にお世話になってたが、highlight.js の使い方がわからず、こっちに移行しようと思う。 highlight のテストがてら、あちらでの投稿をこちらに再投稿する。

boost のヘッダファイルを見ていると、include guard 用のシンボルが UUID_xxxxx... という感じにしてあるのに気づいた。 なるほど。これは確かに uuid を使った方が #define [ファイル名] なんかよりも合理的に思える。 これは真似したいなと思うが、ヘッダファイルを新規作成する度に、uuidgen した文字列を sed s/-/_/g してコピーしてソースに貼り付け、とか考えると明らかに面倒だ。 じゃあ、emacs lisp で自動化してやろうか、と思って書いたのが以下の lisp コード。

boost のヘッダファイルを見ていると、include guard 用のシンボルが UUID_xxxxx... という感じにしてあるのに気づいた。 なるほど。これは確かに uuid を使った方が #define [ファイル名] なんかよりも合理的に思える。 これは真似したいなと思うが、ヘッダファイルを新規作成する度に、uuidgen した文字列を sed s/-/_/g してコピーしてソースに貼り付け、とか考えると明らかに面倒だ。 じゃあ、emacs lisp で自動化してやろうか、と思って書いたのが以下の lisp コード。


(defun insert-random-uuid ()
 (interactive)
 "Inserts a UUID string suitable to CPP identifier"
 (shell-command "echo UUID_$(uuidgen | tr a-z\- A-Z\_)" t))

(defun insert-include-guard ()
 (interactive)
 "Inserts C/C++ header include guard."
 (progn
  (insert "#if !defined(")
  (insert-random-uuid)
  (let (p1 p2)
   (setq p1 (point))
   (end-of-line)
   (setq p2 (point))
   (kill-ring-save p1 p2))
  (insert ")\n#define ")
  (yank)
  (insert "\n#endif /* ")
  (yank)
  (insert " */")
  (beginning-of-line)
  (open-line 3)
  (forward-line)
  ))

これが eval された後、emacs で M-x insert-include-guard すると、


#if !defined(UUID_364889E3_11A2_493E_B861_5C20F63968D8)
#define UUID_364889E3_11A2_493E_B861_5C20F63968D8

#endif /* UUID_364889E3_11A2_493E_B861_5C20F63968D8 */

というような感じのテキストが自動挿入される。

2 件のコメント:

  1. 尤も、c++11 以降なら、#pragma once で事足りる。

    返信削除
  2. コンパイルすると、以下の様な warning が出るようになったので、仰せの通りに forward-line に変更した。

    In insert-include-guard:
    05-misc.el:33:6:Warning: `next-line' is for interactive use only; use
    `forward-line' instead.

    返信削除

スパムフィルタが機能しないようなので、コメント不可にしました。

注: コメントを投稿できるのは、このブログのメンバーだけです。