Update(2019.01.26)

现在 VSCode 的官方 C++插件制杖得一匹

更新后的插件自带一个无法自定义的 “Code snippets”(代码片段),和我的代码风格又不同,而且在自动补全中总是排在你自定义的代码片段前面,一按 tab 就补全它的代码片段

然后 debug 也是,鼠标悬停显示变量的值,然后只要你一不小心把鼠标悬停在一个数组上了,那恭喜你,聪明的官方 C++插件将会试图去获取整个数组的值并显示出来,然后你就死机了

因此我推荐简洁得多的 C++ Intellisense,没有花里胡哨的功能,没有全是 bug 的莫名其妙图形调试,多好啊

真不知道官方那些程序员是干什么吃的,自己写完了插件不晓得自己用用看吗???

(以下是原文)


之前在 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. 一些设置

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

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

  • Editor: Insert Spaces:用空格代替制表符,以 Remmina 的习惯是关掉
  • 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. 图形界面调试

依然很简单,用 Remmina 配置好的 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 的绝对路径,比如 Remmina 就要把它替换成 C:\\TDM-GCC-64\\bin\\gdb.exe,注意反斜杠要双写,和 C++一个套路。

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

5. 代码片段

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

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

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

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

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)"
    }
}

6. 快速打开终端

安装一个叫做 Terminal Here 的插件,然后去快捷键设置里设置一下 Terminal Here 项的快捷键就行了。

7. 隐藏侧边活动栏

去快捷键设置里设置一下 Toggle Activity Bar Visibility 项的快捷键就行了。

The End

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

分类: 文章

Remmina

No puzzle that couldn't be solved.

0 条评论

发表评论

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