概述
涉及以下插件的安装和配置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 llvm echo 'export PATH="/usr/local/opt/llvm/bin:$PATH"' >> ~/.zshrc echo 'export LDFLAGS="-L/usr/local/opt/llvm/lib"' >> ~/.zshrc echo '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++11 set(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, TextProto Language: 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(定义在类中,空函数), All AllowShortFunctionsOnASingleLine: 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: AfterColon BreakStringLiterals: false # 每行字符的限制,0表示没有限制 ColumnLimit: 0 CompactNamespaces: true # 构造函数的初始化列表要么都在同一行,要么都各自一行 ConstructorInitializerAllOnOneLineOrOnePerLine: false # 构造函数的初始化列表的缩进宽度 ConstructorInitializerIndentWidth: 4 # 延续的行的缩进宽度 ContinuationIndentWidth: 4 # 去除C++11的列表初始化的大括号{后和}前的空格 Cpp11BracedListStyle: true # 继承最常用的指针和引用的对齐方式 DerivePointerAlignment: false # 固定命名空间注释 FixNamespaceComments: true # 缩进case标签 IndentCaseLabels: false IndentPPDirectives: None # 缩进宽度 IndentWidth: 4 # 函数返回类型换行时,缩进函数声明或函数定义的函数名 IndentWrappedFunctionNames: false # 保留在块开始处的空行 KeepEmptyLinesAtTheStartOfBlocks: false # 连续空行的最大数量 MaxEmptyLinesToKeep: 1 # 命名空间的缩进: None, Inner(缩进嵌套的命名空间中的内容), All NamespaceIndentation: None # 指针和引用的对齐: Left, Right, Middle PointerAlignment: Right # 允许重新排版注释 ReflowComments: true # 允许排序#include SortIncludes: false # 允许排序 using 声明 SortUsingDeclarations: false # 在C风格类型转换后添加空格 SpaceAfterCStyleCast: false # 在Template 关键字后面添加空格 SpaceAfterTemplateKeyword: true # 在赋值运算符之前添加空格 SpaceBeforeAssignmentOperators: true # SpaceBeforeCpp11BracedList: true # SpaceBeforeCtorInitializerColon: true # SpaceBeforeInheritanceColon: true # 开圆括号之前添加一个空格: Never, ControlStatements, Always SpaceBeforeParens: ControlStatements # SpaceBeforeRangeBasedForLoopColon: true # 在空的圆括号中添加空格 SpaceInEmptyParentheses: false # 在尾随的评论前添加的空格数(只适用于//) SpacesBeforeTrailingComments: 1 # 在尖括号的<后和>前添加空格 SpacesInAngles: false # 在C风格类型转换的括号中添加空格 SpacesInCStyleCastParentheses: false # 在容器(ObjC和JavaScript的数组和字典等)字面量中添加空格 SpacesInContainerLiterals: true # 在圆括号的(后和)前添加空格 SpacesInParentheses: false # 在方括号的[后和]前添加空格,lamda表达式和未指明大小的数组的声明不受影响 SpacesInSquareBrackets: false # 标准: Cpp03, Cpp11, Auto Standard: Cpp11 # tab宽度 TabWidth: 4 # 使用tab字符: Never, ForIndentation, ForContinuationAndIndentation, Always UseTab: 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 # author author: zwyyy456 language: en code: lang: cpp leetcode: site: https://leetcode.com # credentials: # from: browser editor: use: custom command: "subl" # use: vscode