在 Apache Velocity 模板语言中获取文件目录

Get file directory in Apache Velocity Template Language

CLion 使用 Apache 的 Velocity 模板语言 (VTL) 为 C++ 和 C 文件创建模板。 在 CLion 的帮助 (https://www.jetbrains.com/help/clion/file-template-variables.html) 中列出了一堆可以使用的变量。

但是我想知道,是否可以在我的模板之一中使用创建 C++ 文件的目录作为变量? 我问这个是因为我喜欢以 java/package-type 的方式构建我的源文件。

"Utils" 目录中的所有文件都是 "Utils" 命名空间的一部分,"Ui" 目录中的所有包都是 "Ui" 命名空间的一部分等等...

所以我想知道是否有任何方法可以获取文件的父目录以便在模板中使用它? (也许通过在我的 CMakeLists.txt 中设置一个变量?)

这是我想要实现的示例

#parse("C File Header.h")
#[[#ifndef]]# ${INCLUDE_GUARD}
#[[#define]]# ${INCLUDE_GUARD}

${NAMESPACES_OPEN}
namespace ${CWD}

class ${NAME}
{

};

${NAMESPACES_CLOSE}

#[[#endif]]# //${INCLUDE_GUARD}

其中 ${CWD} 表示文件所在的文件夹。

${NAMESPACE_OPEN}${NAMESPACE_CLOSE} 指令似乎对 CLion 来说纯粹是象征性的,他们的网站将其列为 "indicates the beginning/end of a namespace block created during refactoring."

我很高兴地宣布此问题已在 CLion 2019.1

中修复

通过 File -> Settings -> Editor -> Code Style -> C/C++ -> Naming Conventions 用户可以使用一些额外的变量 ${PROJECT_REL_PATH}${FILE_NAME}${EXT}.

使用它时,请务必同时检查 File -> Settings -> Editor -> File and Code Templates。可以使用 ${INCLUDE_GUARD} 变量在此处访问您之前定义的包含防护。

这里有一个示例项目和配置来说明:

File -> Settings -> Editor -> File and Code Templates:

#parse("C File Header.h")
#[[#ifndef]]# ${INCLUDE_GUARD}
#[[#define]]# ${INCLUDE_GUARD}

${NAMESPACES_OPEN}

class ${NAME} {

};

${NAMESPACES_CLOSE}

#[[#endif]]# //${INCLUDE_GUARD}

File -> Settings -> Editor -> Code Style -> C/C++ -> Naming Conventions:

${PROJECT_REL_PATH}_${FILE_NAME}_${EXT}

项目结构:

Project
├── CMakeLists.txt
├── cpp
│   ├── Test2.cpp
│   └── Test2.hpp
├── main.cpp
├── Test.cpp
└── Test.hpp

这给出了一个看起来像这样的 "Test.hpp":

//
// Created by user on 4/15/19.
//

#ifndef _TEST_HPP
#define _TEST_HPP


class test
{

};


#endif //_TEST_HPP

和 Test2.hpp 的:

//
// Created by user on 4/15/19.
//

#ifndef CPP_TEST2_HPP
#define CPP_TEST2_HPP


class test2
{

};


#endif //CPP_TEST2_HPP