Yongchao Fu

NONMEM控制文件编写辅助插件

付永超 / 2021-02-18


最近我自己写了一个NONMEM的控制文件编写的辅助插件“nonmem_cn”,这个插件是基于VSCode实现的,可以在VSCode的应用扩展插件市场中,搜索nonmem轻松下载到:

image-20210218213914967

初衷:

1.最近在学习Pirana,并且脑海中在构思另一个作品——PML的代码编写辅助工具,因为NONMEM的语法与内容较为简单所以拉出来练手,训练下自己。

2.在查看和编辑NONMEM配置文件的时候确实感到一系列的不便,比如不能折叠代码,代码的高亮很奇怪,没有中文的提示,等等,进行了大量的搜索后,发现市面上有一些NONMEM语法高亮的工具,比如Pirana的内置编辑器、VSCode中已有的一个插件、Notepad++中他人贡献的自定义语法高亮配置等等,这些功能都十分孱弱与简陋,都不趁手。既然没有,那就自己写一个吧!

如此就诞生了现在的作品。

基本信息:

扩展插件名称:nonmem_cn

发布日期:2021年2月18日

支持的后缀名:.ctl .mod .clt .lst

核心功能:代码块折叠、语法高亮、自动补全

GitHub仓库地址:https://github.com/s0521/nonmem_cn

nonmem_cn包介绍页面:https://s0521.github.io/nonmem_cn/about/

扩展插件的宿主:Visual Studio Code https://code.visualstudio.com/

主要实现功能:

此项功能是目前市面上所有其他NONMEM控制文件编写辅助工具中都没有的功能,目前是我开发的“nonmem_cn”扩展插件所独有的~!

代码自动补全功能,此功能实现不能,但想实现的足够好很难,无论是代码层面还是对关键字的注释能力层面,我实现了一些基础的代码补全功能,给与了中英文双语直观简洁的非官方的注释,看起来格外清晰。

另外,当前的代码补全功能中包含的中文注释信息也是目前“nonmem_cn”扩展插件所独有的~!

语法高亮没啥说的,如果硬要说亮点,就是一下这些:

当前的亮点是我特别突出的等号、运算法、数字这三者,

高亮的颜色会随者你使用的VSCode主题不同而发生变化。

读者你可以做的贡献

当前的自动补全的注释信息和补全的内容其实还不够多,只有105个关键词,所以如果想变得更好还需要额外的在补充与添加。

我已经将补充额外新的内容的工作做了极大的简化,在该插件所对应的github仓库https://github.com/s0521/nonmem_cn中,其主页下可以看到两个csv文件(“Highlight.csv”、“snippets.csv”),和一个excel文件(“语法高亮.xlsx”)。

image-20210218220402917

两个CSV文件来自于Excel另存为获得。

读者你可下载其中的某个CSV文件,来通过增加行的方式仿照已有的行来增加内容,进而丰富语法高亮规则,或者代码补全关键词。

Hightlight.csv

该表格是语法高亮规则,内容如下图:

image-20210218220805731

该表格中,第一行是列名,其余行是具体的规则,唯一重要的部分是C列和F列,其余列是用来辅助说明的,便于读者的你理解用,

所以如果你有能力可以在新增的行中完成所有列的及内容撰写,

如果能力不强,也可以完成B列和E列的内容,然后我有空时额外进行补全。

snippets.csv

该表格是代码补全的候选关键字列表,内容如下图:

image-20210218221212469

该表格中,第1行至第6行都是对列的介绍性文字,便于读者理解列的用于与含义,从第7行开始到最后是具体的候选词及注释列表。

从列来看,第1列没有用主要是添加了对第一行至第六行内容的说明,第2列也没啥用仅仅用来表示下序号,

C列:自动补全时匹配的内容;

D列:选择候选列表中某一项后,实际在代码中写入的内容;

E列:候选列表中右侧的那些提示性文字,这些文字必须相对其他行的内容来说独一无二,位置如下图所示;

image-20210218221836270

F列:英文注释,选填,注释内容是出现在选则候选列表中的某一项时,额外出现在右侧或下侧等位置的一个方框中的上半部分区域的内容,我将英文注释与中问注释通过分号“;”和在一起同时显示;

E列:中文注释,选填,注释内容是出现在选则候选列表中的某一项时,额外出现在右侧或下侧等位置的一个方框中的上半部分区域的内容,我将英文注释与中问注释通过分号“;”和在一起同时显示。

该表格是代码补全的核心内容,也是最需要耗费时间、精力、知识来添加的地方。

所以如果你愿意,可以贡献下你的知识帮助我来进一步丰富“nonmem_cn”的功能,未来我也会考虑将此列表的内容加入到悬停提示中去。

结语

好了,就到这里告一段落吧!

愿此插件能够帮助到你,帮助到NONMEM社区中的更多的人。