之前在Ubuntu下一直用的是Gedit写代码,非常的朴素,用户体验也挺好的。

近日暴发户了一波买了人生第一台一手笔记本(以前用的都是家里人用过的)(雾),装的windows就懒得装双系统了难得弄。

然后编程环境的话。。。高分辨率屏幕下devc++就是一坨稀饭,gedit虽然有for win但是没了外部工具就太不爽了,codeblock太丑codelite死活配置不好。。。

于是我想起了很久以前用过的VSCode,以前看到Json配置文件就蒙圈,现在搞了搞Js就感觉良好了。

(不知道以前我用vscode的时候是哪个逗比跟我讲vscode没法一键编译也没法图形界面调试,弄得我对vscode的印象特别不好)

好吧说了这么多废话进入正题吧。

1. 预备

首先你的VSCode可能是英文界面,我建议你换成中文,安装一个叫做Chinese (Simplified) Language Pack for Visual Studio Code的插件就行了。

然后再安装微软官方的c/c++插件:C/C++(ms-vscode.cpptools)

另外当然的——你需要先装好g++与gdb,这里推荐tdm-gcc,比mingw官网的在线安装包好用了不知道几百倍,自动写入到PATH,方便得很。

2. 一些设置

下面说一些与XZY习惯有关的设置。

进入设置界面,通过搜索可以找到:

  • Editor: Insert Spaces:用空格代替制表符,以XZY的习惯是关掉
  • Window: Title Bar Style:窗口顶栏样式,很明显custom更好看(而且native在Ubuntu下有一定几率出现菜单栏看不清的情况)
  • Editor: Font Size:字体大小
  • Editor: Snippet Suggestions:代码片段的排列位置,后面会具体讲
  • Editor: Tab Completion:Tab自动补全代码,用于后面的代码片段功能
  • Editor: Accept Suggestion On Enter:按Enter是否补全建议,容易和“插入新行”产生歧义,因此一般是关掉
  • editor.rulers:(这个设置无法在图形化界面内直接改)代码标尺,就是编辑器里的一条竖线用来防止一行写太多字
  • Files: Encoding:默认编码,Windows需要设置为GBK2312(即简体中文),Ubuntu下用UTF-8就行了
  • Files: Auto Guess Encoding:自动匹配文件的编码,一般是开启

因此配置出来的settings.json大概就是这样的:

{
    "editor.insertSpaces": false,
    "window.titleBarStyle": "custom",
    "editor.fontSize": 15,
    "editor.rulers": [
        80
    ],
    "editor.snippetSuggestions": "top",
    "editor.tabCompletion": "onlySnippets",
    "editor.acceptSuggestionOnEnter": "off",
    "files.autoGuessEncoding": true
}

Windows可能还需要加入:"files.encoding": "gb2312"

另外还有一些字体啥的这里就不做过多赘述了。

3. 一键编译

首先我们要确定一个工作目录的概念。

我们的一键编译和图形界面调试的配置都是对于工作目录而言的。

想我就是在“我的文档”中建了一个叫做cpp的文件夹,然后在里面每天都新建一个文件夹,每天的代码分别放在每天的目录里。

那么我可以以这个cpp文件夹作为自己的工作目录。

我们用vscode打开工作目录,然后如果里面没有一个叫做.vscode的子文件夹就新建一个。比如我的就是cpp/.vscode(这个在Ubuntu下是一个隐藏的文件夹)。vscode的工作区配置文件都将放在这个目录里。

然后在.vscode中新建一个叫做tasks.json,直接把以下内容黏贴进去:

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build c++",
            "type": "shell",
            "command": "g++",
            "args": ["-o", "${fileDirname}/${fileBasenameNoExtension}", "${fileDirname}/${fileBasename}", "-g"],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}

然后你可以在你的工作目录下的任意一个位置放一个c++代码,然后按下ctrl+shift+b,你就会发现——哇,它的确能一键编译!

