8月21号更新,添加 windows 配置。其实 windows 的方案早就有了,只是放假来不及写
在 linux 和 vscode 上中毒这么久,咱自认为咱有如题目所写的自信。目标:
在开始之前,你要知道
如果平时 IDE 不是 VSCode,就没有必要陪咱踩水坑。
一定要跟着操作一遍,不然可能理解不到咱的意思。
平时就不用 c++ 插件,考场才能从容不迫鸭。
不可能实现的
- 中文环境
- 可视化调试
- 高级补全
- 字体
环境
由于虚拟机玩不来,所以原谅咱直接用本机(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
(日志猫?)。学废了么?
注意:
group
选倒数第二个 。type
选第二个。- 同级之间有逗号。
- 一个字母的地方,直接输入这个字母,然后直接按
Enter
或Tab
以接受第一个补全。 - 一定要练习一下!不然你不会知道
args
那里如果像 关键字图片 里那样写作一行会出问题。 - 一定要在 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 | // json 里实际上不能有注释 |
还可以再精简一些?
实际上 options
、args
和 type
属性不是必要的。
这里我们只用 "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
记得跟着改。
绑定快捷键同上。咱用的 F5
。
独立运行窗口
目前程序已经可以在 VSCode 的集成终端内运行了,但是有许多像咱一样的小伙伴希望程序运行在独立窗口。
这里用到 gnome-terminal 命令,格式 gnome-terminal -- 要执行的内容
。
1 | "command": "gnome-terminal", |
pause
然后,你会发现窗口是打开了,但运行完结果都没看到就退出了。
两个方法,改终端配置(不推荐),或着写一个 pause
命令(linux 没有这个命令)。
改终端配置的方法
真的不建议,所以一张图带过。
新建 ./pause
并编辑:
1 |
|
核心代码只有一句 read -s -n 1
,不做解释。简单吧。
打开终端,cd
到这个位置,输入 ./pause
,回车。效果如何?
为了避免麻烦,咱们把它丢到 环境变量 里。
cp
是复制命令。
sudo
用户密码应该会提前告知,如果没告知就问,如果不说就试 123456
。
然后该改 tasks.json
。
1 | "command": "gnome-terminal", |
这里咱套了个 bash
,不然 pause
会和 gnome-terminal
命令同级。注意后面转义了一对双引号。
注:gnome-terminal
命令在打开窗口后就结束了,与程序的运行不相干。
栈空间
Linux 的栈空间不能在编译时控制,只能运行前用 ulimit -s 524288
调。
关于 ulimit
,自己查去!
但是这种修改是临时的,且只对同一终端有效。像咱这种新建终端的网上根本找不到第二家,咱硬是磕了几个月都没想到办法。想到办法之后就来发文了。看咱多好心!
1 | "command": "gnome-terminal", |
在 ${file}.exe
前面加上 ulimit -s 524288;
……至于为什么这么简单的东西想了几个月这个问题,咱的回答是:咱之前一直用的 独立运行窗口 那一版本的 tasks,然后直接在代码末尾 system("pause");
……直到偶然看到 bash -c " "
才脑袋开窍的。
对了,千万不要尝试在实体机上修改系统文件以永久开大栈空间,除非你想体验在 Ubuntu 紧急模式中对着原始的 shell 界面恢复你刚刚修改的那个文件。
提高体验
想必你已经注意到了,咱的终端是透明的!这样不但好看,而且可以方便地比较多个运行结果。
真的很简单,所以一张图搞定。
一键编译运行
如果你需要,就再写一个任务。
1 | { |
然后需要把上面 build
任务的 group
属性删掉。VSCode 给 tasks
只分配了两个一键调用的位置, 一键编译
和 一键编译运行
只能选一个(显然你也只需要一个)。
由于是把 build
的位置抢了,所以不需要再添加快捷键。
windows同款配置
上面咱说了句介个:
平时就不用 c++ 插件,考场才能从容不迫鸭。
但是很多童鞋由于各种原因不得不使用 windous,于是填坑。
生成任务大概没有问题。加上开大栈空间的参数就行。
测试任务就不能用 gnome-terminal 了,那是 Ubuntu 的 gnome 桌面的终端……掏出 start
和 cmd
。
1 | "command": "start", |
完整 task.json 文件
看在你认真看完的份上,就允许你抄作业啦。
考场极简单配置
输出文件 *.cpp.exe
,运行弹框,集成 pause,不扩栈。记得绑定快捷键。
1 | { |
考场配置
输出文件 *.cpp.exe
,运行弹框,集成 pause,扩栈,一些编译选项。记得绑定快捷键。
1 | { |
更强大的配置
输出文件 *.exe
,运行弹框,独立 pause,扩栈,一些编译选项。同时支持 Windows 和 Ubuntu 系统。
这是咱哥平时用配置,有修改,已经过他本人允许。
1 | { |
推荐了解
VSCode 用户代码片段(snippets
)。