2010-02-10 10 views
7

Soy nuevo en emacs, pero me sorprende lo que realmente puedo hacer y cuánto tiempo ahorra (las macros ahorran MUCHO tiempo). Pero me preguntaba si era posible crear scripts basados ​​en pasos en los que se le pregunta al usuario por la entrada y ejecuta el código en función de eso. Por ejemplo tal vez yo quiero crear una consulta SQL por lo que provocaría algo como:Emacs: ¿Hay alguna manera de crear un script interactivo usando 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" 

Esto es sólo un esbozo de una idea, sino que era de extrañar, porque algo como esto sería útil tener. Alguien mencionó los guiones de AWK pero no estaba seguro de si ese era el árbol correcto para ladrar o no. Estoy en Windows, pero no creo que eso importe mucho.

I apreciar ninguna información sobre esto, gracias

Respuesta

7

ver este pequeño programa en EmacsWiki: Prompting During Keyboard Macro Execution. De lo contrario, siempre puede pausar una macro e insertar su ejecución de texto en los puntos donde da C-x q durante la definición, consulte Executing Macros with Variations. Por último se puede definir una función y utilizar interactive para obtener los parámetros necesarios, es decir .:

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

Se puede poner esta función en su ~/.emacs y ejecutarlo con M-x: my-build-query.

¡Espero que esto te dé algunos consejos para empezar!

P.S .: Ahh, y una idea más. El enfoque probablemente más fácil para este tipo de cosas es usar YASnippet (eche un vistazo al screencast en la página).

+0

Sí, yo uso yasnippet, no sabía que le permitieran crear fragmentos en los que se solicita información, tampoco estoy seguro de si puede manejar scripting realmente pesado donde voy a construir muchas cosas, pero definitivamente lo veré –

+0

Hola John, yasnippet en realidad no solicitará la entrada, pero puede de la opción a la opción. Estaba pensando en algo en la línea de "select $ {1: fields} from $ {2: table} $ 0". Pero si quiere algo más complejo, un "defun" podría ser mejor ... – danielpoe

+0

También puede configurarlo para insertar la consulta directamente en el búfer con (insertar ....) Pero sí, los argumentos para una función interactiva son una realmente es bueno saber sobre –

2

Puede utilizar read-from-minibuffer, usando Emacs Lisp, también conocido como elisp.

+0

Esto funciona, pero no es agradable, ya que no puede ver el resultado de las interacciones anteriores. –

+0

Tiene un enlace roto –

2

por ejemplo en 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 
    } 
} 
} 

guardar como myscript.awk y en la línea de comandos

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

Wow awesome response. Más de lo que podría haber esperado. ¡Muchas gracias! :-) –

+0

al pensar en esto, esto no parece permitirme usar los comandos de emacs en cada línea disponible. Pero es bueno saber que esta solución está disponible. –

1

Lo correcto, creo, es escribir una función de línea de lectura que permita indicaciones y la entrada del usuario dentro del búfer.

Esta es una de esas cosas que es bastante fácil de implementar, pero difícil de hacer de una manera realmente agradable. Probablemente haya un buen código elisp reutilizable para hacer esto, pero no lo sé.

1

He aquí una aplicación básica para empezar:

(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)) 

Al escribir M-x prompt-for-sql-statement (o escribe una secuencia de teclas que ha obligado a la orden), obtendrá una serie de indicaciones:

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

Puede completar la tabulación en el tipo de extracto, y un campo vacío terminará la lista. Luego, la función insertará la instrucción SQL construida donde sea que fue cuando invocó el comando.

El comando tal como está escrito generará sentencias de SQL que parecen un SELECTO ("seleccionar ... de la tabla", "insertar ... de la tabla", etc.). Una implementación más inteligente sabría cómo producir la sintaxis correcta para cada tipo de declaración SQL.

1

otra posibilidad podría ser una plantilla skeleton u otros emacs (tal vez el tempo?), Posiblemente en combinación con las abreviaturas

Cuestiones relacionadas