4. 图形界面调试

依然很简单,用XZY配置好的json就行啦。

在.vscode文件夹下新建一个文件叫做launch.json,并写入以下内容:

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": true,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

如果你是Windows,有可能需要在"MIMode": "gdb"那一行底下添加一行:"miDebuggerPath": "path/to/gdb",,其中path/to/gdb是你gdb的绝对路径,比如XZY就要把它替换成C:\\TDM-GCC-64\\bin\\gdb.exe,注意反斜杠要双写,和C++一个套路。

然后你打开工作目录下的一个C++代码,按f5,你就会发现——哇,它的确能在图形界面调试!

5. 代码片段

这个用过代码片段的同学们就知道这是加速写代码的神器QwQ

按一个tab就能补全模板,熟练后写起来感觉像在飞~

ctrl+shift+p,输入configure user snippets,然后鼠标单击选中搜索出来的那一项,然后点C++那一项,弹出来要你编辑cpp.json,这个jsonXZY从Gedit抄了一份过来,还抄了蛮久的,直接贴进去就行了。

(这个代码风格是XZY的。。。不习惯的同学可以自己改一改。。。)

cpp.json:

{
    // Place your snippets for cpp here. Each snippet is defined under a snippet name and has a prefix, body and 
    // description. The prefix is what is used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
    // $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. Placeholders with the 
    // same ids are connected.
    // Example:
    // "Print to console": {
    //  "prefix": "log",
    //  "body": [
    //      "console.log('$1');",
    //      "$2"
    //  ],
    //  "description": "Log output to console"
    // }
    "do ... while": {
        "prefix": "do",
        "body": [
            "do",
            "{",
            "\t$1",
            "} while ($2);"
        ]
    },
    "for loop": {
        "prefix": "for",
        "body": "for (${1:int} ${2:i} = ${3:1}; ${2:i} <= ${4:count}; ${2:i} += ${5:1})"
    },
    "if ..": {
        "prefix": "if",
        "body": "if (${1:condition})"
    },
    "IN": {
        "prefix": "IN",
        "body": [
            "template<typename _Tp> inline void IN(_Tp& dig)",
            "{",
            "\tchar c; bool flag = 0; dig = 0;",
            "\twhile (c = getchar(), !isdigit(c)) if (c == '-') flag = 1;",
            "\twhile (isdigit(c)) dig = dig * 10 + c - '0', c = getchar();",
            "\tif (flag) dig = -dig;",
            "}"
        ]
    },
    "#include \"..\"": {
        "prefix": "inc",
        "body": "#include \"${1:file}\""
    },
    "#include <..>": {
        "prefix": "Inc",
        "body": "#include <${1:file}>"
    },
    "main": {
        "prefix": "main",
        "body": [
            "int main(int argc, char const* argv[])",
            "{",
            "\t$1",
            "\treturn 0;",
            "}"
        ]
    },
    "namespace ..": {
        "prefix": "namespace",
        "body": [
            "namespace ${1:ns}",
            "{",
            "\t$2",
            "};"
        ]
    },
    "struct ..": {
        "prefix": "struct",
        "body": [
            "struct ${1:name}",
            "{",
            "\t${0:/* data */}",
            "};"
        ]
    },
    "template <typename ..>": {
        "prefix": "template",
        "body": "template<typename ${1:_InputIter}>"
    },
    "typedef": {
        "prefix": "td",
        "body": "typedef ${1:type} ${2:newtype};"
    },
    "while": {
        "prefix": "while",
        "body": "while ($1)"
    }
}

The End

至此,VSCode应该能满足大部分的OIer的需求啦,你还能装一些主题以及很多很有趣的插件,包括可以写Markdown啥的QwQ…

分类: 文章

XZYQvQ

炒鸡辣鸡的制杖蒟蒻一枚QvQ

发表评论

电子邮件地址不会被公开。 必填项已用*标注

你是机器人吗? =。= *