CLion でソースファイル自動生成時に挿入されるコピーライトの表記を変更する

f:id:msh5_h:20180418172739j:plain

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" のテンプレートを元に生成されている。

f:id:msh5_h:20180418155042p:plain

コピーライトもテンプレートの一部

"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

いい感じ。