概述
涉及以下插件的安装和配置Package Control Terminus LSP LSP-clangd clang-format LSP-pyright LSP-json
配置 sublime
安装Package Control以进行包管理。
Terminus
安装Terminus以实现 sublime text4 内的 terminal。
绑定快捷键:
[ { "keys": [ "ctrl+shift+t" ], "command": "terminus_open", "args": { // 打开时要执行的命令 // "cmd": "fish", "cwd": "${file_path:${folder}}" } }]
复制代码
自定义在Terminus的终端中编译运行 cpp 文件:
在Tools->Build System->New Build System中新建编译文件,保存为CppTerminus.sublime-build,替换内容为:
{ // MacOS "cmd": [ "zsh", "-c", "clang++ '${file}' -std=c++17 -stdlib=libc++ -o '${file_path}/../bin/${file_base_name}' && ${file_path}/../bin/${file_base_name}" ], "file_regex": "^(..{FNXX==XXFN}*):([0-9]+):?([0-9]+)?:? (.*)$", "working_dir": "${file_path}", "encoding": "utf-8", "selector": "source.c, source.c++", "variants": [ { "name": "Run In Terminus", "target": "terminus_exec", "cancel": "terminus_cancel_build", "cmd": [ "zsh", "-c", "clang++ '${file}' -std=c++17 -stdlib=libc++ -o '${file_path}/../bin/${file_base_name}' && ${file_path}/../bin/${file_base_name}" ] }, { "name": "Create Input File", "cmd": [ "zsh", "-c", "touch ${file_path}/../in_out/${file_base_name}.in && open -a Sublime\\ Text ${file_path}/../in_out/${file_base_name}.in" ] }, { "name": "Run In Terminal", "cmd": [ "zsh", "-c", "clang++ '${file}' -std=c++17 -stdlib=libc++ -o '${file_path}/../bin/${file_base_name}' && open -a Terminal.app '${file_path}/../bin/${file_base_name}'" ] }, ]}
复制代码
注意要保证源文件和bin文件夹、in_out文件夹在同一目录下。
配置 LSP + LSP-clangd
安装这两个插件,windows 和 linux 需要手动安装clangd并添加到 path。
mac 下安装 clangd
我的 mac 已经自带了clangd,安装好这两个插件即可实现语法提示; 如果没有安装clangd,通过以下命令安装:
brew install llvmecho 'export PATH="/usr/local/opt/llvm/bin:$PATH"' >> ~/.zshrcecho 'export LDFLAGS="-L/usr/local/opt/llvm/lib"' >> ~/.zshrcecho 'export CPPFLAGS="-I/usr/local/opt/llvm/include"' >> ~/.zshrc
复制代码
Debian(testing)安装 clangd 和 clang
sudo apt install clangd, sudo apt install llvm, sudo apt install clang
windows 下安装 llvm
借助 scoop, scoop install llvm 然后安装 Visual Stdudio Build Tools,鉴于 windows 上 clang 默认的 c++库就是 msvc,所以就用这个吧,别折腾mingw了.
配置 LSP-clangd
到Preferences->Package Settings->LSP->Settings,写入这样几行
{ // 在主页面只显示error红色下划线 //"show_diagnostics_severity_level": 1, // 代码提示显示灯泡图标 "show_code_actions": "bulb", // 保存时自动格式化 "lsp_format_on_save": true,}
复制代码
再到Preferences->Package Settings->LSP->Servers->LSP-clangd中,写入以下几行
// Settings in here override those in "LSP-clangd/LSP-clangd.sublime-settings"{ "initializationOptions": { // 启用clang-tidy代码检查,可能启用后warning会比较多,自己看着办吧 "clangd.clang-tidy": true, // 美化clangd输出的JSON "clangd.pretty": true, }}
复制代码
再到project/code(源文件所在目录)下新建.clang-tidy文件,写入:
Checks: "bugprone-*,\google-*,\misc-*,\modernize-*,\performance-*,\readability-*,\portability-*,\"HeaderFilterRegex: 'Source/cm[^/]*\.(h|hxx|cxx)$'CheckOptions: - key: modernize-use-default-member-init.UseAssignment value: '1' - key: modernize-use-equals-default.IgnoreMacros value: '0' - key: modernize-use-auto.MinTypeNameLength value: '80'
复制代码
LSP-clangd 默认是使用c++98来检查代码的,要修改为c++17,需要在项目根目录下新建.clangd文件,文件内容如下:
CompileFlags: Add: [-std=c++17]
复制代码
推荐方式为利用cmake生成compile_commands.json, CMakeLists.txt的内容如下:
cmake_minimum_required(VERSION 3.22)# Enable C++11set(CMAKE_CXX_STANDARD 17)# 设置项目名project(LeetCpp)# 源文件aux_source_directory(. SOURCES)# 头文件include_directories(.)add_executable(${PROJECT_NAME} ${SOURCES})
复制代码
通过cmake .. -DCMAKE_EXPORT_COMPILE_COMMANDS=1生成compile_commands.json文件,注意要在build目录下,且build的上级目录存在CMakelists.txt。
安装好clang-format插件之后,只需在project/code下新建.clang-format文件,写入以下内容
# 语言: None, Cpp, Java, JavaScript, ObjC, Proto, TableGen, TextProtoLanguage: Cpp# BasedOnStyle: LLVM# 访问说明符(public、private等)的偏移AccessModifierOffset: -2# 开括号(开圆括号、开尖括号、开方括号)后的对齐: Align, DontAlign, AlwaysBreak(总是在开括号后换行)AlignAfterOpenBracket: Align# 连续赋值时,对齐所有等号AlignConsecutiveAssignments: false# 连续声明时,对齐所有声明的变量名AlignConsecutiveDeclarations: false# 右对齐逃脱换行(使用反斜杠换行)的反斜杠AlignEscapedNewlines: Right# 水平对齐二元和三元表达式的操作数AlignOperands: true# 对齐连续的尾随的注释AlignTrailingComments: true# 不允许函数声明的所有参数在放在下一行AllowAllParametersOfDeclarationOnNextLine: false# 不允许短的块放在同一行AllowShortBlocksOnASingleLine: true# 允许短的case标签放在同一行AllowShortCaseLabelsOnASingleLine: true# 允许短的函数放在同一行: None, InlineOnly(定义在类中), Empty(空函数), Inline(定义在类中,空函数), AllAllowShortFunctionsOnASingleLine: None# 允许短的if语句保持在同一行AllowShortIfStatementsOnASingleLine: true# 允许短的循环保持在同一行AllowShortLoopsOnASingleLine: true# 总是在返回类型后换行: None, All, TopLevel(顶级函数,不包括在类中的函数), # AllDefinitions(所有的定义,不包括声明), TopLevelDefinitions(所有的顶级函数的定义)AlwaysBreakAfterReturnType: None# 总是在多行string字面量前换行AlwaysBreakBeforeMultilineStrings: false# 总是在template声明后换行AlwaysBreakTemplateDeclarations: true# false表示函数实参要么都在同一行,要么都各自一行BinPackArguments: true# false表示所有形参要么都在同一行,要么都各自一行BinPackParameters: true# 大括号换行,只有当BreakBeforeBraces设置为Custom时才有效BraceWrapping: # class定义后面 AfterClass: false # 控制语句后面 AfterControlStatement: false # enum定义后面 AfterEnum: false # 函数定义后面 AfterFunction: false # 命名空间定义后面 AfterNamespace: false # struct定义后面 AfterStruct: false # union定义后面 AfterUnion: false # extern之后 AfterExternBlock: false # catch之前 BeforeCatch: false # else之前 BeforeElse: false # 缩进大括号 IndentBraces: false # 分离空函数 SplitEmptyFunction: false # 分离空语句 SplitEmptyRecord: false # 分离空命名空间 SplitEmptyNamespace: false# 在二元运算符前换行: None(在操作符后换行), NonAssignment(在非赋值的操作符前换行), All(在操作符前换行)BreakBeforeBinaryOperators: NonAssignment# 在大括号前换行: Attach(始终将大括号附加到周围的上下文), Linux(除函数、命名空间和类定义,与Attach类似), # Mozilla(除枚举、函数、记录定义,与Attach类似), Stroustrup(除函数定义、catch、else,与Attach类似), # Allman(总是在大括号前换行), GNU(总是在大括号前换行,并对于控制语句的大括号增加额外的缩进), WebKit(在函数前换行), Custom# 注:这里认为语句块也属于函数BreakBeforeBraces: Custom# 在三元运算符前换行BreakBeforeTernaryOperators: false# 在构造函数的初始化列表的冒号后换行BreakConstructorInitializers: AfterColon#BreakInheritanceList: AfterColonBreakStringLiterals: false# 每行字符的限制,0表示没有限制ColumnLimit: 0CompactNamespaces: true# 构造函数的初始化列表要么都在同一行,要么都各自一行ConstructorInitializerAllOnOneLineOrOnePerLine: false# 构造函数的初始化列表的缩进宽度ConstructorInitializerIndentWidth: 4# 延续的行的缩进宽度ContinuationIndentWidth: 4# 去除C++11的列表初始化的大括号{后和}前的空格Cpp11BracedListStyle: true# 继承最常用的指针和引用的对齐方式DerivePointerAlignment: false# 固定命名空间注释FixNamespaceComments: true# 缩进case标签IndentCaseLabels: falseIndentPPDirectives: None# 缩进宽度IndentWidth: 4# 函数返回类型换行时,缩进函数声明或函数定义的函数名IndentWrappedFunctionNames: false# 保留在块开始处的空行KeepEmptyLinesAtTheStartOfBlocks: false# 连续空行的最大数量MaxEmptyLinesToKeep: 1# 命名空间的缩进: None, Inner(缩进嵌套的命名空间中的内容), AllNamespaceIndentation: None# 指针和引用的对齐: Left, Right, MiddlePointerAlignment: Right# 允许重新排版注释ReflowComments: true# 允许排序#includeSortIncludes: false# 允许排序 using 声明SortUsingDeclarations: false# 在C风格类型转换后添加空格SpaceAfterCStyleCast: false# 在Template 关键字后面添加空格SpaceAfterTemplateKeyword: true# 在赋值运算符之前添加空格SpaceBeforeAssignmentOperators: true# SpaceBeforeCpp11BracedList: true# SpaceBeforeCtorInitializerColon: true# SpaceBeforeInheritanceColon: true# 开圆括号之前添加一个空格: Never, ControlStatements, AlwaysSpaceBeforeParens: ControlStatements# SpaceBeforeRangeBasedForLoopColon: true# 在空的圆括号中添加空格SpaceInEmptyParentheses: false# 在尾随的评论前添加的空格数(只适用于//)SpacesBeforeTrailingComments: 1# 在尖括号的<后和>前添加空格SpacesInAngles: false# 在C风格类型转换的括号中添加空格SpacesInCStyleCastParentheses: false# 在容器(ObjC和JavaScript的数组和字典等)字面量中添加空格SpacesInContainerLiterals: true# 在圆括号的(后和)前添加空格SpacesInParentheses: false# 在方括号的[后和]前添加空格,lamda表达式和未指明大小的数组的声明不受影响SpacesInSquareBrackets: false# 标准: Cpp03, Cpp11, AutoStandard: Cpp11# tab宽度TabWidth: 4# 使用tab字符: Never, ForIndentation, ForContinuationAndIndentation, AlwaysUseTab: Never
复制代码
命令行使用 sublime text4 打开文件
mac 下添加软连接: ln /Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl /usr/local/bin/subl
debian 下执行sudo ln -s /opt/sublime_text/sublime_text /usr/local/bin/subl
之后就能用subl test.cpp命令来调用 sublime text4 打开test.cpp了。
leetcode 相关配置
安装 leetgo: brew install j178/tap/leetgo
在预期的 leetcode 项目目录下执行leetgo init,然后配置leetgo.yaml
# leetgo project level config, global config is at /Users/zwy/.config/leetgo/config.yaml# for more details, please refer to https://github.com/j178/leetgo# authorauthor: zwyyy456language: encode: lang: cppleetcode: site: https://leetcode.com# credentials:# from: browsereditor: use: custom command: "subl" # use: vscode
复制代码
评论