Descripción
Mientras se espera Agregar fragmentos al editor de secuencias de comandos deseo que se complete, rápidamente escribí un complemento para poder tener al menos algún tipo de fragmentos mientras escribía secuencias de comandos en el Editor de secuencias de comandos. El complemento se armó bastante rápido y todavía tiene errores y problemas (especialmente al enfocar diferentes elementos en la interfaz de usuario). Allá Puede haber cambios en este complemento que romperán la funcionalidad de los fragmentos actuales y/o sus ubicaciones.
¿Qué es un Fragmento? Snippet es un término de programación para una pequeña región de código fuente reutilizable, código de máquina o texto ( wikipedia, Snippet_(programación) ). Los fragmentos le permiten insertar rápidamente bloques de código reutilizables en su código. Esto le ahorrará tiempo y reducirá los errores que podría tener si tuviera que escribir manualmente el fragmento.
Instalación
El complemento se ha creado con Administrador de complementos , requiere como mínimo JMP16 y es compatible con Windows (podría funcionar en OSX, pero no puedo probarlo y el host compatible se ha configurado como Win en el administrador de complementos).
Descargue el complemento desde esta página e instálelo como lo haría normalmente con los complementos JMP (doble clic). El complemento usará (de forma predeterminada) la combinación de teclas de método abreviado Ctrl+Mayús+Espacio . Cuando el complemento se ejecute por primera vez, crear carpeta para usuarios $ DOCUMENTOS llamado jmp_script_editor_snippets qué usuario puede usar para almacenar fragmentos personalizados (la ruta completa es algo así como C:\Users\ \Documentos\jmp_script_editor_snippets\). Los archivos de fragmentos son básicamente archivos .jsl que se encuentran en la carpeta de fragmentos de los complementos o en la carpeta de fragmentos de documentos del usuario.
Uso:
Escribir #snippet (Opcionalmente, el usuario puede usar #sni o #snip en lugar de escribir el #fragmento completo) en su editor de secuencias de comandos. #snippet se usa como un valor de búsqueda y, si incluye términos de búsqueda opcionales, se usarán para completar previamente la barra de búsqueda. Después de tener #snippet en su código, presione Ctrl+Shift+Space para abrir la ventana Snippet del editor de secuencias de comandos JMP, busque el fragmento correcto y presione OK (a veces también puede simplemente presionar Enter/usar Tabulador para acceder a Enter). La línea #snippet se reemplazará con el fragmento que seleccionó. A continuación se muestra la imagen de la ventana de fragmento

Ventana de fragmentos
Si el usuario ejecuta el complemento y no se encuentra un #fragmento en el cuadro de secuencia de comandos, no sucederá nada. Si no desea insertar un fragmento, presione Esc. Si por accidente inserta un fragmento, puede intentar presionar Ctrl+Z para deshacer el cambio.
El usuario puede acceder a esta página de la comunidad para obtener ayuda y abrir la carpeta de fragmentos desde el menú de complementos

