diff --git a/package.json b/package.json index b270a2d..1ee56fe 100644 --- a/package.json +++ b/package.json @@ -323,6 +323,11 @@ "scope": "application", "description": "Default language for solving the problems." }, + "leetcode.language.preamble": { + "type": "object", + "scope": "application", + "description": "A little preamble adding to each language's solution files" + }, "leetcode.showDescription": { "type": "string", "default": "In Webview", diff --git a/src/leetCodeExecutor.ts b/src/leetCodeExecutor.ts index d2332c7..119b548 100644 --- a/src/leetCodeExecutor.ts +++ b/src/leetCodeExecutor.ts @@ -13,6 +13,7 @@ import { executeCommand, executeCommandWithProgress } from "./utils/cpUtils"; import { DialogOptions, openUrl } from "./utils/uiUtils"; import * as wsl from "./utils/wslUtils"; import { toWslPath, useWsl } from "./utils/wslUtils"; +import { getCodePreamble } from "./utils/settingUtils"; class LeetCodeExecutor implements Disposable { private leetCodeRootPath: string; @@ -110,8 +111,9 @@ class LeetCodeExecutor implements Disposable { if (!await fse.pathExists(filePath)) { await fse.createFile(filePath); + const codePreamble: string = getCodePreamble(language); const codeTemplate: string = await this.executeCommandWithProgressEx("Fetching problem data...", this.nodeExecutable, cmd); - await fse.writeFile(filePath, codeTemplate); + await fse.writeFile(filePath, codePreamble + codeTemplate); } } diff --git a/src/utils/settingUtils.ts b/src/utils/settingUtils.ts index 7b6eb6c..136c47b 100644 --- a/src/utils/settingUtils.ts +++ b/src/utils/settingUtils.ts @@ -62,6 +62,130 @@ export function getDescriptionConfiguration(): IDescriptionConfiguration { return config; } +const defaultPreambles = { + "cpp": ` +#ifndef _GLIBCXX_NO_ASSERT +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if __cplusplus >= 201103L +#include +#include +#include +#include +#include +#include +#include +#include +#include +#endif + +// C++ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if __cplusplus >= 201103L +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#endif +using namespace std; + ` +} + +/** + * ## About + * + * Code preamble is a short code snippet adding to the beginning of the program. A typical one is: + * + * + * ``` + * #include + * using namespace std; + * ``` + * + * This feature is useful. Maybe inserting header files is interesting for the first several times, + * it is dreadful if we need to add tons of it each time we do the problems, especially for a dreadful + * language like C/C++ + * + * ## Configuration + * + * To add a preamble for one language, the user will follow this schema: + * + * ``` + * "leetcode.language.preamble" = { + * "cpp" : "#include ", + * } + * ``` + * + * @param language + */ +export function getCodePreamble(language: string): string { + const preambles = getWorkspaceConfiguration().get>("language.preamble"); + return preambles?.[language] ?? defaultPreambles?.[language] ?? ""; +} + export interface IDescriptionConfiguration { showInComment: boolean; showInWebview: boolean;