2010-02-10 12 views
7

Sono nuovo di casa di emacs, ma sono scioccato da quello che posso davvero fare e da quanto tempo risparmia (i macro salvano MOLTO tempo). Ma mi stavo chiedendo che fosse possibile creare script basati su step dove chiede all'utente di inserire ed eseguire il codice basato su quello. Per esempio forse io voglio creare una query SQL per cui sarebbe chiesto qualcosa di simile:Emacs: esiste un modo per creare uno script interattivo utilizzando Emacs?

>table name? 
myTable 
>type of query (select, insert, update, delete) 
select 
>fields to get 
name, id 
>Result query is "select (name, id) from myTable" 

Questo è solo un contorno di un'idea ma ero da meravigliarsi perché qualcosa come questo sarebbe utile avere. Qualcuno ha menzionato gli script AWK, ma non ero sicuro se quello fosse l'albero giusto da abbaiare o meno. Sono su Windows ma non penso che importi molto.

ho sicuramente apprezzare qualsiasi informazione su questo articolo, grazie

risposta

7

vedono questo piccolo hack su emacswiki: Prompting During Keyboard Macro Execution. Altrimenti puoi sempre mettere in pausa una macro e inserire l'esecuzione del testo nei punti in cui hai dato C-x q durante la definizione, vedi Executing Macros with Variations. Infine si può definire una funzione e utilizzare interactive per ottenere i parametri richiesti, cioè .:

(defun my-build-query (table type field) 
    (interactive "sTable name: \nsType of query: \nsFields to get: ") 
    (message "%s (%s) from %s" type fields table) 
) 

Si potrebbe mettere questa funzione nel vostro ~/.emacs ed eseguirlo con M-x: my-build-query.

Spero che questo vi fornisca alcuni suggerimenti per iniziare!

P.S .: Ah, e un'altra idea. L'approccio probabilmente più semplice per questo tipo di cose è utilizzare YASnippet (dare un'occhiata allo screencast sulla pagina).

+0

Sì, io uso yasnippet, non ero a conoscenza del fatto che ti permettessero di creare snippet in cui richiede informazioni, non sono sicuro se sia in grado di gestire script davvero pesanti in cui ho intenzione di creare molte cose, ma sicuramente lo verificherò –

+0

Ciao John, yasnippet in realtà non chiederà l'input, ma puoi fare il dall'opzione all'opzione. Stavo pensando a qualcosa nella riga di "selezionare $ {1: campi} da $ {2: tabella} $ 0". Ma se vuoi qualcosa di più complesso un "defun" potrebbe essere meglio ... – danielpoe

+0

Puoi anche impostarlo per inserire la query direttamente nel buffer con (inserire ....) Ma sì, gli argomenti di una funzione interattiva sono un cosa davvero carina da sapere –

2

È possibile utilizzare read-from-minibuffer, utilizzando Emacs Lisp, aka elisp.

+0

Questo funziona, ma non è piacevole, dal momento che non si può vedere l'uscita di interazioni precedenti. –

+0

Hai un collegamento interrotto –

2

ad es. In awk.

BEGIN{ 
while (1){ 
    printf "Enter table name: " 
    getline tablename 
    printf "Enter type of query: (s)elect, (i)nsert, (u)pdate, (d)elete, (q)uit: " 
    getline querytype 
    if (querytype ~ /^q|Q$/) { exit} 
    printf "Enter fields to get (field1,..): " 
    getline fields 
    sql=querytype" ("fields") from " tablename 
    print "Result query is " sql 
    printf "Do you want to execute query??: (yY)es, (nN)o" 
    getline choice 
    if (choice ~ /^y|Y$/) { 
    # use sql cmd here 
    } 
} 
} 

Salva con nome myscript.awk e sulla linea di comando

c:\test> gawk -f myscript.awk 
+0

Wow risposta impressionante. Più di quanto avrei potuto sperare. Molte grazie! :-) –

+0

a pensarci non mi permetterebbe di usare i comandi emacs su ogni linea disponibile. Ma è bello sapere che questa soluzione è là fuori. –

1

La cosa giusta, penso, è scrivere una funzione simile a una riga che consenta il prompt e l'input dell'utente nel buffer.

Questa è una di quelle cose che è abbastanza facile da implementare, ma difficile da fare in un modo davvero piacevole. Probabilmente c'è un buon codice elis riutilizzabile per farlo, ma non ne sono a conoscenza.

1

Ecco un'implementazione di base per iniziare:

(defun prompt-for-sql-statement (table type fields) 
    (interactive 
    (list 
    (read-from-minibuffer "Table name? ") 
    (completing-read "Type of statement? " '("select" "insert" "update" "delete")) 
    (let (field fields (index 1)) 
     (while (not (string= "" (setq field (read-from-minibuffer (format "Field #%d: " index))))) 
     (setq fields (cons field fields) index (1+ index))) 
     (mapconcat 'identity (nreverse fields) ", ")))) 
    (insert type " (" fields ") from " table)) 

Quando si digita M-x prompt-for-sql-statement (o digitare una sequenza di tasti che avete tenuti il ​​comando a), si otterrà una serie di richieste:

Table name? myTable 
Type of statement? select 
Field #1: foo 
Field #2: bar 
Field #3: baz 
Field #4: 

È possibile eseguire il completamento tramite tabulazione sul tipo di istruzione e un campo vuoto termina l'elenco. Quindi la funzione inserirà l'istruzione SQL costruita ovunque sia stato il punto in cui è stato richiamato il comando.

Il comando come scritto genererà istruzioni SQL che sembrano tutte un SELECT ("seleziona ... dalla tabella", "inserisci ... dalla tabella", ecc.). Un'implementazione più intelligente saprebbe come produrre la sintassi corretta per ogni tipo di istruzione SQL.

1

altro possiblity potrebbe essere un modello skeleton o di altri emacs (forse TEMPO?), Eventualmente in combinazione con abbrevs

Problemi correlati