目录
  • 概述
  • 配置sublime
  • Terminus
  • 配置LSP + LSP-clangd
    • mac下安装clangd
    • Debian(testing)安装clangd和clang
    • windows下安装llvm
    • 配置LSP-clangd
  • 配置clang-format
    • 命令行使用sublime text4打开文件
      • leetcode相关配置

        概述

        涉及以下插件的安装和配置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 clangdsudo apt install llvmsudo 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.jsonCMakeLists.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

        安装好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
        声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。