思源笔记搭建过程中出现了一些问题version: "3.9" services: main: image: b3log/siyuan command: ['--workspace=/siyuan/workspace/', '--accessAuthCode=${AuthCode}'] user: '1000:1000' ports: - 6806:6806 volumes: - /siyuan/workspace:/siyuan/workspace restart: unless-stopped environment: # A list of time zone identifiers can be found at https://en.wikipedia.org/wiki/List_of_tz_database_time_zones - TZ=${TimeZone} 在这个里面，就算按照教程来，但是一直显示文件夹路径不合法，改了权限和都没什么用，最后好像说是是思源笔记的路径本来就有点问题，所以直接把数据库的卷挂载在自己想存储的目录version: "3.9" services: main: image: b3log/siyuan # 使用的镜像源名称 container_name: SiYuan # 设置容器名称 command: [ "--workspace=/home/user/SiYuan/workspace/", "--accessAuthCode=xxxx!" # 官方设置的容器内的数据存放路径与认证码 ] user: '1000:1000' volumes: - "/home/user/SiYuan/workspace:/home/siyuan" network_mode: "host" ports: - "6806:6806" restart: always # 容器自动重启 environment: - LANG=zh_CN
初始化设置配置用户名git config --global user.name "Your Name"配置邮箱git config --global user.email "mail@example.com"存储配置git config --global credential store新建仓库创建⼀个新的本地仓库（省略project-name 则在当前目录创建）git init <project-name>克隆⼀个远程仓库git clone <url>工作区域工作区（Working Directory）就是你在电脑⾥能实际看到的⽬录暂存区（Stage/Index）暂存区也叫索引，⽤来临时存放未提交的内容，⼀般在.git ⽬录下的index 中。本地仓库（Repository）Git 在本地的版本库， 仓库信息存储在.git 这个隐藏⽬录中。远程仓库（Remote Repository）托管在远程服务器上的仓库。 常⽤的有GitHub， GitLab， Gitee。文件状态已修改（Modified）修改了但是没有保存到暂存区的⽂件已暂存（Staged）修改后已经保存到暂存区的⽂件已提交（Committed）把暂存区的⽂件提交到本地仓库后的状态文件名称main/master 默认主分支 Origin 默认远程仓库 HEAD 指向当前分支的指针 HEADA 上一个版本 HEAD~ 上四个版本添加和提交文件git add <file添加⼀个⽂件到暂存区，⽐如git add . 就表示添加所有⽂件到暂存区。git commit -m "message"提交所有暂存区的⽂件到本地仓库git commit -am "message"提交所有已修改的⽂件到本地仓库删除 撤销 恢复git mv <file><new-file>移动一个文件到新的位置。git rm <file>从工作区和暂存区删除一个文件，并且将这次删除放入暂存区。git rm --cached <file>从索引/暂存区中删除文件，但是本地工作区文件还在，只是不希望这个文件被版本控制。git checkout <file> <commit-id>恢复一个文件到之前的版本。git revert <commit-id>创建一个新的提交，用来撤销指定的提交，后者的所有变化将被前者抵消，并且应用到当前分支。git reset --mixed <commit-id>重置当前分支的HEAD为之前的某个提交，并且删除所有之后的提交。hard参数表示重置工作区和暂存区， soft参数表示重置暂存区， mixed参数表示重置工作区。git restore --staged <file>撤销暂存区的文件，重新放回工作区(git add的反向操作)。git diff查看差异git status [-s]查看仓库状态，列出还未提交的新的或修改的文件。$-s$是查看简略模式git log --oneline查看提交历史，--oneline表示简介模式。git diff查看未暂存的文件更新了哪些部分。git diff <commit-id> <commit-id>查看两个提交之间的差异。git diff HEAD比较工作区与暂存区之间的关系git diff cached比较暂存区和版本库之间的关系git diff HEAD~ HEAD比较当前版本和上个版本git diff HEAD~x HEAD fil1可以用来比较前x个版本和现版本的区别，后面添加文件名只会查看该文件的区别.gitignore忽略文件需要在git过程中忽略掉一些文件.git Git仓库的元数据和对象数据库 .gitignore 忽略文件，不需要提交到仓库的文件 .gitattributes 指向当前分支的指针 .gitkeep 使空目录被提交到仓库 .gitmodules 记录子模块的信息 .gitconfig 记录仓库的配置信息.gitignore *.log //忽略某种文件 temp/ //忽略文件夹，后面是以/结尾的就起到了忽略所有log结尾的文件，如果已经被提交到了版本库中忽略是没有作用的，需要从暂存区删除，需要仅仅将远程库中删除则使用git rm xxx --cached如果一个文件夹下无文件不会被添加至仓库gitignore文件的匹配规则空行或者以#开头的行会被Gt忽略。一般空行用于可读性的分隔，#一般用作注释使用标准的Blob模式匹配，例如：星号*通配任意个字符问号？匹配单个字符中括号[]表示匹配列表中的单个字符，比如：[abc]表示a/b/c两个星号**表示匹配任意的中间目录中括号可以使用短中线连接，比如：[0-9]表示任意一位数字，[a-z]表示任意一位小写字母感叹号！表示取反#忽略所有的.a文件 *.a #但跟踪所有的lib.a,即便你在前面忽略了.a文件 !lib.a #只忽略当前目录下的TODO文件，而不忽略subdir/T0D0 /TODO #忽略任何目录下名为build的文件夹 build/ #忽略doc/notes.txt,但不忽略doc/server/arch.txt doc/*.txt #忽略doc/目录及其所有子目录下的.pdf文件 doc/**/*.pdf常用忽略模板SSH配置命令行输入ssh-keygen,一路回车，如果要重新生成别的密钥，请注意修改，并且在某些指定程序修改识别密钥如果更换了名称，则需要在.ssh文件夹创建config文件，当我们使用github过程中就会验证test这个密钥# github Host github.com HostName github.com PreferredAuthentications publickey IdentityFile ~/.ssh/test右上角头像的setting页面左侧SSH and GPG keys页面中间New SSH key将xxx.pub输入到ssh对话框同步到远程仓库git push拉取到本地仓库git pull <remote>克隆仓库git clone repo-address关联远程仓库和本地仓库添加远程仓库#Step 1 git remote add <远程仓库别名> <远程仓库地址> #Step 2 git push -U <远程仓库名> <分支名>在github创建一个仓库点上方的ssh并将代码复制到本地的终端运行git remote add origin git@github.com:geekhall-laoyang/first-repo.git git branch -M main //指定分支名称 git push -u origin main:main //本地main分支与远程main分支关联，前面的是本地，后面的是远程查看远程仓库git remote -v拉取远程仓库git pull <远程仓库名><远程分支名>:<本地分支名>相同可以省略冒号后面的分支操作查看分支列表：git branch创建分支：git branch branch-name切换分支：git checkout branch-namegit switch branch-name较为推荐第二种合并分支git merge branch-name删除分支：[已合并]git branch -d branch-name[未合并]git branch -D branch-name合并合并步骤在提交命令加上-a参数即可同时完成暂存和提交两个操作切换到要被合并的分支输入git merge xxx，xxx为要合并进来的分支使用git status查看冲突文件使用git diff查看冲突内容手动编辑冲突文件后再次提交解决合并冲突两个分支未修改同一个文件的同一处位置：Gt自动合并两个分支修改了同一个文件的同一处位置：产生冲突解决方法：Step1-手工修改冲突文件，合并冲突内容Step2-添加暂存区$ git add fileStep3-提交修改$ git commit -m "message"中止合并：当不想继续执行合并操作时可以使用下面的命令来中止合并过程：$ git merge --abortrebasegit rebase dev例如这个指令就会将dev合并到当前分支，rebase的作用就是把命令中的分支合并到当前位于的分支如果当前在main分支，执行git rebase dev后如果当前在dev分支，执行git rebase main后分支管理和工作流模型版本号规则主版本(Major Version)：主要的功能变化或重大更新；次版本(Minor Version)：一些新的功能、改进和更新，通常不会影响现有功能；修订版本(Patch Version)：一些小的bug修复，安全漏洞补丁等。通常不会更改现有功能和接口。分支命名推荐使用带有意义的描述性名称来命名分支版本发布分支/Tag示例：v1.0.0功能分支示例：feature-login-page修复分支示例：hotfix-#fissueid-desc分支管理定期合并已经成功验证的分支，及时删除已经合并的分支保持合适的分支数量为分支设置合适的管理权限
第一讲：GCC编译器1.1 编译过程预处理-Pre-Processing //.i文件# -E 选项指示编译器仅对输入文件进行预处理 g++ -E test.cpp -o test.i //.i文件编译-Compiling // .s文件# -S 编译选项告诉 g++ 在为 C++ 代码产生了汇编语言文件后停止编译 # g++ 产生的汇编语言文件的缺省扩展名是 .s g++ -S test.i -o test.s汇编-Assembling // .o文件# -c 选项告诉 g++ 仅把源代码编译为机器语言的目标代码 # 缺省时 g++ 建立的目标代码文件有一个 .o 的扩展名。 g++ -c test.s -o test.o链接-Linking // bin文件# -o 编译选项来为将产生的可执行文件用指定的文件名 g++ test.o -o test1.2 g++重要编译参数g 编译带调试信息的可执行文件# -g 选项告诉 GCC 产生能被 GNU 调试器GDB使用的调试信息，以调试程序。 # 产生带调试信息的可执行文件test g++ -g test.cpp-O[n] 优化源代码## 所谓优化，例如省略掉代码中从未使用过的变量、直接将常量表达式用结果值代替等等，这些操作会缩减目标文件所包含的代码量，提高最终生成的可执行文件的运行效率。 # -O 选项告诉 g++ 对源代码进行基本优化。这些优化在大多数情况下都会使程序执行的更快。 -O2 选项告诉 g++ 产生尽可能小和尽可能快的代码。 如-O2，-O3，-On（n 常为0–3） # -O 同时减小代码的长度和执行时间，其效果等价于-O1 # -O0 表示不做优化 # -O1 为默认优化 # -O2 除了完成-O1的优化之外，还进行一些额外的调整工作，如指令调整等。 # -O3 则包括循环展开和其他一些与处理特性相关的优化工作。 # 选项将使编译的速度比使用 -O 时慢， 但通常产生的代码执行速度会更快。 # 使用 -O2优化源代码，并输出可执行文件 g++ -O2 test.cppl 和 -L 指定库文件 | 指定库文件路径# -l参数(小写)就是用来指定程序要链接的库，-l参数紧接着就是库名 # 在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接 # 链接glog库 g++ -lglog test.cpp # 如果库文件没放在上面三个目录里，需要使用-L参数(大写)指定库文件所在目录 # -L参数跟着的是库文件所在的目录名 # 链接mytest库，libmytest.so在/home/bing/mytestlibfolder目录下 g++ -L/home/bing/mytestlibfolder -lmytest test.cppI 指定头文件搜索目录# -I # /usr/include目录一般是不用指定的，gcc知道去那里找，但 是如果头文件不在/usr/icnclude里我们就要用-I参数指定了，比如头文件放在/myinclude目录里，那编译命令行就要加上-I/myinclude 参数了，如果不加你会得到一个”xxxx.h: No such file or directory”的错误。-I参数可以用相对路径，比如头文件在当前 目录，可以用-I.来指定。上面我们提到的–cflags参数就是用来生成-I参数的。 g++ -I/myinclude test.cppWall 打印警告信息# 打印出gcc提供的警告信息 g++ -Wall test.cppw 关闭警告信息# 关闭所有警告信息 g++ -w test.cppstd=c++11 设置编译标准# 使用 c++11 标准编译 test.cpp g++ -std=c++11 test.cppo 指定输出文件名# 指定即将产生的文件名 # 指定输出可执行文件名为test g++ test.cpp -o testD定义宏# 在使用gcc/g++编译的时候定义宏 # 常用场景： # -DDEBUG 定义DEBUG宏，可能文件中有DEBUG宏部分的相关信息，用个DDEBUG来选择开启或关闭DEBUG示例代码：// -Dname 定义宏name,默认定义内容为字符串“1” #include <stdio.h> int main() { #ifdef DEBUG printf("DEBUG LOGn"); #endif printf("inn"); } // 1. 在编译的时候，使用gcc -DDEBUG main.cpp // 2. 第七行代码可以被执行注：使用 man gcc命令可以查看gcc英文使用手册，见下图1.3 【实战】g++命令行编译案例：最初目录结构: 2 directories, 3 files# 最初目录结构 . ├── include │ └── Swap.h ├── main.cpp └── src └── Swap.cpp 2 directories, 3 files1.3.1 直接编译最简单的编译，并运行# 将 main.cpp src/Swap.cpp 编译为可执行文件 g++ main.cpp src/Swap.cpp -Iinclude # 运行a.out ./a.out增加参数编译，并运行# 将 main.cpp src/Swap.cpp 编译为可执行文件 附带一堆参数 g++ main.cpp src/Swap.cpp -Iinclude -std=c++11 -O2 -Wall -o b.out # 运行 b.out ./b.out1.3.2 生成库文件并编译链接静态库生成可执行文件①：## 进入src目录下 $cd src # 汇编，生成Swap.o文件 g++ Swap.cpp -c -I../include # 生成静态库libSwap.a ar rs libSwap.a Swap.o ## 回到上级目录 $cd .. # 链接，生成可执行文件:staticmain g++ main.cpp -Iinclude -Lsrc -lSwap -o staticmain链接动态库生成可执行文件②：## 进入src目录下 $cd src # 生成动态库libSwap.so g++ Swap.cpp -I../include -fPIC -shared -o libSwap.so ## 上面命令等价于以下两条命令 # gcc Swap.cpp -I../include -c -fPIC # gcc -shared -o libSwap.so Swap.o ## 回到上级目录 $cd .. # 链接，生成可执行文件:sharemain g++ main.cpp -Iinclude -Lsrc -lSwap -o sharemain编译完成后的目录结构最终目录结构：2 directories, 8 files# 最终目录结构 . ├── include │ └── Swap.h ├── main.cpp ├── sharemain ├── src │ ├── libSwap.a │ ├── libSwap.so │ ├── Swap.cpp │ └── Swap.o └── staticmain 2 directories, 8 files1.3.3 运行可执行文件运行可执行文件①Plain Text# 运行可执行文件 ./staticmain运行可执行文件②# 运行可执行文件 LD_LIBRARY_PATH=src ./sharemain第二讲：GDB调试器前言：GDB(GNU Debugger)是一个用来调试C/C++程序的功能强大的调试器，是Linux系统开发C/C++最常用的调试器程序员可以使用GDB来跟踪程序中的错误，从而减少程序员的工作量。Linux 开发C/C++ 一定要熟悉 GDBVSCode是通过调用GDB调试器来实现C/C++的调试工作的；Windows 系统中，常见的集成开发环境（IDE），如 VS、VC等，它们内部已经嵌套了相应的调试器GDB主要功能：设置断点(断点可以是条件表达式)使程序在指定的代码行上暂停执行，便于观察单不执行程序，便于调试查看程序中变量值的变化动态改变程序的执行环境分析崩溃程序产生的core文件2.1 常用调试命令参数调试开始：执行gdb [exefilename] ，进入gdb调试程序，其中exefilename为要调试的可执行文件名## 以下命令后括号内为命令的简化使用，比如run（r），直接输入命令 r 就代表命令run $(gdb)help(h) # 查看命令帮助，具体命令查询在gdb中输入help + 命令 $(gdb)run(r) # 重新开始运行文件（run-text：加载文本文件，run-bin：加载二进制文件） $(gdb)start # 单步执行，运行程序，停在第一行执行语句 $(gdb)list(l) # 查看原代码（list-n,从第n行开始查看代码。list+ 函数名：查看具体函数） $(gdb)set # 设置变量的值 $(gdb)next(n) # 单步调试（逐过程，函数直接执行） $(gdb)step(s) # 单步调试（逐语句：跳入自定义函数内部执行） $(gdb)backtrace(bt) # 查看函数的调用的栈帧和层级关系 $(gdb)frame(f) # 切换函数的栈帧 $(gdb)info(i) # 查看函数内部局部变量的数值 $(gdb)finish # 结束当前函数，返回到函数调用点 $(gdb)continue(c) # 继续运行 $(gdb)print(p) # 打印值及地址 $(gdb)quit(q) # 退出gdb$(gdb)break+num(b) # 在第num行设置断点 $(gdb)info breakpoints # 查看当前设置的所有断点 $(gdb)delete breakpoints num(d) # 删除第num个断点 $(gdb)display # 追踪查看具体变量值 $(gdb)undisplay # 取消追踪观察变量 $(gdb)watch # 被设置观察点的变量发生修改时，打印显示 $(gdb)i watch # 显示观察点 $(gdb)enable breakpoints # 启用断点 $(gdb)disable breakpoints # 禁用断点 $(gdb)x # 查看内存x/20xw 显示20个单元，16进制，4字节每单元 $(gdb)run argv[1] argv[2] # 调试时命令行传参 $(gdb)set follow-fork-mode child#Makefile项目管理：选择跟踪父子进程（fork()）Tips:编译程序时需要加上-g，之后才能用gdb进行调试：gcc -g main.c -o main回车键：重复上一命令2.2 【实战】命令行调试给出一段简单代码，准备调试。C++#include <iostream> using namespace std; int main(int argc,char **argv) { int N = 100; int sum = 0; int i = 1; // calculate sum from 1 to 100 while (i <= N) { sum = sum + i; i = i + 1; } cout << "sum = " << sum << endl; cout << "The program is over." << endl; return 0; }第三讲：CMake前言：CMake是一个跨平台的安装编译工具，可以用简单的语句来描述所有平台的安装(编译过程)。CMake可以说已经成为大部分C++开源项目标配3.1 语法特性介绍基本语法格式：指令(参数 1 参数 2...)参数使用括弧括起参数之间使用空格或分号分开指令是大小写无关的，参数和变量是大小写相关的set(HELLO hello.cpp) add_executable(hello main.cpp hello.cpp) ADD_EXECUTABLE(hello main.cpp ${HELLO})变量使用${}方式取值，但是在 IF 控制语句中是直接使用变量名3.2 重要指令和CMake常用变量3.2.1 重要指令cmake_minimum_required 指定CMake的最小版本要求语法： cmake_minimum_required(VERSION versionNumber [FATAL_ERROR])# CMake最小版本要求为2.8.3 cmake_minimum_required(VERSION 2.8.3)project 定义工程名称，并可指定工程支持的语言语法： project(projectname [CXX] [C] [Java])# 指定工程名为HELLOWORLD project(HELLOWORLD)set 显式的定义变量语法：set(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])# 定义SRC变量，其值为sayhello.cpp hello.cpp set(SRC sayhello.cpp hello.cpp)include_directories 向工程添加多个特定的头文件搜索路径 --->相当于指定g++编译器的-I参数语法： include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)# 将/usr/include/myincludefolder 和 ./include 添加到头文件搜索路径 include_directories(/usr/include/myincludefolder ./include)link_directories 向工程添加多个特定的库文件搜索路径 --->相当于指定g++编译器的-L参数语法： link_directories(dir1 dir2 ...)# 将/usr/lib/mylibfolder 和 ./lib 添加到库文件搜索路径 link_directories(/usr/lib/mylibfolder ./lib)add_library 生成库文件语法： add_library(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2 ... sourceN)# 通过变量 SRC 生成 libhello.so 共享库 add_library(hello SHARED ${SRC})add_compile_options 添加编译参数语法：add_compile_options( ...)# 添加编译参数 -Wall -std=c++11 -O2 add_compile_options(-Wall -std=c++11 -O2)add_executable 生成可执行文件语法：add_executable(exename source1 source2 ... sourceN)# 编译main.cpp生成可执行文件main add_executable(main main.cpp)target_link_libraries 为 target 添加需要链接的共享库 -->相同于指定g++编译器-l参数语法： target_link_libraries(target library1 library2...)# 将hello动态库文件链接到可执行文件main target_link_libraries(main hello)add_subdirectory 向当前工程添加存放源文件的子目录，并可以指定中间二进制和目标二进制存放的位置语法： add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])# 添加src子目录，src中需有一个CMakeLists.txt add_subdirectory(src)aux_source_directory 发现一个目录下所有的源代码文件并将列表存储在一个变量中，这个指令临时被用来自动构建源文件列表语法： aux_source_directory(dir VARIABLE)# 定义SRC变量，其值为当前目录下所有的源代码文件 aux_source_directory(. SRC) # 编译SRC变量所代表的源代码文件，生成main可执行文件 add_executable(main ${SRC})3.2.2 CMake常用变量CMAKE_C_FLAGS gcc编译选项CMAKE_CXX_FLAGS g++编译选项# 在CMAKE_CXX_FLAGS编译选项后追加-std=c++11 set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")CMAKE_BUILD_TYPE 编译类型(Debug, Release)# 设定编译类型为debug，调试时需要选择debug set(CMAKE_BUILD_TYPE Debug) # 设定编译类型为release，发布时需要选择release set(CMAKE_BUILD_TYPE Release)CMAKE_BINARY_DIRPROJECT_BINARY_DIR_BINARY_DIR这三个变量指代的内容是一致的。如果是 in source build，指的就是工程顶层目录。如果是 out-of-source 编译,指的是工程编译发生的目录。PROJECT_BINARY_DIR 跟其他指令稍有区别，不过现在，你可以理解为他们是一致的。CMAKE_SOURCE_DIRPROJECT_SOURCE_DIR_SOURCE_DIR这三个变量指代的内容是一致的,不论采用何种编译方式,都是工程顶层目录。也就是在 in source build时,他跟 CMAKE_BINARY_DIR 等变量一致。PROJECT_SOURCE_DIR 跟其他指令稍有区别,现在,你可以理解为他们是一致的。CMAKE_C_COMPILER：指定C编译器CMAKE_CXX_COMPILER：指定C++编译器EXECUTABLE_OUTPUT_PATH：可执行文件输出的存放路径LIBRARY_OUTPUT_PATH：库文件输出的存放路径3.3 CMake编译工程CMake目录结构：项目主目录存在一个CMakeLists.txt文件两种方式设置编译规则：包含源文件的子文件夹包含CMakeLists.txt文件，主目录的CMakeLists.txt通过add_subdirectory添加子目录即可；包含源文件的子文件夹未包含CMakeLists.txt文件，子目录编译规则体现在主目录的CMakeLists.txt中；3.3.1 编译流程在 linux 平台下使用 CMake 构建C/C++工程的流程如下:手动编写 CMakeLists.txt。执行命令 cmake PATH生成 Makefile ( PATH 是顶层CMakeLists.txt 所在的目录 )。执行命令make 进行编译。# important tips . # 表示当前目录 ./ # 表示当前目录 .. # 表示上级目录 ../ # 表示上级目录3.3.2 两种构建方式内部构建(in-source build)：不推荐使用内部构建会在同级目录下产生一大堆中间文件，这些中间文件并不是我们最终所需要的，和工程源文件放在一起会显得杂乱无章。## 内部构建 # 在当前目录下，编译本目录的CMakeLists.txt，生成Makefile和其他文件 cmake . # 执行make命令，生成target make外部构建(out-of-source build)：推荐使用将编译输出文件与源文件放到不同目录中## 外部构建 # 1. 在当前目录下，创建build文件夹 mkdir build # 2. 进入到build文件夹 cd build # 3. 编译上级目录的CMakeLists.txt，生成Makefile和其他文件 cmake .. # 4. 执行make命令，生成target make3.4 【实战】CMake代码实践针对第五章写的两个小项目来写对应的CMakeLists.txt3.4.1 最小CMake工程# Set the minimum version of CMake that can be used cmake_minimum_required(VERSION 3.0) # Set the project name project (HELLO) # Add an executable add_executable(hello_cmake main.cpp)3.4.2 多目录工程 - 直接编译# Set the minimum version of CMake that can be used cmake_minimum_required(VERSION 3.0) #project name project(SWAP) #head file pat include_directories( include ) #source directory files to var add_subdirectory( src DIR_SRCS ) #add executable file add_executable(swap_02 ${TEST_MATH}) #add link library target_link_libraries(${FS_BUILD_BINARY_PREFIX}sqrt ${LIBRARIES})3.4.3 多目录工程 - 生成库编译# Set the minimum version of CMake that can be used cmake_minimum_required(VERSION 3.0) #project name project(SWAP_LIBRARY) #add compile options add_compile_options("-Wall -std=c++11") #set CMAKE_BUILD_TYPE set( CMAKE_BUILD_TYPE Debug ) # set output binary path set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) ############################################################ # Create a library ############################################################ #Generate the static library from the library sources add_library( swap_library STATIC src/Swap.cpp ) target_include_directories( swap_lib PUBLIC ${PROJECT_SOURCE_DIR}/include ) ############################################################ # Create an executable ############################################################ # Add an executable with the above sources add_executable( swap_01 main.cpp ) # link the new swap_01 target with the swap_lib target target_link_libraries( swap_01 swap_liby )第四讲：tasks和launch文件编写//launch.json { // 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。 // 欲了解更多信息，请访问: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "(gdb) 启动", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/build/kilo",//启动路径 "args": [], "stopAtEntry": false, "cwd": "${fileDirname}", "environment": [], "externalConsole": false, "MIMode": "gdb", "setupCommands": [ { "description": "为 gdb 启用整齐打印", "text": "-enable-pretty-printing", "ignoreFailures": true }, { "description": "将反汇编风格设置为 Intel", "text": "-gdb-set disassembly-flavor intel", "ignoreFailures": true } ], "preLaunchTask": "cppbuild",//执行launch之前先执行tasks的某个任务 } ] }//tasks.json { "options": { "cwd": "${workspaceFolder}/build"//工作路径 }, "tasks": [ { "type": "shell", "label": "cmake",//任务一先执行cmake "command": "cmake", "args": [ ".."//相当于cmake .. ] }, { "label": "make",//任务二make "group": { "kind": "build", "isDefault": true }, "command": "make", "args": [ ] }, { "type": "cppbuild",//任务三执行 "label": "C/C++: gcc 生成活动文件", "dependsOrder": "sequence",//按照任务顺序执行 "dependsOn":[ "cmake", "make" ], "command": "/usr/bin/gcc", "args": [ "-fdiagnostics-color=always", "-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}" ], "options": { "cwd": "${fileDirname}" }, "problemMatcher": [ "$gcc" ], "group": { "kind": "build", "isDefault": true }, "detail": "调试器生成的任务。" } ], "version": "2.0.0" }
在Bing搜索windows11进入下载页面下载镜像搜索微PE制作启动盘微星主板重启时按F11更改启动项使用Diskgenuis删除要重装硬盘的所有分区，然后保存进入U盘选择镜像双击，双击Step，安装，选择没有激活码，选择版本，然后选择那个未分配的硬盘，直接下一步，不用新建安装完后断网，不要联网，一定不要！！！然后一直下一步让你进行联网的界面按Shift + F10，输入oobe\bypassnro,然后回车后重启重启后也不要联网！！！进行有限的操作用户名一定不要用中文！！！！！然后不要设置密码（后面登录账户号会重新设置）进入系统后打开资源管理器，将资料盘盘符更改为E(事先拔掉U盘)计算后C盘容量，例如1907.71的硬盘，那我想给C盘分配500G，那么就（1907-500）*1024，右键我们装了系统的硬盘，压缩卷，压缩容量就是上面计算的数字，建议给C盘留个零头，几十MB即可，那么C盘容量会是整整500GB,在我的电脑中显示，要不然强迫症会疯掉，C盘容量为499.9，很奔溃压缩完新建空闲容量为新盘即可将我的电脑的桌面，音乐，文档那些全部重新更改路径，我的习惯是全部改为E:\Desktpos,类似这种，要不然qq,微信，桌面等等的文件会默认保存在C盘，久而久之就满了激活可以用HEU的数字激活网址当然也可以在咸鱼买激活码一定要点开系统更新把所有能更新的全部更新了，所有的驱动，显卡，显示，等驱动都会更新 更新顺序是先全部更新系统设置里面的，不要手动点多项里面的下载，然后更新完以后再更新主板里面的驱动，有些驱动是重复更新的，就保留主板的吧，再用DirectX_Repair更新一遍驱动，这个驱动不是最新的，最好再用这个更新一遍，我的永劫无间用第一个更新完之后还是闪退，更新完第二个就好了，微软常用运行库合集再来一遍就差不多了千万千万别改这个选项，别听营销号的，这个地方只要你更改到别的盘，那个盘的权限就全部提升了，然后你打开应用的时候就有你爽的了，这些东西也其实就存一点微软商店下载的一点点东西，也不会占用太多，无所谓的，反正别改，就让在C盘部分机型有电源选项里有个卓越性能，选中这个能发挥电脑的很大性能。关闭电源按键的这个选项打开设备管理器，关闭这几个设备的省电模式游戏帧率不低但是感觉卡打游戏的同学一定得安装这个工具的增强版，更新库，DirectX_Repair增强版)，否则你玩游戏的时候虽然帧率很高但是仍然感觉很卡，如果安装过程中遇到有些库失败了，重新打开工具，选项中打开修复失败是打开调试模式，然后有好多应用会正在使用这个动态链接库，你可以安装火绒，安装火绒里面的文件粉碎，找到文件强制删除了用文件粉碎工具就行，然后回去接着全部修复后，重启，开机后再检查一次游戏闪退我玩永劫无间会闪退，查了好久才发现是运行库的问题，安装这个工具即可，最好用最新的，网址给出的可能已经过期了，最好自己找到最新的微软常用运行库合集，这个库要比上面的工具新一点，用这个关闭Windows Terminal多行粘贴警告详情看这个教程设置主机远程唤醒教程win11首次打开应用缓慢教程Win11删除右键AMD Software 具体操作如下： 1. 按【 Win + X 】组合键，或右键点击任务栏上的【Windows开始徽标】，在打开的隐藏菜单项中，选择【运行】； 2. 运行窗口，输入【regedit】命令，按【确定或回车】打开注册表编辑器； 3. 用户用户账户控制窗口，你要允许此应用对你的设备进行更改吗？点击【是】； 4. 这时候就可以将注册表打开了，删除注册表HKEY_CLASSES_ROOT\PackagedCom\Package\AdvancedMicroDevicesInc-RSXCM_22.10.0.0_x64__fhmx3h6dzfmvj\Server\1里的ApplicationId的值软件推荐微星小飞机用于监控游戏的帧率，显卡cpu的占用情况，功耗，温度 汉化找这个up主，我是阿朱吖uTools各种方便的小工具吧windows center help可以屏幕居中应用窗口，强迫症狂喜，也可以更改窗口大小比例链接我的比例是48，60感觉最舒服TranslucentTB这个可以在桌面时调整状态栏为全透明，桌面更好看，可以在微软商店下载Internet Download Manager下载工具，不用说了吧，开心链接，懂得都懂QQ截图独立版QQScreenShot，下载链接)，不用启动QQ也可以用网盘文件本地打开可以实现网盘视频无压缩画质打开，CloudDrive2福昕pdf阅读器感觉功能挺全，可以在这下载开心版，oxit Software，网站)，一般是下载这个版本Foxit PDF Editor图吧工具箱验机，看看验机信息，双烤啥的都可以用这个
Windows Terminal每次粘贴命令的时候都有警告，虽然本质上是为了安全。对于我一这种一天粘贴10遍以上的用户来说，每次都提示太麻烦了。那么还是把它关掉吧。首先右键win健打开终端然后打开终端的设置点左下角的"打开JSON文件"添加下面代码//关闭多行粘贴警告 "multiLinePasteWarning":false,这样就没有警告啦，太爽了。
我发现每次出现第一次启动应用变卡的时候，任务管理里面一个名为Antimalware Service Executable的进程都在占用CPU，经过查询可得这个进程就是Windows安全中心的进程。但是你要注意，在22H1以上的Win11中，不能简单禁用Windows安全中心（Windows Defender），如果你一旦这样做，资源管理器等一系列自带应用将会出问题，并变得奇卡无比。真正的解决方法是：在Windows安全中心中：“应用和浏览器控制”——“智能应用控制”——选择关闭。此时你会发现打开应用再也不会出现第一次运行缓慢，后面再开就没事的情况了。详情可以参照微软官网的说明什么是智能应用控制?如果你没有这个选项，请更新到最新的Win11鸣谢在此鸣谢老哥解决该问题，原链接
BIOS 设置* 高级–整合周边设备–网卡ROM启动，设置为允许* 高级–电源管理设置–Erp ，设置为禁止* 高级–唤醒事件设置–PCIE设备唤醒和网络唤醒，设置为允许Windows 10 设置* 控制面板–所有控制面板项–网络连接* 在网卡适配器点击鼠标右键–属性，弹出的属性对话框中* 选择网络选项卡–配置* 选择高级选项卡，将魔术封包唤醒设置为开启* 电源管理选项卡，勾选下面两个选项，允许此设备唤醒计算机。重点：关闭win10的快速启动，设置-系统-电源和睡眠-其他电源设置-选择电源按钮功能-更改当前不可用设置-取消勾选“启用快速启动”-保存修改之后关机看到网口还在亮灯就可以测试唤醒啦。
网站备案成功后需注意以下事项：按照非经营性互联网信息服务备案管理办法，在您的网站首页底部中间位置，放置您的备案号并链接至工信部。请您务必保证网站内容与备案信息一致，一旦被查出不一致情况将面临被关停整顿风险。按照《中华人民共和国计算机信息系统安全保护条例》等相关法律法规，网站开通之日起30日内到公司实际经营地或个人常住地公安机关履行公安备案手续，具体要求请参见关于公安备案通知。依据《非经营性互联网信息服务备案管理办法》第二十三条规定，如备案信息不真实，将关闭网站并注销备案。若您的备案信息发生变更，请您尽快申请变更备案。目前我的这个版权添加是在Handsame主题上进行修改的，别的主题也一样哦\~CSS样式添加：打开Typecho网站后台-》外观-》设置外观-》开发者设置-》自定义CSS，添加以下CSS样式。.github-badge { display: inline-block; border-radius: 4px; text-shadow: none; font-size: 12px; color: #fff; line-height: 15px; background-color: #ABBAC3; margin-bottom: 5px; } .github-badge .badge-subject { display: inline-block; background-color: #4D4D4D; padding: 4px 4px 4px 6px; border-top-left-radius: 4px; border-bottom-left-radius: 4px; } .github-badge .badge-value { display: inline-block; padding: 4px 6px 4px 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; } .github-badge .bg-brightgreen { background-color: #4c1 !important; } .github-badge .bg-green { background-color: #97CA00 !important; } .github-badge .bg-yellow { background-color: #dfb317 !important; } .github-badge .bg-yellowgreen { background-color: #a4a61d !important; } .github-badge .bg-orange { background-color: #fe7d37 !important; } .github-badge .bg-red { background-color: #e05d44 !important; } .github-badge .bg-blue { background-color: #007ec6 !important; } .github-badge .bg-grey, .github-badge .bg-gray { background-color: #555 !important; } .github-badge .bg-lightgrey, .github-badge .bg-lightgray { background-color: #9f9f9f !important; }将CSS样式添加后，还需要添加展示的内容，以及将展示的内容和CSS进行关联。页面添加：在网站目录/usr/theme/你的主题/component/footer.php进行修改。这个地方↓↓↓替换成以下内容。(里面的文字，链接记得换成你自己的哦) Copyright © <?php echo date("Y-M");?> Powered by Wasabi 山葵酱 京 ICP备 XXXXXXXX号 小程序 山葵酱部落格 以上步骤修改完成之后，清除缓存，刷新博客试试，是不是博客看起来比之前的顺眼多了。还有更多样式，你们可以自己看着改成自己的东西，代码都在下方啦\~HTML代码： buildpassing buildfailure tests185 passed, 7 skipped testsinaccessible npmv5.5.1 node>=0.4.0 gemv0.2.5 stars☆☆☆☆☆ node★★★☆☆ colorbrightgreen colorgreen coloryellowgreen coloryellow colororange colorred colorlightgrey colorgrey colorblue 个人备份 Copyright © <?php echo date("Y-M");?> Powered by Amarantos475 陇 ICP备 2023000056号-1 转载转载自链接
1. 安装sublime text进入sublime官网下载sublime的安装包（当然也可以在官网下载页面下载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官网下载msys2，如果是windows 64位，就选择 msys2-x86_64.exe2.1.2 msys2的安装msys2默认安装在C:\msys64，在这里我自己不做修改，安装路径读者可自行决定。后面只要一直点next就行了。安装完毕的界面如下2.1.3 msys2的配置打开C:\msys64\etc\pacman.d可以看到mirrorlist.mingw32、mirrorlist.mingw64、mirrorlist.msys三个文件。在文件mirrorlist.mingw32中加入：Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686在文件mirrorlist.mingw64中加入：Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64在文件mirrorlist.msys中加入：Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch这三行是从清华镜像下载软件，速度会快很多。随后打开msys2，输入pacman -Sy同步软件包数据库。然后再输入pacman -Su更新软件包。在此期间msys2提示你输入y之后会关闭，重新打开再输入一遍pacman -Su即可。2.2 安装并配置Clang2.2.1 安装Clang和LLVM打开msys2，输入：pacman -S mingw64/mingw-w64-x86_64-make mingw64/mingw-w64-x86_64-gdb mingw64/mingw-w64-x86_64-clang按照提示，就可以完成Clang的安装了（顺便安装了gdb和make）。再执行如下语句完成Clangd的安装。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 variables3、选择environment variables4、选择Path5、点击Edit6、点击new7、最后点OK即可。2.2.3 测试是否安装成功首先进入命令提示符：（或者Win+R输入cmd回车）测试Clang是否安装，输入clang -v上面这样就是安装成功了。测试Clangd是否安装，输入clangd即可：可以看到已经启动了clangd后台，安装成功。3. 配置sublime text4sublime text4并非开源免费，但是你不交钱可以一直免费用下去。它只不过会时不时弹窗提醒你一下要交钱（相当于求你打赏）这里我以我的需求为例，我想要在某个文件夹下面创建很多个xxx.cpp文件（一看就是在刷题呢）然后可以一键编译运行，产生的编译文件（xxx.exe）不会污染原目录下的cpp文件。首先我想形成这样一个目录结构：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里面本来就有的全部删光，换成这些：{ // 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 安装TerminusTerminus是一个sublime插件，目的就是补全刚刚所说的缺点，实现sublime内置终端。Ctrl+Shift+P打开sublime的命令面板。输入PCI然后回车（package control install）输入terminus，回车开始安装，可以看到左下角的安装提示。重启sublime（sublime一般不需要每次改动都重启，但是遇事不决重启总归没错）进入Terminus的设置：Preferences->Package Settings->Terminus->Settings照旧，把里面的东西删了改成（注意到两端一定得是花括号）：{ "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添加一些选项。{ // 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下配置（我自用的，和上面的效果一模一样）{ // 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 TerminusOK，简直完美。嗯？居然想要享受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-jsonlsp-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中，写入这样几行：{ // 在主页面只显示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, } }但是光在这里设置clang-tidy是没有用的，还得在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' ...3.4.5 配置clang-format写代码怎么能少的了自动格式化呢。clang-format的配置很简单，只需在project/code下新建.clang-format文件，写入以下内容：当然这只是我的配置，大部分都是抄的网上的，可以根据自己的喜好改动。--- # 语言: 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. 配置Sublimesublime主要有两个配置文件，一个是Preferences->Settings中，一个是Preferences->Key Bindings。进入以后左侧是默认配置，无法修改的。右侧是自定义配置，自定义配置可以覆盖默认配置选项。4.0 设置Tab长度我喜欢用四空格的Tab，不会有人立场不一样吧？4.1 sublime偏好设置OK，我们先改Preferences->Settings。这是我的个人喜好：{ "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，我的配置是：[ // 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，输入：pacman -S mingw64/mingw-w64-x86_64-lldb5.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里面是这样的：{ "folders": [ { "path": ".", } ], "debugger_configurations": [ { "type": "lldb", "request": "launch", "name": "Launch", "program": "${folder}/bin/${file_base_name}", "args": [], "cwd": "${folder}" }, ], }勉强可以用，但是更优的配置如下：{ "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 ControlPackage 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字体的下载链接解压以后双击Monaco点击install就行了然后在命令面板输入debugger settings，进入debugger设置界面。黏贴如下设置：{ // 开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的控制台，一些报错都可以在上面找到并解决。先按Ctrl K再按Ctrl B可以打开/关闭侧边栏Ctrl+P 搜索框Ctrl+G 跳转到第几行Ctrl+W 关闭当前打开文件Ctrl+Shift+W 关闭所有打开文件Ctrl+Shift+V 粘贴并格式化Ctrl+D 选择单词，重复可增加选择下一个相同的单词Ctrl+Shift+D 复制光标所在整行，插入到下一行Ctrl+L 选择行，重复可依次增加选择下一行Ctrl+Shift+L 选择多行Ctrl+Shift+Enter 在当前行前插入新行Ctrl+X 删除当前行Ctrl+M 跳转到对应括号Alt+鼠标拖动 多光标选择Ctrl+J 选择标签内容Ctrl+F 查找内容Ctrl+N 新建窗口Ctrl+/ 注释Ctrl+Shift+K 删除整行Tab 向右缩进Shift+Tab 向左缩进Ctrl+Z 撤销Ctrl+Y 恢复撤销F6 单词检测拼写Ctrl+P 打开搜索框Ctrl+Tab 按文件浏览过的顺序，切换当前窗口的标签页。输入当前项目中的文件名，快速搜索文件输入@和关键字，查找文件中函数名输入:和数字，跳转到文件中该行代码输入#和关键字，查找变量名9. 关闭激活弹窗1 在软件的安装目录找到 sublime_text.exe 文件。2 这里推荐使用： 【hexed】 在线十六进制编辑器，打开 sublime_text.exe 文件。hexed在线网站3 然后查找以下字节并且替换（不同的软件版本替换的内容略有不同，一定要看好软件版本）版本：80 78 05 00 0F 94 C1 替换为 C6 40 05 01 48 85 C910.引用链接,感谢原作者的付出https://zhuanlan.zhihu.com/p/586687010https://www.cnblogs.com/nangch/p/5341067.htmlhttps://www.bilibili.com/read/cv12390518
记得使用数据库前要把数据库编码改成utf8mb4，建议先备份数据库然后直接重建一个utf8mb4的数据库，然后导入，把根目录的config.inc.php相关文件改一下就好。然后执行这些操作alter table typecho_comments convert to character set utf8mb4 collate utf8mb4_unicode_ci; alter table typecho_contents convert to character set utf8mb4 collate utf8mb4_unicode_ci; alter table typecho_fields convert to character set utf8mb4 collate utf8mb4_unicode_ci; alter table typecho_metas convert to character set utf8mb4 collate utf8mb4_unicode_ci; alter table typecho_options convert to character set utf8mb4 collate utf8mb4_unicode_ci; alter table typecho_relationships convert to character set utf8mb4 collate utf8mb4_unicode_ci; alter table typecho_users convert to character set utf8mb4 collate utf8mb4_unicode_ci;执行上述sql语句来修改表的编码，如果用的是宝塔面板和MySQL数据库，一般有可视化的phpmyadmin界面，可以在phpmyadmin的控制台里面执行上面的语句，如果是服务器可以在服务器上连接mysql后执行。最后将 Typecho 目录下的config.inc.php 配置文件中数据库定义参数中的 charset 为 utf8mb4：$db->addServer(array ( 'host' => localhost, 'user' => 'root', 'password' => 'root', 'charset' => 'utf8mb4', //修改这一行 'port' => 3306, 'database' => '' ), Typecho_Db::READ | Typecho_Db::WRITE);