Fragmentos preinstalados
Los nombres de estos fragmentos se mantienen cortos a propósito, por lo que el usuario puede escribir fácilmente el nombre completo como después de #fragmento. El uso de fragmentos de código de esta manera permite al usuario presionar Intro inmediatamente para usar el fragmento de código deseado.
nuevo_bg
Ver más...
nuevo_bg_gb
Ver más...
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)))
);
Nombres Predeterminados Hasta Aquí(1); dt = abrir("$SAMPLE_DATA/Big Class.jmp"); gb = dt << Creador de gráficos( Variables(X(:peso), Y(:altura), Superposición(:sexo)), Elementos(Puntos(X, Y, Leyenda(9)), Línea de ajuste(X, Y , Leyenda(11))) );
si
Ver más...
If(condition1,
//code1
, //else
//code2
);
If(condición1, //código1, //else //código2);
elif
Ver más...
If(condition1,
//code1
, //condition2,
//code2
, //else
//code3
);
If(condición1, //código1, //condición2, //código2, //else //código3);
función
Ver más...
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 que devuelve faltante. Más descripción con respecto a la función Args: param1 (displaybox): param2 (char): param3 (num): Devuelve: num: falta Emite:Exception_msg """*/ return(.); );
nuevo
Ver más...
/*"""One sentence description for this script
Author:
Creation Date:
Creation JMP Version:
Description:
Todo:
*
*
"""*/
Names Default To Here(1);
/*"""Descripción de una oración para este script Autor: Fecha de creación: Versión de JMP de creación: Descripción: Todo: * * """*/ Nombres predeterminados aquí(1);
noroeste
Ver más...
nw = New Window("name",
V List Box(align("Center"),
)
, << Set Window Icon("JMP")
);
nw = Nueva ventana("nombre", V List Box(align("Centro"), ) , << Establecer icono de ventana("JMP") );
modal
Ver más...
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 = Nueva ventana("Ventana modal", << modal, << resultado de retorno, H Cuadro de lista( Cuadro de panel("Opciones", lb = Cuadro de lista({}) ), Cuadro de panel("Acciones", Cuadro de alineación( N Col(1), Cuadro de botones("Aceptar"), Cuadro de botones("Cancelar") ) ) ), << Establecer icono de ventana("Advertencia") ); If(nw["Botón"] != 1, Throw("Cancelado"); );
sql
Ver más...
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);
cadena_dsn = ""; sql_template = "\[seleccione 1 de dual]\"; dbc = Crear conexión de base de datos (dsn_string); sql = Insertar evaluación (sql_template, "¤"); // use ¤ para evitar problemas con expresiones regulares cuando use ^ dt = Execute SQL(dbc, sql, "NewTable"); Cerrar conexión de base de datos (dbc);
intentar
Ver más...
Try(
Show(a);
, // Catch
show(exception_msg);
);
Try( Show(a); , // Captura show(exception_msg); );
también agregué community_template.jsl almacenado en mi carpeta de fragmentos de $DOCUMENTS, que utilizo para almacenar mis soluciones de secuencias de comandos de JMP Community
Ver más...
/*"""
author: jthi
date: YYYY-MM-DD
url: https://community.jmp.com/t5/Discussions/
keywords/tags: []
"""*/
Names Default To Here(1);
Ejemplo
En este ejemplo simple, crearé un nuevo script. El script tendrá una función que realizará una consulta SQL y luego devolverá la tabla de resultados.
Primero, iniciaré un nuevo archivo de script .jsl. voy a empezar escribiendo
#snippet new
a continuación, ejecutaré el complemento para reemplazar ese fragmento. Debido a que preescribí el nombre completo del fragmento en la línea #snippet, se preseleccionará para mí.

y puedo simplemente presionar enter inmediatamente después de abrir el complemento para usar ese fragmento.
A continuación, agregaré una nueva función con el fragmento func.
#snippet func
y luego dentro agregaré un fragmento de sql
#snippet sql
Mi código actual se ve así:
Ver más...
/*"""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(.);
);
/*"""Este complemento proporciona la funcionalidad Snippet al editor de secuencias de comandos JMP. Autor: Fecha de creación: Versión JMP de creación: Descripción: Todo: * * """*/ Nombres predeterminados hasta aquí(1); function1 = function({param1, param2, param3 = .}, {Default Local}, /*" ""función1 que devuelve faltante. Más descripción sobre la función Args: param1 (displaybox): param2 (char): param3 (num): Devuelve: num: faltante Genera:Exception_msg """*/ sql_template = "\[seleccione 1 de dual]\"; dbc = Crear conexión de base de datos (dsnstring); sql = Eval Insert (sql_template, "¤"); // use ¤ para evitar problemas con expresiones regulares al usar ^ dt = Ejecutar SQL (dbc, sql, "NewTable"); Cerrar conexión de base de datos (dbc ); devolver(.); );
Lo limpiaré agregando sangría dentro de la función y completaré las cadenas de documentación y finalmente mi secuencia de comandos se verá así:
Ver más...
/*"""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);
);
/*"""Ejemplo sobre el uso de JMP Script Editor Snippets Autor: jthi Fecha de creación: 2022-12-19 Versión de creación de JMP: JMP Pro 16 """*/ Nombres predeterminados aquí(1); get_data = function({duration = 1}, {Default Local}, /*"""Función para consultar datos de sql Args: duración (num): días para consultar Devoluciones: datatable: tabla de datos consultada """*/ dsn_string = "DSN=Archivos dBASE;DBQ=C:/Archivos de programa/SAS/JMPPRO/16/Muestras/Importar datos/;" sql_template = "\[seleccione * de las tablas donde data > sysdate - ¤duración¤ ]\"; dbc = Crear conexión de base de datos(dsn_string); sql = Eval Insert(sql_template, "¤"); dt = Ejecutar SQL(dbc, sql, "Resultado de la consulta"); Cerrar conexión de base de datos(dbc); return(dt); );
A continuación se muestra un video breve del uso del complemento basado en el ejemplo anterior
Posible trabajo futuro
- Escriba el archivo .md adecuado
- Agregue el manejo de espacios en blanco / pestañas antes del fragmento para que el código insertado tenga la sangría correcta
- Agregue el botón de ayuda y el botón para abrir la carpeta de fragmentos de los usuarios en el menú del complemento
- También requiere la creación de una página de "ayuda". La página de ayuda se puede hacer desde .md convertido a .html o usando esta página de la comunidad.
- Intento de solucionar problemas de enfoque
- Agregar opción de configuración
- fragmentos deshabilitados, snippet_str, cuadro de lista nlines
- Posibilidad de agregar fragmentos al final de la ventana del script sin el requisito de #fragmento
- ¿Otro atajo para "Anexar fragmento"?
- Posiblemente piense en una sintaxis más complicada, lo que permitiría completar previamente algunos valores en fragmentos
- #snippet !param1 !param2 (o algo similar)
- ¿Tal vez incluso permitir la evaluación de valores de variables en el script? ¿Requeriría esto una sintaxis diferente o ya está arrastre de características ?
- Posibilidad de incrustar una lista de fragmentos junto al editor de scripts
- Agregue más fragmentos preescritos
- Agregar posibilidad de agregar descripciones a fragmentos
Registro de cambios
Versión 2.0 (20 de diciembre de 2022)
- Se agregaron nuevos fragmentos: modal y if. El nuevo elif reemplazó al antiguo fragmento if
- Se modificó la verificación de fragmentos para usar la lista de valores. Se agregaron #sni y #snip como palabras clave adicionales (lista actual #sni, #snip, #snippet)
- Añadidas nuevas variables configurables
- Vista previa de secuencia de comandos más amplia para adaptarse a aproximadamente 80 caracteres de código
- Botón de ayuda agregado al menú de complementos
- Se agregó el botón Abrir carpeta de fragmentos al menú de complementos
- Se agregó soporte para sangría durante el uso de fragmentos
Versión 2.0.1 (22 de diciembre de 2022)
- Intento de solucionar el problema por el que se eliminaban las líneas vacías de los fragmentos
@hogi
No estoy seguro de poder acceder a la posición del cursor del usuario en Scripting Box directamente con JSL. Puedo hacer soluciones alternativas con PowerShell y Windows dll, pero (lo más probable) no las haré para este complemento, ya que funciona lo suficientemente bien para mí con el uso de palabras clave.
@jthi , muchas gracias por este complemento. Esto puede ayudar mucho.
Podría agregar un botón para abrir el C:\Usuarios\ carpeta \Documentos\jmp_script_editor_snippets\.
@jthi escribió:- Posibilidad de agregar fragmentos al final de la ventana del script sin el requisito de #fragmento
... o en la posición actual del cursor?
Podrías colocar un #retazo simplemente allí, el complemento no lo encuentra en ningún otro lugar del código.
Pero bueno que es solo #retazo y no
#este es el lugar donde debería ir mi fragmento

tal vez: permitir # retazo (con espacio) también para hacer que la funcionalidad sea más robusta contra los "errores" del usuario.