Loading... ## 1. 安装sublime text 进入[sublime官网](https://www.sublimetext.com/)下载sublime的安装包(当然也可以在[官网下载页面](https://www.sublimetext.com/download)下载portable版本,不过**建议下载默认的setup版本**)   双击安装包:  应该一会就下载完成了。  此时可以在应用列表看到sublime:   ## 2. 下载LLVM和Clang > 参考 https://www.cnblogs.com/FrankOu/p/14215850.html 现在使用Clang编译是大趋势,所以我们这里就不使用gcc了(虽然在下载Clang的过程中也会安装gcc) Windows下直接安装LLVM会出现C++标准库丢失的问题,所以我们需要用到MSYS2这个安装工具,原理就是直接安装别人编译好的Clang,很方便。 ### 2.1 下载msys2并配置 ### 2.1.1 msys2的下载 在[MSYS官网](https://www.msys2.org/)下载msys2,如果是windows 64位,就选择 `msys2-x86_64.exe`  ### 2.1.2 msys2的安装 msys2默认安装在`C:\msys64`,在这里我自己不做修改,安装路径读者可自行决定。  后面只要一直点next就行了。 安装完毕的界面如下   ### 2.1.3 msys2的配置 打开`C:\msys64\etc\pacman.d`可以看到`mirrorlist.mingw32`、`mirrorlist.mingw64`、`mirrorlist.msys`三个文件。 > 在文件mirrorlist.mingw32中加入: ```yaml Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686 ``` > 在文件mirrorlist.mingw64中加入: ```yaml Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64 ``` > 在文件mirrorlist.msys中加入: ```yaml Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch ``` 这三行是从清华镜像下载软件,速度会快很多。随后打开msys2,输入`pacman -Sy`同步软件包数据库。  然后再输入`pacman -Su`更新软件包。  在此期间msys2提示你输入y之后会关闭,重新打开再输入一遍`pacman -Su`即可。   ### 2.2 安装并配置Clang ### 2.2.1 安装Clang和LLVM 打开msys2,输入: ```bash pacman -S mingw64/mingw-w64-x86_64-make mingw64/mingw-w64-x86_64-gdb mingw64/mingw-w64-x86_64-clang ``` 按照提示,就可以完成Clang的安装了(顺便安装了gdb和make)。  再执行如下语句完成Clangd的安装。 ```bash pacman -S mingw64/mingw-w64-x86_64-clang-tools-extra ``` 安装成功如下:  > 注意,如果中途发生报错或者卡死,大概率是网络问题,退出重新运行命令就行了。这几个命令一个都不能漏。 ### 2.2.2 添加环境变量 将`C:\msys64\mingw64\bin`添加到Path中。如果不知道什么是path的话,就按照如下步骤操作: 1、打开设置  2、搜索PATH,选择`edit the environment variables`  3、选择`environment variables`  4、选择Path  5、点击Edit  6、点击new   7、最后点OK即可。  ### 2.2.3 测试是否安装成功 首先进入命令提示符:  (或者Win+R输入cmd回车)  测试Clang是否安装,输入`clang -v`  上面这样就是安装成功了。 测试Clangd是否安装,输入`clangd`即可:  可以看到已经启动了clangd后台,安装成功。 ## 3. 配置sublime text4 sublime text4**并非开源免费**,但是你不交钱可以一直免费用下去。它只不过会时不时弹窗提醒你一下要交钱(相当于求你打赏) 这里我以我的需求为例,我想要在某个文件夹下面创建很多个xxx.cpp文件(一看就是在刷题呢)然后可以一键编译运行,产生的编译文件(xxx.exe)不会污染原目录下的cpp文件。 首先我想形成这样一个目录结构: ```text MyProject | |____code | |___test1.cpp | |___test2.cpp | |___test.c | |___test.py | |____bin | |___test.exe | |___test1.exe | |___test2.exe | |____in_out |___test.in |___test.out ``` 先把MyProject(名字随便取)拖到sublime里面去。  再在code里面随便写一个test.cpp  第一次按`Ctrl+B`会弹出选择哪一种编译方式,默认只有两个——single file和single file run,前者是编译,后者是编译+运行,这里我们选择后者。   OK运行的结果很正常(如果报错请重新启动sublime/重启电脑试试)。但是显然,可执行文件被放在和原文件相同的文件夹下,这样会显得很乱:  那该怎么避免呢?我们可以通过自定义编译,来把exe文件放到我想要放的位置(MyProject/bin) ### 3.1 自定义如何编译运行C/C++ sublime通过sublime-build文件自定义如何编译运行C/C++。 在`Tools->Build System->New Build System`中新建编译文件:  先`Ctrl+S`报存为`CppBuilder.sublime-build`,当然Cpp Builder也是我随便取的。大家可以随意。 把cppbuilder里面本来就有的全部删光,换成这些: ```json { // Windows // build only "shell_cmd": "clang++ -std=c++11 -g -Wall ${file} -o ${file_path}/../bin/${file_base_name}", // check the file name using regex "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$", // set the encoding to utf-8 "encoding": "utf-8", // doesn't matter if I use full path "working_dir": "${file_path}", // only C and Cpp files can use this sublime-build file "selector": "source.c, source.c++", "variants": [ { // build and run in CMD // you can type something in CMD then your progam can get its inputs // [Recommanded] "name": "Run in CMD", "shell_cmd": "clang++ -std=c++11 -g -Wall \"${file}\" -o \"${file_path}/../bin/${file_base_name}\" && start cmd /c \"\"${file_path}/../bin/${file_base_name}\" & pause \"" }, { // build and run in sublime // but you can't input anything to your progam "name": "Run in Sublime", "shell_cmd": "clang++ -std=c++11 -g -Wall \"${file}\" -o \"${file_path}/../bin/${file_base_name}\" && cmd /c \"${file_path}/../bin/${file_base_name}\"" } ] } ``` 可以看到,我使用了两种运行方式——在sublime内部直接运行以及在 windows自带的cmd中运行,为什么要选用cmd呢?因为sublime有个缺点,就是它所有文本都是可以编辑的,也就是说我们没法像正常命令行一样输入xxxx,然后回车。(你们试试就知道我说的什么意思了) > 注意:sublime-build文件中涉及很多方面的知识,而且极其脆弱,一改动就可能运行失败。 保存`CppBuilder.sublime-build`以后,通过`Ctrl+Shift+B`选择编译命令,选取Run In CMD:   成功运行,而且把可执行文件和源文件完美隔开! 但是我不想每次都开一个黑框框。。。  当然可以,欢迎进入插件的世界! ### 3.2 安装package control插件管理工具 `Ctrl+Shift+P`打开sublime的**命令面板**。 输入install package control回车进行安装。   上面这样就算安装成功了。 ### 3.3 安装Terminus > Terminus是一个sublime插件,目的就是补全刚刚所说的缺点,实现sublime内置终端。 `Ctrl+Shift+P`打开sublime的**命令面板**。 输入PCI然后回车(package control install)  输入terminus,回车开始安装,可以看到左下角的安装提示。  重启sublime(sublime一般不需要每次改动都重启,但是遇事不决重启总归没错) 进入Terminus的设置:`Preferences->Package Settings->Terminus->Settings`  照旧,把里面的东西删了改成(注意到两端一定得是花括号): ```json { "256color": true, "brighten_bold_text": false, "theme": "chalk", } ``` 当然这主题是我的个人喜好,大家可以一个个试,看看自己喜欢哪个。 这时,我们还是`Ctrl+Shift+P`打开面板,输入terminus就可以查看它的主要功能。  就比如我们选择open default shell in tab  会发现命令行在sublime中打开了,而且路径自动切换到了MyProject下:   当然,使用Terminus运行C/C++也不在话下,根据Terminus官网的配置,我们可以将`CppBuilder.sublime-build`添加一些选项。 ```json { // Windows // build only "shell_cmd": "clang++ -std=c++11 -g -Wall ${file} -o ${file_path}/../bin/${file_base_name}", // check the file name using regex "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$", // set the encoding to utf-8 "encoding": "utf-8", // doesn't matter if I use full path "working_dir": "${file_path}", // only C and Cpp files can use this sublime-build file "selector": "source.c, source.c++", "variants": [ { // build and run in Terminus (sublime plugin) // [Recommanded] "name": "Run In Terminus", "target": "terminus_exec", "cancel": "terminus_cancel_build", "shell_cmd": "clang++ -std=c++11 -g -Wall \"${file}\" -o \"${file_path}/../bin/${file_base_name}\" && cmd /c \"${file_path}/../bin/${file_base_name}\"" }, { // build and run in CMD // you can type something in CMD then your progam can get its inputs // [Recommanded] "name": "Run in CMD", "shell_cmd": "clang++ -std=c++11 -g -Wall \"${file}\" -o \"${file_path}/../bin/${file_base_name}\" && start cmd /c \"\"${file_path}/../bin/${file_base_name}\" & pause \"" }, { // build and run in sublime // but you can't input anything to your progam "name": "Run in Sublime", "shell_cmd": "clang++ -std=c++11 -g -Wall \"${file}\" -o \"${file_path}/../bin/${file_base_name}\" && cmd /c \"${file_path}/../bin/${file_base_name}\"" } ] } ``` 这里奉上评论区想要的Mac下配置(我自用的,和上面的效果一模一样) ```json { // MacOS "cmd": [ "bash", "-c", "clang++ '${file}' -std=c++11 -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": [ "bash", "-c", "clang++ '${file}' -std=c++11 -stdlib=libc++ -o '${file_path}/../bin/${file_base_name}' && ${file_path}/../bin/${file_base_name}" ] }, { "name": "Create Input File", "cmd": [ "bash", "-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": [ "bash", "-c", "clang++ '${file}' -std=c++11 -stdlib=libc++ -o '${file_path}/../bin/${file_base_name}' && open -a Terminal.app '${file_path}/../bin/${file_base_name}'" ] }, ] } ``` Create Input File是新建输入文件的意思,不需要的可以把它删掉。还有,提醒一下,sublime-build中最开始那行是"cmd","variants"里面也必须是“cmd”;最开始是"shell_cmd","variants"里面也必须是“shell_cmd”。 然后`Ctrl+Shift+B`选择如何编译,选择Run In Terminus   OK,简直完美。  嗯?居然想要享受Clion同款代码补全、提示、跳转、格式化?只能祭出LSP插件了! (不是那个lsp) ### 3.4 安装Lsp插件 `Ctrl+Shift+P`打开sublime的**命令面板**。 输入PCI然后回车(package control install) 输入lsp然后回车,很快就装好了。  注意,lsp只是一个语言处理的后端,需要安装相应的前端才能发挥作用。 ### 3.4.1 lsp-clangd 这里我们使用Clangd前端——继续安装lsp-clangd插件。  装完了以后重启sublime,就能看到效果了。  我这还是在虚拟机里面运行的,可以看到真的是健步如飞,用起来不要太爽。试想一下在虚拟机里运行Clion或者VS,分分钟钟给你卡成ppt。 ### 3.4.2 lsp-json lsp-json的安装使我们能够更高效地设置sublime。谁用谁知道,写json最爽的就是它。 同理,在命令面板安装lsp-json。但是安装完成它会提示你下载node-js:  按照它说的做就完了。  ### 3.4.3 lsp-pyright 本人除了C/C++,还需要用sublime写一点python,这时lsp-pyright就是一个很好的选择,但是与本文主题无关,这里不多加赘述。 ### 3.4.4 配置lsp 如果你已经装好了lsp-json的话,这一步其实手打和复制黏贴差不多快() 配置一下lsp: 首先是到`Preferences->Package Settings->LSP->Settings`中,写入这样几行: ```json { // 在主页面只显示error红色下划线 //"show_diagnostics_severity_level": 1, // 代码提示显示灯泡图标 "show_code_actions": "bulb", // 保存时自动格式化 "lsp_format_on_save": true, } ``` 再到`Preferences->Package Settings->LSP->Servers->LSP-clangd`中,写入这样几行: ```json // 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, } } ``` 但是光在这里设置clang-tidy是没有用的,还得在`project/code`(源文件所在目录)下新建`.clang-tidy`文件,写入: ```yaml --- 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' ... ``` ### 3.4.5 配置clang-format 写代码怎么能少的了自动格式化呢。clang-format的配置很简单,只需在`project/code`下新建`.clang-format`文件,写入以下内容: > 当然这只是我的配置,大部分都是抄的网上的,可以根据自己的喜好改动。 ```yaml --- # 语言: None, Cpp, Java, JavaScript, ObjC, Proto, TableGen, TextProto Language: Cpp BasedOnStyle: WebKit # 访问说明符(public、private等)的偏移 AccessModifierOffset: -4 # 开括号(开圆括号、开尖括号、开方括号)后的对齐: Align, DontAlign, AlwaysBreak(总是在开括号后换行) AlignAfterOpenBracket: Align # 对齐数组列 AlignArrayOfStructures: None # 连续赋值时,对齐所有等号 AlignConsecutiveAssignments: None # 对齐连续位字段 AlignConsecutiveBitFields: None # 连续声明时,对齐所有声明的变量名 AlignConsecutiveDeclarations: None # 对齐连续宏定义 AlignConsecutiveMacros: AcrossComments # 逃脱换行(使用反斜杠换行)的反斜杠 AlignEscapedNewlines: Left # 操作数对齐方式 AlignOperands: Align # 尾随的注释对齐 AlignTrailingComments: true # 允许函数参数在一行 AllowAllArgumentsOnNextLine: true # 允许函数声明的所有参数在放在一行 AllowAllParametersOfDeclarationOnNextLine: true # 允许短的块放在同一行 AllowShortBlocksOnASingleLine: true # 允许短的case标签放在同一行 AllowShortCaseLabelsOnASingleLine: true # 允许短的枚举放在同一行 AllowShortEnumsOnASingleLine: true # 允许短的函数放在同一行 AllowShortFunctionsOnASingleLine: Empty # 允许短的if语句保持在同一行 AllowShortIfStatementsOnASingleLine: false # 允许短的匿名函数lamda表达式放在同一行 AllowShortLambdasOnASingleLine: Empty # 允许短的循环while保持在同一行 AllowShortLoopsOnASingleLine: false # 总是在返回类型后换行 AlwaysBreakAfterReturnType: None # 总是在多行string字面量前换行 AlwaysBreakBeforeMultilineStrings: false # 总是在template声明后换行 AlwaysBreakTemplateDeclarations: MultiLine # 宏属性 AttributeMacros: ['__capability', '__output', '__ununsed'] # 表示函数实参要么都在同一行,要么都各自一行 BinPackArguments: true # false表示所有形参要么都在同一行,要么都各自一行 BinPackParameters: true # 位域冒号对齐方式 BitFieldColonSpacing : Both # 大括号换行,只有当BreakBeforeBraces设置为Custom时才有效,设置其他配置则下面不生效 BraceWrapping : # class定义后面 AfterClass: true # 控制语句后面 AfterControlStatement: true # enum定义后面 AfterEnum: true # 函数定义后面 AfterFunction: true # 命名空间定义后面 AfterNamespace: true # ObjC定义后面 AfterObjCDeclaration: true # struct定义后面 AfterStruct: true # union定义后面 AfterUnion: true # catch之前 BeforeCatch: true # else之前 BeforeElse: false # 缩进大括号 IndentBraces: false # unknown: AfterCaseLabel: true AfterExternBlock: true BeforeLambdaBody: true BeforeWhile: true SplitEmptyFunction: true SplitEmptyRecord: true SplitEmptyNamespace: true # 在java字段的注释后换行 BreakAfterJavaFieldAnnotations: false # 在二元运算符前换行 BreakBeforeBinaryOperators: None # 在大括号前换行 BreakBeforeBraces: Custom # 在concept前换行 # BreakBeforeConceptDeclarations: Never # 在三元运算符前换行 BreakBeforeTernaryOperators: true # 构造函数初始值设定项换行样式 BreakConstructorInitializers: BeforeColon # 继承列表样式 BreakInheritanceList: AfterColon # 字符串换行样式 BreakStringLiterals: false # 每行字符的限制,0表示没有限制 ColumnLimit: 80 # 描述具有特殊意义的注释的正则表达式,它不应该被分割为多行或以其它方式改变 CommentPragmas: '^ IWYU pragma:' # 在新行上声明每个命名空间 CompactNamespaces: false # 构造函数的初始化列表的缩进宽度 ConstructorInitializerIndentWidth: 4 # 延续的行的缩进宽度 ContinuationIndentWidth: 4 # 去除C++11的列表初始化的大括号{后和}前的空格 Cpp11BracedListStyle: true # 继承最常用的换行方式 DeriveLineEnding: true # 继承最常用的指针和引用的对齐方式 DerivePointerAlignment: false # 关闭格式化 DisableFormat: false # 删除访问修饰符后的所有空行 EmptyLineAfterAccessModifier: Never # 仅当访问修饰符开始一个新的逻辑块时才添加空行 EmptyLineBeforeAccessModifier: Never # 自动检测函数的调用和定义是否被格式为每行一个参数(Experimental) ExperimentalAutoDetectBinPacking: false # 自动补充namespace注释 FixNamespaceComments: false # 需要被解读为foreach循环而不是函数调用的宏 ForEachMacros: ['RANGES_FOR', 'FOREACH'] IfMacros: ['IF'] # 多个#include块合并在一起并排序为一个 IncludeBlocks: Merge # 可以定义负数优先级从而保证某些#include永远在最前面 IncludeCategories: - Regex: '^"(llvm|llvm-c|clang|clang-c)/' Priority: 2 SortPriority: 0 CaseSensitive: false - Regex: '^(<|"(gtest|gmock|isl|json)/)' Priority: 3 SortPriority: 0 CaseSensitive: false - Regex: '.*' Priority: 1 SortPriority: 0 CaseSensitive: false IncludeIsMainRegex: '(Test)?$' IncludeIsMainSourceRegex: '' # 缩进访问修饰符 IndentAccessModifiers: false # 缩进case标签 IndentCaseLabels: false # case 标签后面的块使用与 case 标签相同的缩进级别 IndentCaseBlocks: false # 向后兼容缩进外部块 IndentExternBlock: AfterExternBlock # 缩进goto标签。 IndentGotoLabels: false # 缩进预处理器指令 IndentPPDirectives: BeforeHash # 缩进模板中的requires子句 IndentRequires: false # 缩进宽度 IndentWidth: 4 # 函数返回类型换行时,缩进函数声明或函数定义的函数名 IndentWrappedFunctionNames: false #InsertBraces: true # 插入尾随逗号 InsertTrailingCommas: None # 保留JavaScript字符串引号 JavaScriptQuotes: Leave # 包装 JavaScript 导入/导出语句 JavaScriptWrapImports: true # 保留在块开始处的空行 KeepEmptyLinesAtTheStartOfBlocks: false # 相对于 lambda 签名对齐 lambda 主体 LambdaBodyIndentation: Signature # 开始一个块的宏的正则表达式 MacroBlockBegin: '' # 结束一个块的宏的正则表达式 MacroBlockEnd: '' # 连续空行的最大数量 MaxEmptyLinesToKeep: 1 # 命名空间的缩进 NamespaceIndentation: All ObjCBinPackProtocolList: Auto # 使用ObjC块时缩进宽度 ObjCBlockIndentWidth: 4 ObjCBreakBeforeNestedBlockParam: true # 在ObjC的@property后添加一个空格 ObjCSpaceAfterProperty: false # 在ObjC的protocol列表前添加一个空格 ObjCSpaceBeforeProtocolList: true # 缩进预处理器语句的列数 PPIndentWidth: -1 PenaltyBreakAssignment: 2 PenaltyBreakBeforeFirstCallParameter: 19 PenaltyBreakComment: 300 PenaltyBreakFirstLessLess: 120 PenaltyBreakString: 1000 PenaltyBreakTemplateDeclaration: 10 PenaltyExcessCharacter: 1000000 PenaltyReturnTypeOnItsOwnLine: 60 PenaltyIndentedWhitespace: 0 # 指针的对齐: Left, Right, Middle PointerAlignment: Right # 引用的对齐 ReferenceAlignment: Pointer # 允许重新排版注释 ReflowComments: true #RemoveBracesLLVM: false # 短命名空间跨越的最大展开行数 ShortNamespaceLines: 1 # 允许排序#include SortIncludes: CaseSensitive # java静态导入放在非静态导入之前 SortJavaStaticImport: Before # 对using声明排序 SortUsingDeclarations: true # 在C风格类型转换后添加空格 SpaceAfterCStyleCast: false # 在!后添加空格 SpaceAfterLogicalNot: false # 在Template关键字后添加空格 SpaceAfterTemplateKeyword: true # 不要确保指针限定符周围有空格 SpaceAroundPointerQualifiers: Default # 在赋值运算符之前添加空格 SpaceBeforeAssignmentOperators: true # 不在case冒号之前添加空格 SpaceBeforeCaseColon: false # 不在C++11大括号列表之前添加空格 SpaceBeforeCpp11BracedList: false # 在构造函数初始化器冒号之前添加空格 SpaceBeforeCtorInitializerColon: true # 在继承冒号前添加空格 SpaceBeforeInheritanceColon: true # 开圆括号之前添加一个空格 SpaceBeforeParens: ControlStatements # 在基于范围的for循环冒号之前添加空格 SpaceBeforeRangeBasedForLoopColon: true # 中括号前空格 SpaceBeforeSquareBrackets: false # {}中间空格 SpaceInEmptyBlock: false # 在空的圆括号中添加空格 SpaceInEmptyParentheses: false # 在尾随的评论前添加的空格数(只适用于//) SpacesBeforeTrailingComments: 2 # 在尖括号的<后和>前添加空格 SpacesInAngles: true # 在C风格类型转换的括号中添加空格 SpacesInCStyleCastParentheses: false # 不在if/for/switch/while条件周围插入空格 SpacesInConditionalStatement: false # 在容器(ObjC和JavaScript的数组和字典等)字面量中添加空格 SpacesInContainerLiterals: true # 行注释开头允许有多少个空格。要禁用最大值,请将其设置为-1,除此之外,最大值优先于最小值 SpacesInLineCommentPrefix: Minimum: 1 Maximum: -1 # 在圆括号的(后和)前添加空格 SpacesInParentheses: false # 在方括号的[后和]前添加空格,lamda表达式和未指明大小的数组的声明不受影响 SpacesInSquareBrackets: false # 标准 Standard: Auto # 在语句前面被忽略的宏定义,就好像它们是一个属性一样 StatementAttributeLikeMacros: - Q_EMIT # 应该被解释为完整语句的宏定义 StatementMacros: - Q_UNUSED - QT_REQUIRE_VERSION # tab宽度 TabWidth: 4 # 使用\r\n换行替代\n UseCRLF: false # 使用tab字符:ForIndentation——仅将制表符用于缩进 UseTab: Never # 对空格敏感的宏定义 WhitespaceSensitiveMacros: - STRINGIZE - PP_STRINGIZE - BOOST_PP_STRINGIZE - NS_SWIFT_NAME - CF_SWIFT_NAME ... ``` 现在你一保存文件,lsp就会按照上述`.clang-format`文件来格式化你的代码。 ### 4. 配置Sublime sublime主要有两个配置文件,一个是`Preferences->Settings`中,一个是`Preferences->Key Bindings`。 进入以后左侧是默认配置,无法修改的。右侧是自定义配置,自定义配置可以覆盖默认配置选项。 ### 4.0 设置Tab长度 我喜欢用四空格的Tab,不会有人立场不一样吧?   ### 4.1 sublime偏好设置 OK,我们先改`Preferences->Settings`。这是我的个人喜好: ```json { "font_size": 21, "ignored_packages": [ "Vintage", ], // 设置tab的大小为4 "tab_size": 4, // 使用空格代替 Tab "translate_tabs_to_spaces": true, // 使用默认字体 Monaco "font_face": "Monaco", // 失去光标自动保存 "save_on_focus_lost": true, // 添加行宽标尺 "rulers": [ 100 ], // 显示空白字符 "draw_white_space": "all", // 保存时自动去除行末空白 "trim_trailing_white_space_on_save": "all", // 保存时自动增加文件末尾换行 "ensure_newline_at_eof_on_save": true, // 默认编码格式 "default_encoding": "UTF-8", // 不检查更新 "update_check": false, // 把光标的样式从闪烁变成淡入淡出 // 其余的选项还有"smooth", "phase", "blink", "wide", "solid". "caret_style": "phase", // 高亮当前行 "highlight_line": true, // 增加行间距 "line_padding_bottom": 1, "line_padding_top": 1, // 一直显示代码折叠箭头 "fade_fold_buttons": false, // 排除这些文件夹,搜索和侧边栏都不会显示 "folder_exclude_patterns": [ "*.dSYM", ], // 排除这些文件,搜索和侧边栏都不会显示 "file_exclude_patterns": [ ".DS_Store", ".clang-format", ".clang-tidy", ], } ``` ### 4.2 sublime快捷键设置 这样配置下来,多出来了很多功能。我们可以配置一些快捷键,不得不说sublime的快捷键自定义性非常强,就是比较折腾。 sublime的快捷键逻辑是,很多插件都有key-bindings设置(如图)  打开就能显示默认快捷键(左侧)和系统快捷键(右侧),在右侧可以自己写快捷键,只要 打开`Preferences->Key Bindings`,我的配置是: ```json [ // LSP Format File (lsp's format) // "shift+alt+l"一键格式化全文件或者选中区域 { "keys": [ "shift+alt+l" ], "command": "lsp_format_document", }, // LSP Run Source Actions // "shift+alt+enter" 显示代码提示 { "keys": [ "shift+alt+enter" ], "command": "lsp_code_actions", "context": [ { "key": "lsp.session_with_capability", "operator": "equal", "operand": "codeActionProvider.codeActionKinds" } ] }, // LSP Goto Definition // "F12"转到定义 { "keys": [ "f12" ], "command": "lsp_symbol_definition", "args": { "side_by_side": false, "force_group": true, "fallback": false }, "context": [ { "key": "lsp.session_with_capability", "operator": "equal", "operand": "definitionProvider" }, { "key": "auto_complete_visible", "operator": "equal", "operand": false } ] }, // Terminus // "F2"打开或关闭Terminus面板 { "keys": [ "f2" ], "command": "toggle_terminus_panel", "args": { "cwd": "${file_path:${folder}}" } }, ] ```  怎么总感觉少了点什么?是没有调试工具! ### 5. 配置LLDB调试 这里得承认vscode的调试比sublime强大得多,**如果极其依赖调试的话建议转VScode**。 由于我是用Clang编译的C++文件,所以用 LLDB 来调试,当然如果你想用 GCC 编译,可以选择GDB调试。 注意,如果选择GDB调试的话,需要下载nodejs并且配置环境变量,较为复杂。由于这篇文章是给小白看的,所以只要LLDB够用就不多加赘述。最后**奉劝各位准备装nodejs的兄弟,先装NVM**(nodejs version manager),太香了。 ### 5.1 安装LLDB 打开之前安装好的msys2,输入: ```bash pacman -S mingw64/mingw-w64-x86_64-lldb ``` ### 5.2 测试LLDB是否安装成功 在sublime里面通过`F2`打开终端(见4.2的快捷键配置) 然后随便调试一个可执行文件(这里选用test):  ``` lldb ../bin/test.exe C:\Users\hzy\Downloads\MyProject\code>lldb ../bin/test.exe (lldb) target create "../bin/test.exe" Current executable set to 'C:\Users\hzy\Downloads\MyProject\bin\test.exe' (x86_64). (lldb) b 10 Breakpoint 1: where = test.exe`main + 112 at test.cpp:10:12, address = 0x00000001400015f0 (lldb) r (lldb) Process 4168 laun\Users\hzy\Downloads\MyProject\bin\test.exe' (x86_64) Process 4168 stopped * thread #1, stop reason = breakpoint 1.1 frame #0: 0x00007ff6642115f0 test.exe`main(argc=1, argv=0x0000025bcc901970) at test.cpp:10:12 7 std::queue<int> q; 8 q.push(100); 9 q.push(2); -> 10 q.push(20); 11 a = 30; 12 q.push(a); 13 return 0; (lldb) p q (std::queue<int, std::deque<int, std::allocator<int> > >) $0 = { c = size=2 { [0] = 100 [1] = 2 } ``` 当然,想要更愉快的调试程序,少不了插件的协助。 ### 5.2 安装debugger插件 同理,打开命令面板,进入package control install安装界面,输入debugger回车,等待安装完成。 安装完成后,我们可以在`Tools->debugger`中打开它。  由于我们还没有建立项目,它提示我们建立sublime project,点击即可创建`MyProject.sublime-project`和`MyProject.sublime-workspace`。  前者是对该项目的配置(项目地址等等),后者是对文件操作的记录、记录打开了哪些文件、记住代码补全的选择(一般不进行修改)。 建立项目文件后,debugger就能跑起来了。这时选择`Add Config`  选择`install adapters`,我们要安装lldb对应的适配器。(⚠️需要魔法上网)  选择`lldb`,进去后选择第一个。(⚠️需要魔法上网) x  安装完成。(⚠️需要魔法上网)  别急,还有,继续点击`Add Config`  选择`Add Configuration`  选择lldb,然后选择第一个。  这一步实际上只是到`.sublime-project`文件里面插入了一段代码而已。如果显示插入失败的话(Mac就是这样)不用管它,反正这段代码迟早也要被爆改一通。 ### 5.3 配置debugger 此时,基本的LLDB配置都完成了,如果想用GDB的话(或者LLDB因为莫名的错误用不了的话),可以以相同的原理安装GDB适配器。我的sublime-project里面是这样的: ```json { "folders": [ { "path": ".", } ], "debugger_configurations": [ { "type": "lldb", "request": "launch", "name": "Launch", "program": "${folder}/bin/${file_base_name}", "args": [], "cwd": "${folder}" }, ], } ``` 勉强可以用,但是更优的配置如下: ```json { "folders": [ { "path": "." }, ], "debugger_tasks": [ { // 用Clang编译 "name": "CompileWithClang", "working_dir": "${file_path}", "shell_cmd": "clang++ -std=c++11 -g '${file}' -o '${file_path}/../bin/${file_base_name}'", "file_regex": "(..[^:]*):([0-9]+):([0-9]+)?:? error: (.*)", }, { // 用GCC编译 "name": "CompileWithGCC", "working_dir": "${file_path}", "shell_cmd": "g++ -std=c++11 -g '${file}' -o '${file_path}/../bin/${file_base_name}'", "file_regex": "(..[^:]*):([0-9]+):([0-9]+)?:? error: (.*)", }, ], "debugger_configurations": [ { // 在Terminus窗口运行程序,使用GDB调试 "name": "C++ GDB (Terminus)", "type": "gdb", "request": "launch", // Debug之前先用GCC编译一波 "pre_debug_task": "CompileWithGCC", // bin目录下的可执行文件 "target": "${file_path}/../bin/${file_base_name}", "cwd": "${project_path}", "terminal": "external", "valuesFormatting": "parseText" }, { "name": "C++ GDB (Attach)", "type": "gdb", "request": "attach", "target": "${command_pick_process}", // sublime text 4 only "cwd": "${folder}", "valuesFormatting": "parseText" }, { // 在Terminus窗口运行程序,使用LLDB调试 "name": "C++ LLDB (Terminus)", "type": "lldb", "request": "launch", // Debug之前先用Clang编译一波 "pre_debug_task": "CompileWithClang", // bin目录下的可执行文件 "program": "${file_path}/../bin/${file_base_name}", "cwd": "${project_path}", // 使用外部终端运行程序(默认是Terminus) "terminal": "external", }, { "name": "C++ LLDB (Attach)", "type": "lldb", "request": "attach", "pid": "${command_pick_process}" // sublime text 4 only }, ], } ``` OK,现在再次`Tools->debugger->Open`(或者在命令面板输入`debugger open`也可以),点击运行  选择C++ LLDB (Terminus)  就能愉快地进行调试啦。  ### 6 修改sublime的配置文件保存位置 Sublime Text 3安装完以后(安装过程不再演示),第一次打开会在C:\Users\admin\AppData\Roaming目录下创建一个Sublime Text 3目录用于存放Sublime Text 3的配置信息和安装的插件等。通过下面的方式就可以将这个默认路径修改到Sublime Text 3的安装路径下,这样就可以把Sublime Text 3 copy到其他电脑上直接使用了。 安装完以后先不要打开,如果已经打开就点击菜单栏的Preferences-->Browse Packages...就能找到在C盘(系统盘)创建的文件夹(默认是隐藏的),返回到上一级的Sublime Text 3文件夹,然后关闭软件,删掉Sublime Text 3文件夹。在Sublime Text 3 的安装目录下创建一个Data文件夹(注意大小写),然后打开Sublime Text 3软件就行了。 ## 4.插件配置 ### 4.1安装Package Control Package Control为插件管理包,方便浏览、安装和卸载Sublime Text中的插件 ctrl+`,在下面弹出的控制台中加入以下代码或者去官网粘,按下回车(可能会未响应,耐心等待一下),安装完成后重启 ### 4.2 下载插件 ctrl+shitf+p,输入install,点击第一个,等待一下,在弹出的框中输入想要的插件名字,点击,即可下载 ## 5.插件推荐 ### 5.1 ChineseLocalizations 功能:更改sublime的语言。 使用:下载完成后点击菜单栏中的Help,最下面会多一个language,在里面可以选择语言 下载时弹出的框里面的(直接关掉那个框就行): 请使用主菜单的 帮助/Language 子菜单来切换语言。 目前支持 简体中文 繁体中文 日本語 德语 法语 俄语等。 要换回英语不需要卸载本插件,请直接从菜单切换英文。 ### 5.2 Side bar 功能:显示侧边栏 配置:下载好后不默认显示,可在视图->侧边栏中打开显示开关 ### 5.3 ConvertToUTF8 功能:解决中文乱码,让注释可看 使用:安装完成即可 ### 5.4 Sublime Text Trans 功能:设置背景透明度 使用方法:Ctrl+Shift+[1,2,3,4,5,6] ### 5.5Sublime Astyle Formatter 功能:格式化代码 使用方法:ctrl+Alt+F是默认格式化整个文件,ctrl+K+F即可格式化选中区域 ### 5.6.BracketHighlighter 功能:括号匹配高亮。 使用:下载完成即可使用,默认是白色的。 配置:将括号匹配从白色变成彩色 首选项->Package Settings->BracketHighlighter->bracket settings; 将左侧复制,粘到User中,将原先大概685行的代码更改 然后保存退出就行。 ## 6.插件管理与卸载 当然你可以打开文件夹暴力删除 ### 6.1 查看已下载插件 Ctrl+Shift+P,在对话框中输入“list”,选择“Package Control:List Packages”。 然后就可以浏览和查找已安装插件 ### 6.2 卸载插件 Ctrl+Shift+P,在对话框中输入“remove”,选择“Package Control:Remove Packages”。 然后点击要卸载的插件即可图和list里的差不多,就不配了 作者 ## 7. sublime美化 ### 7.1 美化debugger 我觉得debugger的默认字体太丑了,而且界面元素太大了,不符合sublime的UI风格。 所以我试着把它改为sublime的默认字体(需要安装Monaco字体),UI大小改小。 Monaco字体的[下载链接](http://www.mycode.net.cn/wp-content/uploads/2016/06/Monaco.zip) 解压以后双击Monaco  点击install就行了  然后在命令面板输入`debugger settings`,进入debugger设置界面。黏贴如下设置: ```json { // 开sublime不自动启动debugger "open_at_startup": false, // 设置为sublime的默认字体 "font_face": "Monaco", // 字体改小一些 "ui_scale": 14, // 自动决定是否显示汇编代码 "lldb_show_disassembly": "auto", "integrated_output_panels": { "integrated_output_panels": { "diagnostics": { "name": "Diagnostics", },// 代码诊断并入debugger界面 "Terminus": { "name": "Terminal", "position": "bottom" }// Terminus终端并入debugger界面 } } } ``` 最终效果图:  ### 7.2 美化UI (觉得sublime的UI已经够好看的可以跳过) 最近 Material UI 比较火。还好sublime也有个material UI插件。 同上,package control install输入material theme  安装完成后,它会提示安装图标插件,用来在侧边栏显示各种文件类型。安装就完事了。  最后,在命令面板输入`material theme activate`  我选的是Material-Theme Darker  再在命令面板输入`UI-Select Color Theme`  我选的是Material Theme  这时,我们可以发现sublime的设置中多了两行:  ## 8. sublime怎么用? 通过上面的介绍,你可以发现,几乎所有sublime的选项和插件设置都可以在**命令面板**中找到,打开命令面板的快捷键是`Ctrl+Shift+P`。 此外,sublime的插件配置都是代码化的,你可以在左侧看到所有的选项和注释(当然需要英文好),在右侧对默认设置进行修改。 下面介绍一些非常实用的快捷键: 可以通过`Ctrl+~`打开sublime的控制台,一些报错都可以在上面找到并解决。  1. **先按`Ctrl K`再按`Ctrl B`可以打开/关闭侧边栏** 2. `Ctrl+P` 搜索框 3. `Ctrl+G` 跳转到第几行 4. `Ctrl+W` 关闭当前打开文件 5. `Ctrl+Shift+W` 关闭所有打开文件 6. `Ctrl+Shift+V` 粘贴并格式化 7. `Ctrl+D` 选择单词,重复可增加选择下一个相同的单词 8. `Ctrl+Shift+D` 复制光标所在整行,插入到下一行 9. `Ctrl+L` 选择行,重复可依次增加选择下一行 10. `Ctrl+Shift+L` 选择多行 11. `Ctrl+Shift+Enter` 在当前行前插入新行 12. `Ctrl+X` 删除当前行 13. `Ctrl+M` 跳转到对应括号 14. `Alt+鼠标拖动` 多光标选择 15. `Ctrl+J` 选择标签内容 16. `Ctrl+F` 查找内容 17. `Ctrl+N` 新建窗口 18. `Ctrl+/` 注释 19. `Ctrl+Shift+K` 删除整行 20. `Tab` 向右缩进 21. `Shift+Tab` 向左缩进 22. `Ctrl+Z` 撤销 23. `Ctrl+Y` 恢复撤销 24. `F6` 单词检测拼写 25. `Ctrl+P` 打开搜索框 26. `Ctrl+Tab` 按文件浏览过的顺序,切换当前窗口的标签页。 - 输入当前项目中的文件名,快速搜索文件 - 输入`@`和关键字,查找文件中函数名 - 输入`:`和数字,跳转到文件中该行代码 - 输入`#`和关键字,查找变量名 ## 9. 关闭激活弹窗 1 在软件的安装目录找到 sublime_text.exe 文件。 2 这里推荐使用: 【hexed】 在线十六进制编辑器,打开 sublime_text.exe 文件。[hexed在线网站](https://hexed.it/) 3 然后查找以下字节并且替换(不同的软件版本替换的内容略有不同,一定要看好软件版本) > 版本:80 78 05 00 0F 94 C1 替换为 C6 40 05 01 48 85 C9 ## 10.引用链接,感谢原作者的付出 > https://zhuanlan.zhihu.com/p/586687010 > > https://www.cnblogs.com/nangch/p/5341067.html > > https://www.bilibili.com/read/cv12390518 最后修改:2023 年 03 月 31 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 1 如果觉得我的文章对你有用,请随意赞赏