8月21号更新,添加 windows 配置。其实 windows 的方案早就有了,只是放假来不及写


在 linux 和 vscode 上中毒这么久,咱自认为咱有如题目所写的自信。目标:快速、便捷、优雅

坑已挖好,请跳
坑已挖好,请跳

在开始之前,你要知道

如果平时 IDE 不是 VSCode,就没有必要陪咱踩水坑。

一定要跟着操作一遍,不然可能理解不到咱的意思。

平时就不用 c++ 插件,考场才能从容不迫鸭。

不可能实现的

  1. 中文环境
  2. 可视化调试
  3. 高级补全
  4. 字体

环境

由于虚拟机玩不来,所以原谅咱直接用本机(Ubuntu 24.04 LTS and VSCode 1.91 and chinese)的图片 。。不过以下所有内容咱均是在 NOI Linux 2.0 上测试过的。

但是请你自己为自己着想,在全程断网的虚拟机(推荐直接不配置网卡)中用 NOI Linux 2.0 and VSCode 1.54 进行以下练习!

没必要实体机上 NOI Linux。不得不说,实体机装 NOI Linux 真是**(自行打码,不是违禁词哦),不要问咱怎么知道的!

实现了的

咱会把编译(build)和测试(test)分开讲解。

一键编译

编辑生成任务

新建 ./.vscode/tasks.json 并输入:

点击放大
点击放大

