众所周知,VSCode 是宇宙第一代码编辑器——
但是有宇宙第一代码编辑器在这里,为什么不用呢?这篇文章就来讲一讲如何给 Ren'Py 添加 VSCode 支持。
其实在 VSCode 方面倒不需要多少工作,因为已经有人把我们所需要的做成扩展了:
仅有 VSCode 对 rpy 文件的语法支持还不够,我们要做到在 Ren'Py 启动器界面上直接建立与 VSCode 的关联。
这个时候就需要用到 Ren'Py 的「集成文本编辑器」功能了。
在 Ren'Py 的文档中,我们发现有这样的描述:
Ren'Py允许用户从启动器(launcher)加载一个文本编辑器编辑游戏脚本,同时也使用这个文本编辑器向用户汇报错误。
通过在.edit.py文件中创建一个Editor类,就可以定制编辑器了。这个类包含了管理文本编辑的方法。
在这之前,我们需要先了解一下 VSCode 的启动参数。
我们主要使用的是以下几个:
- -n 和 -r,分别表示打开新窗口和重用已有的窗口。
- -g,表示跳转到文件的某一行。
此外,使用code <文件名>
的形式可以打开一个文件,如果改为文件夹名(以/
结尾) ,就可以打开一个文件夹。当然也可以同时打开多个文件或文件夹。
要编写这个文件,我们需要了解Editor
类是如何工作的。
按照面向对象的设计模式,Editor
类是一个抽象基类。在我们编写的VSCode.edit.py
中,需要继承renpy.editor.Editor
,并重写其抽象方法。从官方文档中,我们可以看到Editor
基类有三个方法:
通过对内置的Atom.edit.py
的研究,我发现还有两个必要的属性或方法:
Ren'Py 在启动编辑器时,采用的是「会话」机制。
这是什么意思呢?一个「会话」就是一次启动编辑器的操作,每个会话中,Ren'Py 会先调用begin
方法作为会话的开始,接着调用若干个open
或者open_project
(实际上目前的应用场景只会调用一次)
,最后调用end
作为会话结束。按照这个原理,我们可以在begin
中做一些初始化的工作,然后在open
和open_project
中生成命令行参数,最后在end
中执行启动 VSCode。
这几个方法的参数都很浅显易懂。begin
的new_window
就是指定编辑器是否要在新窗口打开;open
的filename
就是要打开的文件名
,如果指定line
参数,就跳转到对应的行号;open_project
的directory
参数就是工程的文件目录。
此外,还有一个类变量:has_project
,设置为True
表示我们的自定义编辑器支持打开工程(文件夹)。
到这里,我们就可以写出VSCode.edit.py
的代码了:
上述代码仅限 Windows 系统,其他操作系统需要进行修改,这里不再赘述。
最后,将VSCode.edit.py
保存于 Ren'Py 的 SDK 的根目录,或者任意子文件夹下。重新启动 Ren'Py,就能在「设置/文本编辑器」中找到 VSCode 项了。