Descrizione
Nell'attesa Aggiungi snippet allo Script Editor desidero che venga completato, ho scritto rapidamente un componente aggiuntivo in modo da poter avere almeno una sorta di snippet durante lo scripting in Script Editor. Il componente aggiuntivo è stato creato abbastanza velocemente e presenta ancora bug e problemi (soprattutto con la messa a fuoco di diversi elementi nell'interfaccia utente). Là potrebbero esserci modifiche a questo componente aggiuntivo che interromperanno la funzionalità degli snippet correnti e/o le loro posizioni.
Cos'è uno snippet? Snippet è un termine di programmazione per una piccola regione di codice sorgente, codice macchina o testo riutilizzabile ( wikipedia, Snippet_(programmazione) ). Gli snippet ti consentono di inserire rapidamente blocchi di codice riutilizzabili nel tuo codice. Ciò ti farà risparmiare tempo e ridurrà gli errori che potresti commettere se digitassi manualmente lo snippet.
Installazione
Il componente aggiuntivo è stato creato con Gestione componenti aggiuntivi , richiede almeno JMP16 e supporta Windows (potrebbe funzionare su OSX, ma non posso testarlo e l'host supportato è stato impostato come Win nel gestore dei componenti aggiuntivi).
Scaricare il componente aggiuntivo da questa pagina e installarlo come si farebbe normalmente con i componenti aggiuntivi JMP (fare doppio clic). Il componente aggiuntivo utilizzerà (per impostazione predefinita) la combinazione di tasti di scelta rapida Ctrl+Maiusc+Spazio . Quando il componente aggiuntivo verrà eseguito per la prima volta, lo farà crea una cartella per gli utenti $DOCUMENTI chiamato jmp_script_editor_snippets quale utente può utilizzare per memorizzare snippet personalizzati (il percorso completo è qualcosa come C:\Users\ \Documenti\jmp_script_editor_snippets\). I file di frammenti sono fondamentalmente solo file .jsl che si trovano nella cartella dei frammenti dei componenti aggiuntivi o nella cartella dei frammenti dei documenti dell'utente.
Utilizzo:
Scrivere #snippet (facoltativamente l'utente può utilizzare #sni o #snip invece di scrivere l'intero #snippet) nel tuo editor di script. #snippet viene utilizzato come valore di ricerca e se includi termini di ricerca opzionali, questi verranno utilizzati per precompilare la barra di ricerca. Dopo aver inserito #snippet nel codice, premi Ctrl+Maiusc+Spazio per avviare la finestra Snippet di JMP Script Editor, cerca lo snippet corretto e premi OK (a volte puoi anche semplicemente premere Invio/utilizzare Tab per accedere a Invio). La riga #snippet verrà sostituita con lo snippet selezionato. Di seguito è riportata l'immagine della finestra dello snippet

Finestra di frammento
Se l'utente esegue il componente aggiuntivo e non viene trovato alcun #snippet dalla casella dello script, non accadrà nulla. Se non vuoi inserire lo snippet, premi Esc. Se per sbaglio inserisci lo snippet, puoi provare a premere Ctrl+Z per annullare la modifica.
L'utente può accedere a questa pagina della community per ricevere assistenza e aprire la cartella degli snippet dal menu del componente aggiuntivo

Snippet preinstallati
I nomi di questi frammenti sono volutamente brevi, in modo che l'utente possa facilmente scrivere l'intero nome come dopo #snippet. L'utilizzo degli snippet in questo modo consente all'utente di premere immediatamente Invio per utilizzare lo snippet desiderato.
new_bg
Visualizza altro...
new_bg_gb
Visualizza altro...
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)))
);
Nomi predefiniti qui(1); dt = open("$SAMPLE_DATA/Big Class.jmp"); gb = dt << Costruttore di grafici(Variabili(X(:peso), Y(:altezza), Sovrapposizione(:sesso)), Elementi(Punti(X, Y, Legenda(9)), Linea di adattamento(X, Y , Legenda(11))) );
Se
Visualizza altro...
If(condition1,
//code1
, //else
//code2
);
Se(condizione1, //codice1, //else //codice2);
elif
Visualizza altro...
If(condition1,
//code1
, //condition2,
//code2
, //else
//code3
);
If(condizione1, //codice1 , //condizione2, //codice2 , //else //codice3 );
funz
Visualizza altro...
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(.);
);
funzione1 = funzione({param1, param2, param3 = .}, {Default Local}, /*"""funzione1 che restituisce mancante. Ulteriori descrizioni riguardanti la funzione Argomenti: param1 (displaybox): param2 (char): param3 (num): Restituisce: num: mancante Genera: eccezione_msg """*/ return(.); );
nuovo
Visualizza altro...
/*"""One sentence description for this script
Author:
Creation Date:
Creation JMP Version:
Description:
Todo:
*
*
"""*/
Names Default To Here(1);
/*"""Descrizione di una frase per questo script Autore: Data di creazione: Versione JMP di creazione: Descrizione: Da fare: * * """*/ Nomi Predefinito qui(1);
ora
Visualizza altro...
nw = New Window("name",
V List Box(align("Center"),
)
, << Set Window Icon("JMP")
);
nw = Nuova finestra("nome", V Casella di riepilogo(align("Centro"), ), << Imposta icona finestra("JMP") );
modale
Visualizza altro...
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 = Nuova finestra("Finestra modale", << modale, << restituisce risultato, Casella di riepilogo H( Casella di riepilogo("Opzioni", lb = Casella di riepilogo({}) ), Casella di riepilogo("Azioni", Casella di scaletta( N Col(1), Casella pulsante("OK"), Casella pulsante("Annulla") ) ) ) , << Imposta icona finestra("Avviso") ); If(nw["Pulsante"] != 1, Throw("Annullato"); );
mq
Visualizza altro...
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 = "\[seleziona 1 dal doppio]\"; dbc = Crea connessione al database (dsn_string); sql = Eval Insert(sql_template, "¤"); // usa ¤ per evitare problemi con la regex quando usi ^ dt = Esegui SQL(dbc, sql, "NewTable"); Chiudi connessione al database (dbc);
Tentativo
Visualizza altro...
Try(
Show(a);
, // Catch
show(exception_msg);
);
Try( Show(a); , // Catch show(exception_msg); );
Ho anche aggiunto community_template.jsl archiviato nella mia cartella di frammenti $DOCUMENTI, che utilizzo per archiviare le mie soluzioni di scripting dalla community JMP
Visualizza altro...
/*"""
author: jthi
date: YYYY-MM-DD
url: https://community.jmp.com/t5/Discussions/
keywords/tags: []
"""*/
Names Default To Here(1);
Esempio
In questo semplice esempio creerò un nuovo script. Lo script avrà una funzione che eseguirà una query SQL e quindi restituirà la tabella dei risultati.
Per prima cosa avvierò un nuovo file di script .jsl. Inizierò scrivendo
#snippet new
successivamente eseguirò il componente aggiuntivo per sostituire quello snippet. Poiché ho prescritto il nome completo dello snippet nella riga #snippet, questo verrà preselezionato per me

e posso semplicemente premere Invio subito dopo aver aperto il componente aggiuntivo per utilizzare lo snippet.
Successivamente aggiungerò una nuova funzione con lo snippet func
#snippet func
e poi all'interno aggiungerò lo snippet sql
#snippet sql
Il mio codice attuale è simile al seguente:
Visualizza altro...
/*"""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(.);
);
/*"""Questo componente aggiuntivo fornisce la funzionalità Snippet a JMP Script Editor. Autore: Data di creazione: Versione JMP di creazione: Descrizione: Da fare: * * """*/ Nomi predefiniti qui(1); funzione1 = funzione({param1, param2, param3 = .}, {locale predefinito}, /*" ""funzione1 che restituisce mancante. Ulteriori descrizioni riguardanti la funzione Argomenti: param1 (displaybox): param2 (char): param3 (num): Restituisce: num: Missing Genera: eccezione_msg """*/ sql_template = "\[ seleziona 1 da dual ]\"; dbc = Crea connessione al database(dsnstring); sql = Eval Insert(sql_template, "¤"); // usa ¤ per evitare problemi con la regex quando si utilizza ^ dt = Esegui SQL(dbc, sql, "NewTable"); Chiudi connessione al database(dbc ); ritorno(.); );
Lo ripulirò aggiungendo il rientro all'interno della funzione e compilerò le stringhe di documentazione e infine il mio script sarà simile a questo:
Visualizza altro...
/*"""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);
);
/*"""Esempio sull'utilizzo di JMP Script Editor Snippet Autore: jthi Data di creazione: 2022-12-19 Versione JMP di creazione: JMP Pro 16 """*/ Nomi predefiniti qui(1); get_data = function({duration = 1}, {Default Local}, /*"""Funzione per interrogare i dati da sql Argomenti: durata (num): giorni per interrogare Restituisce: datatable: tabella dati interrogata """*/ dsn_string = "DSN=dBASE Files;DBQ=C:/Programmi/SAS/JMPPRO/16/Samples/Import Data/;" sql_template = "\[ seleziona * dalle tabelle dove dati > sysdate - ¤durata¤ ]\"; dbc = Crea connessione al database(dsn_string); sql = Eval Inserisci(sql_template, "¤"); dt = Esegui SQL(dbc, sql, "Risultato della query"); Chiudi connessione al database(dbc); return(dt); );
Di seguito è riportato un breve video sull'utilizzo del componente aggiuntivo basato sull'esempio riportato di seguito
Possibile lavoro futuro
- Scrivi il file .md corretto
- Aggiungi la gestione degli spazi bianchi/tabulazioni prima dello snippet in modo che il codice inserito abbia il rientro corretto
- Aggiungi il pulsante della guida e il pulsante per aprire la cartella degli snippet degli utenti nel menu del componente aggiuntivo
- Richiede anche la creazione della pagina "aiuto". La pagina di aiuto può essere creata da .md convertito in .html o utilizzando questa pagina della community.
- Tentare di risolvere i problemi di messa a fuoco
- Aggiungi opzione impostazioni
- snippet disabilitati, snippet_str, casella di riepilogo nlines
- Possibilità di aggiungere frammenti alla fine della finestra dello script senza il requisito di #snippet
- Un'altra scorciatoia per "Aggiungi snippet"?
- Forse pensare a una sintassi più complicata, che consentirebbe di precompilare alcuni valori negli snippet
- #snippet !param1 !param2 (o qualcosa di simile)
- Forse consentire anche la valutazione dei valori dalle variabili nello script? Ciò richiederebbe una sintassi diversa o lo è già caratteristica di scorrimento ?
- Possibilità di incorporare l'elenco degli snippet accanto all'editor di script
- Aggiungi altri snippet già scritti
- Aggiungi la possibilità di aggiungere descrizioni agli snippet
Registro delle modifiche
Versione 2.0 (20 dicembre 2022)
- Aggiunti nuovi snippet: modale e if. Il nuovo elif ha sostituito il vecchio if snippet
- Controllo dello snippet modificato per utilizzare l'elenco di valori. Aggiunti #sni e #snip come parole chiave aggiuntive (elenco attuale #sni, #snip, #snippet)
- Aggiunte nuove variabili configurabili
- L'anteprima dello script è stata ampliata per contenere circa 80 caratteri di codice
- Aggiunto pulsante Guida al menu dei componenti aggiuntivi
- Aggiunto il pulsante Apri cartella snippet al menu dei componenti aggiuntivi
- Aggiunto supporto per il rientro durante l'utilizzo dello snippet
Versione 2.0.1 (22 dicembre 2022)
- Tentativo di risolvere il problema per cui le righe vuote venivano rimosse dagli snippet
@hogi
Non sono sicuro di poter accedere alla posizione del cursore dell'utente in Scripting Box direttamente con JSL. Posso eseguire soluzioni alternative con PowerShell e Windows dll, ma (molto probabilmente) non le farò per questo componente aggiuntivo poiché funziona abbastanza bene per me con l'uso di parole chiave.
@jthi , grazie mille per questo componente aggiuntivo. Questo può aiutare molto.
Potresti aggiungere un pulsante per aprire il file C:\Utenti\ cartella \Documenti\jmp_script_editor_snippets\.
@jthi ha scritto:- Possibilità di aggiungere frammenti alla fine della finestra dello script senza il requisito di #snippet
... o nella posizione attuale del cursore?
Potresti posizionare a #frammento proprio lì il componente aggiuntivo non lo trova da qualche altra parte nel codice.
Ma è un bene che sia giusto #frammento E non
#questo è il posto dove dovrebbe andare il mio snippet

forse: consenti # frammento (con spazio) e per rendere la funzionalità più robusta contro gli "errori" dell'utente.