我经常使用 Mako 模板 在我的项目中自动编写重复的 C++ 代码,例如大型 switch 语句和测试代码。
Mako 是一种与原始 C++ 代码混合的嵌入式语言。从功能的角度来看,它确实工作得很好,在许多情况下,它是 C++ 预处理器和 C++ 模板化系统的一种更好的替代品。
但是突出显示是一个问题。假设我有一个源代码
switch_table.cpp
,我想用 Mako 实现自动化,如下图所示。以百分比%
标记开头的线是Mako线。在这种特殊情况下,他们做了一个简单的循环,生成 N 个 switch case 语句。
您可以看到波浪线指向 Mako 行,因为它们不是有效的 C++ 代码。这很麻烦。
如果我将文件名切换为将 Mako 扩展名为
switch_table.mako
,我会正确突出显示 Mako 行,但不是 C++ 行,大多数都是。更糟。
我现在的问题是——我可以有一种模式可以结合两种突出显示模式——标准的 vscode c++ 突出显示与扩展混合吗?或者,是否有扩展可以做到这一点?或者,如果可以提供一个正则表达式,让 vscode c++ 荧光笔忽略所有以百分比标记开头的行,我会很高兴。
关于如何解决这个麻烦有什么想法吗?
谢谢!
这是整个代码块,因此您可以测试:
<%
def genargs(n):
return ",".join([ "args[%d]" % j for j in range(n) ])
%>
#include <vector>
#include <limits>
namespace trivial {
template <size_t N, typename... Args>
struct FnType {
using Call = typename FnType<N - 1, double, Args...>::Call;
};
template <typename... Args>
struct FnType<0, Args...> {
typedef double (*Call)(Args...);
};
double callfn(void* fn, const std::vector<double>& args) {
switch (args.size()) {
% for row in range(MAXARGS+1):
case ${row}: return FnType<${row}>::Call(fn)(${genargs(row)}); break;
% endfor
}
return std::numeric_limits<double>::quiet_NaN();
}
} // namespace trivial