【重制】如何在 NOI 系列比赛中使用 Sublime Text
【重制】如何在 NOI 系列比赛中使用 Sublime Text
两年前的文章:如何在 NOI linux 中优雅地使用 Sublime Text
现在搞一个重置版。
Sublime Text 是一个强大文本编辑器。
是一个付费软件,但可以无限试用(喜
NOI Linux 2 默认安装。
首先在 NOI Linux 里找到这个橙黑配色的软件,打开。
然后应该会显示滚木:
然后直接在里面写代码,这时候会发现没有高亮,这是因为 sublime text 不知道你在写什么语言。
高亮显示
方法一
点击右下角,切换成 c++
方法二
保存为 cpp 后缀的文件,sublime text 就知道这是 c++ 了,直接高亮。
方法三
Ctrl + Shift + P 调出工具栏,输入 c++,选择 Set Syntax: C++。
然后就能写代码了!
代码功能很多,这里不多赘述,可以看百度百科。
运行代码
写好代码后怎么运行呢?
方法一:命令行
命令行里编译运行:
不会 gcc 的话也是可以百度百科。
这样的话比较安全,加上了 -std=c++14 -O2 与评测保持一致。
方法二:Sublime Text 默认编译
在 Tools -> Build 里面,也可以使用快捷键 Ctrl + Shift + B,一个是编译,一个是编译加运行。
但是这种方法不能加编译命令 -std=c++14 -O2 不是很安全。
方法三:自定义构建系统。
我们就要更改其默认的编译指令,但是不能直接更改,需要建一个新的。
进入 Sublime Text 安装目录中的包文件夹 /opt/sublime_text/Packages 默认编译就在这里面。
找到 C++.sublime-package,复制出来,并解压,找到 C++ Single File.sublime-build,这个就是编译文件。
然后点击 Tools -> Build -> New Build System,会弹出来一个文件,把 C++ Single File.sublime-build 粘贴进去,加入自定义编译和命令:
{
"shell_cmd": "g++ \"${file}\" -O2 -std=c++14 -o \"${file_path}/${file_base_name}\"",
"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"working_dir": "${file_path}",
"selector": "source.c++",
"variants":
[
{
"name": "Run",
"shell_cmd": "ulimit -s 114514 && g++ \"${file}\" -O2 -std=c++14 -o \"${file_path}/${file_base_name}\" && \"${file_path}/${file_base_name}\""
}
,
{
"name": "Debug",
"shell_cmd": "g++ \"${file}\" -g -O2 -std=c++14 -o \"${file_path}/${file_base_name}\""
}
]
}
然后保存为 g++.sublime-build。
然后 Ctrl + Shift + B 就有新的自定义编译了。
其中,在 Sublime Text 里编译的话能在对应的行显示 Error 和 Warning。
然后注意一下 Sublime Text 里面的命令行里输入流有问题,推荐文件读写!
视图
Alt + Shift + 2 能分出两个代码区域:
Alt + Shift + 3 是分三个,Alt + Shift + 4 是分四个(1x4),Alt + Shift + 5 也是是分四个(2x2),Alt + Shift + 1 是初始状态一个。
同时,分出两个后在右边进行 Ctrl + K , Ctrl + up 还能分:
这时候就能左边代码,右边是 in 和 out。
有关 sublime text 的考场技巧就差不多了,
其他就是一些 sublime text 和 linux 的使用问题。
在 sublime text 上面的工具栏可以发现有很多功能,和对应的快捷键。
Ctrl + Shift + P 快捷调用各种命令。
神秘功能 Find in Files
Ctrl + Shift + F 调出 Find in Files,可以在一个目录里搜索。
比如考场上忘记了 tree 怎么写,就可以:
而且这个速度极快。
神秘快读
忘记快读怎么办?
键入 read,然后就能发现补全里有个模板 Read File Into Vector:
std::vector<char> v;
if (FILE *fp = fopen("filename", "r"))
{
char buf[1024];
while (size_t len = fread(buf, 1, sizeof(buf), fp))
v.insert(v.end(), buf, buf + len);
fclose(fp);
}
这个有点废空间,可以稍作修改,比如:
namespace IO {
char buf[1024], * p1 = buf, * p2 = buf;
inline char gc() {
if(p1 == p2) {
p2 = buf + fread(buf, 1, sizeof buf, stdin);
p1 = buf;
}
return p1 == p2 ? EOF : * p1 ++;
}
}
(修改的貌似有点多(至少知道 fread 怎么用了吧