描述
在等待的同时将代码片段添加到脚本编辑器为了完成这个任务,我很快编写了一个插件,这样我在脚本编辑器中编写脚本时至少可以拥有某种片段。 加载项的组装速度相当快,但它仍然存在错误和问题(尤其是在 UI 中关注不同元素时)。 那里对此加载项的更改可能会破坏当前代码片段和/或其位置的功能。
什么是片段? 代码片段是一个编程术语,指一小部分可重用的源代码、机器代码或文本(维基百科,片段_(编程) )。 片段允许您快速将可重用的代码块插入到代码中。 如果您手动输入代码片段,这将节省您的时间并减少可能出现的错误。
安装
插件已内置插件管理器,至少需要 JMP16 并且支持 Windows(可能在 OSX 上工作,但我无法测试它,并且支持的主机已在加载项管理器中设置为 Win)。
从此页面下载插件并按照通常安装 JMP 插件的方式进行安装(双击)。 该加载项将(默认情况下)使用快捷键绑定Ctrl+Shift+空格键。 当加载项第一次运行时,它将为用户 $DOCUMENTS 创建文件夹被称为jmp_script_editor_snippets哪个用户可以用来存储自定义片段(完整路径类似于 C:\Users\ <用户名> \Documents\jmp_script_editor_snippets\)。 代码片段文件基本上只是 .jsl 文件,可以从加载项的代码片段文件夹或用户的文档代码片段文件夹中找到。
用法:
写#snippet <可选搜索词> (用户可以选择使用#sni 或#snip,而不是写入整个#snippet)到脚本编辑器中。 #snippet 用作查找值,如果您包含可选搜索词,这些词将用于预填充搜索栏。 在代码中包含 #snippet 后,按 Ctrl+Shift+Space 启动 JMP 脚本编辑器代码段窗口,搜索正确的代码段并按确定(有时您也可以只按 Enter/使用 Tab 进入 Enter)。 #snippet 行将替换为您选择的代码片段。 下面是片段窗口的图像

片段窗口
如果用户运行加载项并且在脚本框中没有找到 #snippet,则不会发生任何情况。 如果您不想插入代码片段,请按 Esc。 如果您不小心插入了代码片段,您可以尝试按 Ctrl+Z 来撤消更改。
用户可以访问此社区页面以获取帮助,并从加载项菜单中打开代码片段文件夹

