CLion でソースファイル自動生成時に挿入されるコピーライトの表記を変更する
CLion のデフォルトだと、cpp ファイルを自動生成するとコピーライトがこんなふうに挿入される。 これだと簡素すぎるのとそもそもチームのルールに合わないので、これを社内標準の表記に変えようと思った。
// // Created by 皆川 祥 on 2018/04/18. //
IDEA とは違うのだよ
ググるとこんな IDEA のヘルプが見つかる。 CLion のヘルプはなぜかヒットしないので、とりあえずこれを読んでみる。
Copyright - Help | IntelliJ IDEA
"File | Settings | Editor | Copyright" 設定から変更できるということが書かれている。 ただし、CLion には該当の設定項目がないので、残念ながらこの手順では変更できない。
ソースファイル自動生成の仕組み
CLion を始めとする IntelliJ 系 IDE では、Apache Velocity と呼ばれるテンプレートエンジンが採用されている。 IDE は Velocity エンジンと自動生成用のテンプレートを使って、ソースファイルを生成している。 どの種類のソースファイルがどのテンプレートを元に生成されるかは、 "File | Settings | Editor | Files and Code Templates" から参照できる。 例えば、C のヘッダファイルは "C Header File"、 C のソースファイルは "C Source File" のテンプレートを元に生成されている。
コピーライトもテンプレートの一部
"C Header File" テンプレートをみてみると、parse という見慣れない構文とインクルードガードを挿入しようとしているのがわかる。
#parse("C File Header.h") #[[#ifndef]]# ${INCLUDE_GUARD} #[[#define]]# ${INCLUDE_GUARD} #[[#endif]]# //${INCLUDE_GUARD}
使われているテンプレートエンジンはVelocity なので、構文がわからないときは Velocity のユーザガイドを見ればよい。
Apache Velocity Engine - User Guide
parse 文についてだけども、これは別のテンプレートをインポートするためのものである。 "import" という名前でないのはよくわからないけど、include 文との区別をつきやすくするためじゃないかと推測している。 それはさておき、先の例では parse 文の引数に "C File Header.h" が与えられていて、この名前の別のテンプレートをインポートしている。 そして、Includes タブに切り替えると、"C File Header" という近い名前のものがみつかる。 ".h" がついていないが、これは脳内補完してしまっていいようだ。 "C File Header(.h)" テンプレートをみると、デフォルトのコピーライトの表記がハードコードしてあるのが見つかるだろう。
#if ($HEADER_COMMENTS) // // Created by $USER_NAME on ${DATE}. #if ($ORGANIZATION_NAME && $ORGANIZATION_NAME != "") // Copyright (c) $YEAR ${ORGANIZATION_NAME}#if (!$ORGANIZATION_NAME.endsWith(".")).#end All rights reserved. #end // #end
コピーライトを独立したテンプレートとして管理する
この "C File Header" に直接コピーライトの文面を書き込んでもいいんだけど、 再利用性を考えて、コピーライト用のテンプレート "Copyright" を作成してそれを "C File Header" 上で展開してみようと思う。
テンプレートを新規作成して、"Copyright" という名前にする。 Extension がデフォルトだと "cpp" なので "h" に変更しておく。
/* * Copyright (c) $YEAR ... All rights reserved. * ... */
YEAR 変数はテンプレート生成時に、現在年へと置き換えられる。 他にも使える変数がいろいろあって、これは CLion のヘルプに載っている。
File Template Variables - Help | CLion
続いて "C File Header" を書き換えて、 "Copyright" テンプレートをインポートするようにする。 デフォルトを消してしまうのにためらいがあるものの、 残しておくほど出来のいいものでもないので「えいやっ」で消してしまう。
#if ($HEADER_COMMENTS) #parse("Copyright.h") #end
準備完了、"New | C/C++ Source File" する。
/* * Copyright (c) 2018 ... All rights reserved. * ... */ #ifndef _TEST_H #define _TEST_H #endif //_TEST_H
できた!めでたしめでたし。
番外編:お手軽にコピーライトをまともにする
"C File Header" の1行目で ORGANIZATION_NAME 変数を設定する。 これによって、途中の #if ~ #end で囲まれた Copyright 表記が有効になる。
#set($ORGANIZATION_NAME = "CTOになるまで続けるブログ") #if ($HEADER_COMMENTS) // // Created by $USER_NAME on ${DATE}. #if ($ORGANIZATION_NAME && $ORGANIZATION_NAME != "") // Copyright (c) $YEAR ${ORGANIZATION_NAME}#if (!$ORGANIZATION_NAME.endsWith(".")).#end All rights reserved. #end // #end
準備完了、"New | C/C++ Source File" する。
// // Created by 皆川 祥 on 2018/04/18. // Copyright (c) 2018 CTOになるまで続けるブログ. All rights reserved. // #ifndef _TEST_H #define _TEST_H #endif //_TEST_H
いい感じ。