啊,你说什么?记不住?抱歉,VSCode 会自动提供补全,你需要记住的只有以下一点关键字(因为 markdown 效果不好所以用图片了

如果你还是记不到第二级的 6 个关键字,可以尝试合起来,记作 log cat (日志猫?)。学废了么?

注意

  1. group 选倒数第二个 。
  2. type 选第二个。
  3. 同级之间有逗号。
  4. 一个字母的地方,直接输入这个字母,然后直接按 EnterTab 以接受第一个补全。
  5. 一定要练习一下!不然你不会知道 args 那里如果像 关键字图片 里那样写作一行会出问题。
  6. 一定要在 NOI Linux 中练习!不然你不会知道 ${file}${fileDirname} 在 VSCode 旧版本中不提供补全。

一些补充

解释一下 ${ }
表达式含义例子
${file}当前打开的文件的绝对路径/home/sin/Desktop/1/test.cpp
${fileDirname}当前打开的文件的完整目录名/home/sin/Desktop/1
${fileBasename}当前打开的文件的文件名test.cpp
${fileBasenameNoExtension}当前打开的文件的文件名 (不包含文件扩展名)test
关于生成的程序

因为使用的是 -o ${file}.exe,所以生成的程序为 test.cpp.exe。实际上 linux 的运行文件没有后缀名的概念,咱用 .exe 主要是从 windows 带过来的习惯,区分代码和程序。

参数可以自行发挥

以上是精简模式,实际上参数可以自行发挥,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// json 里实际上不能有注释
"args": [
// 始终使用彩色信息 (不知道有什么用
"-fdiagnostics-color=always",
"-g",
"${file}",
"-std=c++14",
// 两个警告参数
"-Wall",
"-Wextra",
"-o",
// 相比与 "${file}.exe",可以去掉中间的 .cpp。
// 这里 .exe 也可以不要
"${fileBasenameNoExtension}.exe",
// 侦测RE
"-fsanitize=address,leak,undefined"
]
还可以再精简一些?

实际上 optionsargstype 属性不是必要的。

这里我们只用 "cwd": "${fileDirname}" 设置了运行的位置。

如果文件都是以绝对路径传入(使用 ${file}),或是所有文件都在工作区根目录上,就不需要这一项。

所有文件都在工作区根目录上 是什么意思?建了子文件夹的就不是。如上面的 tasks.json 就是在 .vscode 子文件夹下。

所以说,如果写对拍,写 ./duipai/duipai.cpp,而且还是 -o ${fileBasenameNoExtension},就要注意了。

你也可以用 -o ${fileDirname}/{fileBasenameNoExtension},使其成为绝对路径。

参数列表实际上只是,加上空格,然后顺次接在 command 的后面。所以你可以直接把所有参数写在 command 的后面。

只是如果某一项里有空格,它会莫名其妙地都包上一层单引号。。所以不能前面一段参数,后面一段参数。

咱把它拎出来,是为了凑齐cat是为了在写多个参数时优雅一些。

这里 VSCode 给了两种选择 process(作为进程) 和 shell(作为命令)。

虽然默认为 process,但是咱并不了解。

你可以自行研究,咱不负责。

绑定快捷键

即使你知道可以使用 Ctrl+Shift+B 来运行生成任务,也不能说是一键编译。

按快捷键 Ctrl+K Ctrl+S 或点击左下方齿轮再点击 Keyboard Shortcuts,搜索 tasks.build,右键第一个,菜单里选有 Add(添加)或 Change(修改)的那一项,在键盘上按一个心仪的键(比如F6),然后 ENTER。冲突什么的不用管。

添加快捷键
添加快捷键

这一步一定要在 English 环境下练习哦。

一键运行

编辑测试任务并绑定快捷键

测试任务这个板块咱分出了一些小点。所以这里第一步没什么重点,参考上面 build 即可。

group 选最后一个。如果上面用的 ${fileBasenameNoExtension}.exe 记得跟着改。

A+B Problem 效果
A+B Problem 效果

绑定快捷键同上。咱用的 F5

独立运行窗口

目前程序已经可以在 VSCode 的集成终端内运行了,但是有许多像咱一样的小伙伴希望程序运行在独立窗口。

这里用到 gnome-terminal 命令,格式 gnome-terminal -- 要执行的内容

1
2
3
4
5
6
"command": "gnome-terminal",
"args": [
"--",
"${file}.exe"
],
"type": "shell"

pause

然后,你会发现窗口是打开了,但运行完结果都没看到就退出了。

两个方法,改终端配置(不推荐),或着写一个 pause 命令(linux 没有这个命令)。

改终端配置的方法

真的不建议,所以一张图带过。

新建 ./pause 并编辑:

1
2
3
4
5
6
7
#!/bin/bash

echo ""
echo " ----------------------------------------- "
echo " Press any key to continue . . ."
read -s -n 1

核心代码只有一句 read -s -n 1,不做解释。简单吧。

打开终端,cd 到这个位置,输入 ./pause,回车。效果如何?

为了避免麻烦,咱们把它丢到 环境变量 里。

cp 是复制命令。

sudo 用户密码应该会提前告知,如果没告知就问,如果不说就试 123456

然后该改 tasks.json

1
2
3
4
5
6
7
"command": "gnome-terminal",
"args": [
"--",
"bash",
"-c",
"\"${file}.exe; pause\""
]

这里咱套了个 bash,不然 pause 会和 gnome-terminal 命令同级。注意后面转义了一对双引号。

注:gnome-terminal 命令在打开窗口后就结束了,与程序的运行不相干。

栈空间

Linux 的栈空间不能在编译时控制,只能运行前用 ulimit -s 524288 调。

关于 ulimit,自己查去!

但是这种修改是临时的,且只对同一终端有效。像咱这种新建终端的网上根本找不到第二家,咱硬是磕了几个月都没想到办法。想到办法之后就来发文了。看咱多好心!

1
2
3
4
5
6
7
"command": "gnome-terminal",
"args": [
"--",
"bash",
"-c",
"\"ulimit -s 524288; ${file}.exe; pause\""
]

${file}.exe 前面加上 ulimit -s 524288; ……至于为什么这么简单的东西想了几个月这个问题,咱的回答是:咱之前一直用的 独立运行窗口 那一版本的 tasks,然后直接在代码末尾 system("pause");……直到偶然看到 bash -c " " 才脑袋开窍的。

对了,千万不要尝试在实体机上修改系统文件以永久开大栈空间,除非你想体验在 Ubuntu 紧急模式中对着原始的 shell 界面恢复你刚刚修改的那个文件。

提高体验

想必你已经注意到了,咱的终端是透明的!这样不但好看,而且可以方便地比较多个运行结果。

真的很简单,所以一张图搞定。

一键编译运行

如果你需要,就再写一个任务。

1
2
3
4
5
6
7
8
9
{
"label": "build and test",
"group": {
"kind": "build",
"isDefault": true
},
"dependsOn": ["build", "test"],
"dependsOrder": "sequence"
}

然后需要把上面 build 任务的 group 属性删掉。VSCode 给 tasks 只分配了两个一键调用的位置, 一键编译一键编译运行 只能选一个(显然你也只需要一个)。

由于是把 build 的位置抢了,所以不需要再添加快捷键。

windows同款配置

上面咱说了句介个:

平时就不用 c++ 插件,考场才能从容不迫鸭。

但是很多童鞋由于各种原因不得不使用 windous,于是填坑。

生成任务大概没有问题。加上开大栈空间的参数就行。

测试任务就不能用 gnome-terminal 了,那是 Ubuntu 的 gnome 桌面的终端……掏出 startcmd

1
2
3
4
5
6
"command": "start",
"args": [
"cmd",
"/c",
"\"${fileBasenameNoExtension}.exe && pause\"",
],

完整 task.json 文件

看在你认真看完的份上,就允许你抄作业啦。

考场极简单配置

输出文件 *.cpp.exe,运行弹框,集成 pause,不扩栈。记得绑定快捷键。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"group": {
"kind": "build",
"isDefault": true
},
"command": "g++ ${file} -o ${file}.exe",
"type": "shell"
},
{
"label": "test",
"options": {
"cwd": "${fileDirname}"
},
"group": {
"kind": "test",
"isDefault": true
},
"command": "gnome-terminal -- bash -c \"${file}.exe; echo '\n------done------'; read -s -n 1\"",
"type": "shell"
}
]
}