预安装的片段
这些片段的名称故意保持简短,因此用户可以轻松地将整个名称写为<可选搜索词> #snippet 之后。 以这种方式使用片段允许用户立即按 Enter 键来使用所需的片段。
新背景
查看更多...
新_bg_gb
查看更多...
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(
Variables(X(:weight), Y(:height), Overlay(:sex)),
Elements(Points(X, Y, Legend(9)), Line Of Fit(X, Y, Legend(11)))
);
名称默认为此处(1); dt = open("$SAMPLE_DATA/Big Class.jmp"); gb = dt << 图形生成器(变量(X(:体重),Y(:高度),叠加(:性别)),元素(点(X,Y,图例(9)),拟合线(X,Y , 图例(11))) );
如果
查看更多...
If(condition1,
//code1
, //else
//code2
);
if(条件1, //代码1, //else //代码2);
埃利夫
查看更多...
If(condition1,
//code1
, //condition2,
//code2
, //else
//code3
);
if(条件1, //代码1, //条件2, //代码2, //else //代码3);
功能
查看更多...
function1 = function({param1, param2, param3 = .}, {Default Local},
/*"""function1 which returns missing.
More description regarding the function
Args:
param1 (displaybox):
param2 (char):
param3 (num):
Returns:
num: missing
Raises:
exception_msg
"""*/
return(.);
);
function1 = function({param1, param2, param3 = .}, {Default Local}, /*"""function1 返回缺失值。 关于函数 Args 的更多描述: param1 (displaybox): param2 (char): param3 (num): Returns: num:missing Raises: exception_msg """*/ return(.); );
新的
查看更多...
/*"""One sentence description for this script
Author:
Creation Date:
Creation JMP Version:
Description:
Todo:
*
*
"""*/
Names Default To Here(1);
/*"""此脚本的一句话描述 作者: 创建日期: 创建 JMP 版本: 描述: Todo: * * """*/ 名称默认为此处(1);
西北
查看更多...
nw = New Window("name",
V List Box(align("Center"),
)
, << Set Window Icon("JMP")
);
nw = 新窗口("name", V 列表框(align("Center"), ) , << 设置窗口图标("JMP") );
莫代尔
查看更多...
nw = New Window("Modal Window", << modal, << return result,
H List Box(
Panel Box("Options",
lb = List Box({})
),
Panel Box("Actions",
Lineup Box(N Col(1),
Button Box("OK"),
Button Box("Cancel")
)
)
)
, << Set Window Icon("Warning")
);
If(nw["Button"] != 1,
Throw("Cancelled");
);
nw = 新窗口("模态窗口", << modal, << 返回结果, H 列表框( 面板框("选项", lb = 列表框({}) ), 面板框("动作", 阵容框( N Col(1), 按钮框("确定"), 按钮框("取消") ) ) ) , << 设置窗口图标("警告") ); If(nw["按钮"] != 1, Throw("取消"); );
sql
查看更多...
dsn_string = "";
sql_template = "\[
select 1
from dual
]\";
dbc = Create Database Connection(dsn_string);
sql = Eval Insert(sql_template, "¤"); // use ¤ to avoid issues with regex when using ^
dt = Execute SQL(dbc, sql, "NewTable");
Close Database Connection(dbc);
dsn_string =“”; sql_template = "\[ 从对偶中选择 1]\"; dbc = 创建数据库连接(dsn_string); sql = Eval Insert(sql_template, "¤"); // 使用 ¤ 避免使用 ^ dt = 执行 SQL(dbc, sql, "NewTable"); 时出现正则表达式问题;关闭数据库连接(dbc);
尝试
查看更多...
Try(
Show(a);
, // Catch
show(exception_msg);
);
Try( Show(a); , // 捕获 show(exception_msg); );
我还添加了社区模板.jsl存储到我的 $DOCUMENTS 代码段文件夹,我用它来存储来自 JMP 社区的脚本解决方案
查看更多...
/*"""
author: jthi
date: YYYY-MM-DD
url: https://community.jmp.com/t5/Discussions/
keywords/tags: []
"""*/
Names Default To Here(1);
例子
在这个简单的示例中,我将创建新脚本。 该脚本将有一个函数执行 SQL 查询,然后返回结果表。
首先,我将启动一个新的 .jsl 脚本文件。 我将从写作开始
#snippet new
接下来我将运行加载项来替换该代码片段。 因为我已将整个代码段名称预先写入 #snippet 行,所以它将为我预先选择

我可以在打开加载项后立即按 Enter 键来使用该代码片段。
接下来我将使用 func 片段添加一个新函数
#snippet func
然后在其中添加 sql 片段
#snippet sql
我当前的代码如下所示:
查看更多...
/*"""This Add-In provides Snippet functionality to JMP Script Editor.
Author:
Creation Date:
Creation JMP Version:
Description:
Todo:
*
*
"""*/
Names Default To Here(1);
function1 = function({param1, param2, param3 = .}, {Default Local},
/*"""function1 which returns missing.
More description regarding the function
Args:
param1 (displaybox):
param2 (char):
param3 (num):
Returns:
num: missing
Raises:
exception_msg
"""*/
sql_template = "\[
select 1
from dual
]\";
dbc = Create Database Connection(dsnstring);
sql = Eval Insert(sql_template, "¤"); // use ¤ to avoid issues with regex when using ^
dt = Execute SQL(dbc, sql, "NewTable");
Close Database Connection(dbc);
return(.);
);
/*"""此插件为 JMP 脚本编辑器提供片段功能。 作者: 创建日期: 创建 JMP 版本: 说明: 待办事项: * * """*/ 名称默认为此处(1); function1 = function({param1, param2, param3 = .}, {Default Local}, /*" ""function1 返回缺失值。 关于函数的更多描述 Args: param1 (displaybox): param2 (char): param3 (num): Returns: num: Missing Raises: exception_msg """*/ sql_template = "\[ select 1 from Dual ]\"; dbc =创建数据库连接(dsnstring); sql = Eval Insert(sql_template, "¤"); // 使用 ¤ 避免使用 ^ dt = 执行 SQL(dbc, sql, "NewTable") 时出现正则表达式问题; 关闭数据库连接(dbc) ); 返回(。); );
我将通过在函数内添加缩进并填写文档字符串来清理它,最后我的脚本将如下所示:
查看更多...
/*"""Example on the usage of JMP Script Editor Snippets
Author: jthi
Creation Date: 2022-12-19
Creation JMP Version: JMP Pro 16
"""*/
Names Default To Here(1);
get_data = function({duration = 1}, {Default Local},
/*"""Function to query data from sql
Args:
duration (num): days to query
Returns:
datatable: queried data table
"""*/
dsn_string = "DSN=dBASE Files;DBQ=C:/Program Files/SAS/JMPPRO/16/Samples/Import Data/;"
sql_template = "\[
select *
from tables
where
data > sysdate - ¤duration¤
]\";
dbc = Create Database Connection(dsn_string);
sql = Eval Insert(sql_template, "¤");
dt = Execute SQL(dbc, sql, "Query Result");
Close Database Connection(dbc);
return(dt);
);
/*"""JMP 脚本编辑器片段的使用示例 作者:jthi 创建日期:2022-12-19 创建 JMP 版本:JMP Pro 16 """*/ 名称默认为此处(1); get_data = function({duration = 1}, {Default Local}, /*"""从sql中查询数据的函数 参数:duration(num):查询天数 返回:datatable:查询到的数据表 """*/ dsn_string = "DSN=dBASE Files;DBQ=C:/Program Files/SAS/JMPPRO/16/Samples/Import Data/;" sql_template = "\[ 从数据 > sysdate - ¤duration¤ 的表中选择 * ]\"; dbc =创建数据库连接(dsn_string); sql = Eval Insert(sql_template, "¤"); dt = 执行SQL(dbc, sql, "查询结果"); 关闭数据库连接(dbc); return(dt); );
下面是基于示例的加载项使用的简短视频
未来可能的工作
- 编写正确的.md文件
- 在代码片段之前添加对空格/制表符的处理,以便插入的代码将具有正确的缩进
- 添加帮助按钮和按钮以打开用户代码片段文件夹到加载项的菜单
- 还需要创建“帮助”页面。 帮助页面可以从 .md 转换为 .html 或使用此社区页面制作。
- 尝试解决对焦问题
- 添加设置选项
- 禁用片段、snippet_str、列表框 nlines
- 可以将片段附加到脚本窗口的末尾,而不需要#snippet
- 可能会考虑更复杂的语法,这将允许在片段中预先填充一些值
- #snippet !param1 !param2 (或类似的东西)
- 也许甚至允许评估脚本中变量的值? 这需要不同的语法还是已经这样了特征蠕变?
- 可以在脚本编辑器旁边嵌入代码片段列表
- 添加更多预先编写的片段
- 添加向片段添加描述的可能性
变更日志
2.0 版(2022 年 12 月 20 日)
- 添加了新的片段:modal 和 if。 新的 elif 替换了旧的 if 片段
- 将代码片段检查更改为使用值列表。 添加#sni 和#snip 作为附加关键字(当前列表#sni、#snip、#snippet)
- 添加了新的可配置变量
- 使脚本预览更宽以容纳大约 80 个字符的代码
- 在加载项菜单中添加了“帮助”按钮
- 在加载项菜单中添加了打开代码片段文件夹按钮
- 添加了对片段使用期间缩进的支持
版本 2.0.1(2022 年 12 月 22 日)
@hogi
我不确定是否可以直接使用 JSL 访问用户在脚本框中的光标位置。 我可以使用 powershell 和 windows dll 进行变通,但我不会(很可能)为此加载项执行这些操作,因为它对于我使用关键字来说工作得足够好。
@jthi ,非常感谢这个插件。 这会有很大帮助。
您可以添加一个按钮来打开C:\用户\ <用户名> \Documents\jmp_script_editor_snippets\ 文件夹。
@jthi写道:- 可以将片段附加到脚本窗口的末尾,而不需要#snippet
...或在当前光标位置?
你可以放置一个#片段就在那里,加载项在代码中的其他地方找不到它。
但好在这只是#片段和不是
#这是我的代码片段应该去的地方

也许:允许#片段(带空格)以及使功能更强大,以防止用户“错误”。