考场配置

输出文件 *.cpp.exe,运行弹框,集成 pause,扩栈,一些编译选项。记得绑定快捷键。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"group": {
"kind": "build",
"isDefault": true
},
"command": "g++",
"args": [
"${file}",
"-o",
"${file}.exe",
"-g",
"-std=c++14",
"-Wall",
"-Wextra",
"-fsanitize=address,leak,undefined"
],
"type": "shell"
},
{
"label": "test",
"group": {
"kind": "test",
"isDefault": true
},
"command": "gnome-terminal",
"args": [
"--",
"bash",
"-c",
"\"ulimit -s 524288; ${file}.exe; echo '\n------done------'; read -s -n 1\""
],
"type": "shell"
}
]
}

更强大的配置

输出文件 *.exe,运行弹框,独立 pause,扩栈,一些编译选项。同时支持 Windows 和 Ubuntu 系统。

这是咱哥平时用配置,有修改,已经过他本人允许。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"options": {
"cwd": "${fileDirname}"
},
"group": {
"kind": "build",
"isDefault": true
},
"command": "g++",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-std=c++14",
"-Wall",
"-Wextra",
"-o",
"${fileBasenameNoExtension}.exe",
"-fsanitize=address,leak,undefined"
],
"type": "shell",
"windows": {
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-std=c++14",
"-Wall",
"-Wextra",
"-o",
"${fileBasenameNoExtension}.exe",
"-Wl,--stack=536870912"
]
}
},
{
"label": "test",
"options": {
"cwd": "${fileDirname}"
},
"group": {
"kind": "test",
"isDefault": true
},
"command": "gnome-terminal",
"args": [
"--",
"bash",
"-c",
"\"ulimit -s 524288; ./${fileBasenameNoExtension}.exe; pause\""
],
"type": "shell",
"windows": {
"command": "start",
"args": [
"cmd",
"/c",
"\"${fileBasenameNoExtension}.exe && pause\"",
],
}
}
]
}

推荐了解

VSCode 用户代码片段(snippets)。


本站由 Lim Watt 使用 Stellar 1.29.1 主题创建。

本页面访问量 次 | 本站总访问量 次 | 本站总访客数