7 Stimmen

Emacs: Gibt es eine Möglichkeit, ein interaktives Skript mit Emacs zu erstellen?

Ich bin neu in Emacs, aber schockiert darüber, was ich wirklich tun kann und wie viel Zeit es spart (Makros sparen eine Menge Zeit). Aber ich habe mich gefragt, ob es möglich ist, schrittweise Skripte zu erstellen, bei denen der Benutzer nach Eingaben gefragt wird und der Code daraufhin ausgeführt wird. Zum Beispiel möchte ich vielleicht eine SQL-Abfrage erstellen, so dass es etwas wie:

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

Dies ist nur ein Entwurf einer Idee, aber ich habe mich gefragt, ob so etwas nicht nützlich wäre. Jemand erwähnte AWK-Skripte, aber ich war mir nicht sicher, ob das der richtige Baum ist, um ihn zu entrinden oder nicht. Ich bin auf Windows, aber ich glaube nicht, dass das eine große Rolle spielt.

Ich bin für jede Information dankbar, Danke

7voto

danielpoe Punkte 3616

Siehe diesen kleinen Hack auf emacswiki: Eingabeaufforderung bei der Ausführung von Tastaturmakros . Andernfalls können Sie ein Makro jederzeit anhalten und die Textausführung an den Stellen einfügen, an denen Sie C-x q bei der Definition, siehe Ausführen von Makros mit Variationen . Schließlich können Sie eine Funktion definieren und mit interaktiv um die erforderlichen Parameter zu erhalten, d.h.:

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

Sie könnten diese Funktion in Ihre ~/.emacs und führen Sie es mit M-x: my-build-query .

Ich hoffe, dies gibt Ihnen einige Anhaltspunkte für den Einstieg!

P.S.: Ahh, und noch eine Idee. Der wahrscheinlich einfachere Ansatz für diese Art von Dingen ist die Verwendung von YASnippet (sehen Sie sich den Screencast auf der Seite an).

0 Stimmen

Ja ich benutze yasnippet, ich war mir nicht bewusst, dass sie Ihnen erlaubten, Snippets zu erstellen, wo es nach Informationen fragt, ich bin auch nicht sicher, ob es wirklich schweres Skripting handhaben kann, wo ich viel Zeug ausbauen werde, aber ich werde es definitiv überprüfen

0 Stimmen

Hallo John, yasnippet fragt eigentlich nicht nach Eingaben, aber Sie können mit <Tab> von einer Option zur nächsten wechseln. Ich dachte an etwas in der Art von "select ${1:fields} from ${2:table} $0". Aber wenn Sie etwas Komplexeres wollen, ist ein "defun" vielleicht besser ...

0 Stimmen

Sie können es auch so einrichten, dass die Abfrage direkt in den Puffer eingefügt wird (insert....). Aber ja, Argumente für eine interaktive Funktion sind eine wirklich nette Sache, die man wissen sollte

2voto

Maurits Rijk Punkte 9485

Sie können verwenden Lesen aus dem Minipuffer mit Emacs Lisp, auch bekannt als elisp.

0 Stimmen

Das funktioniert zwar, ist aber nicht sehr angenehm, da Sie die Ergebnisse der vorherigen Interaktionen nicht sehen können.

0 Stimmen

Sie haben einen defekten Link

2voto

ghostdog74 Punkte 305138

Z.B. 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
    }
 }
}

als myscript.awk speichern und auf der Kommandozeile

 c:\test> gawk -f myscript.awk

0 Stimmen

Wow, eine tolle Reaktion. Mehr als ich mir erhoffen konnte. VIELEN DANK! :-)

0 Stimmen

Wenn ich darüber nachdenke, scheint mir das nicht zu erlauben, Emacs-Befehle in jeder verfügbaren Zeile zu verwenden. Aber es ist gut zu wissen, dass diese Lösung da draußen ist.

1voto

Charles Stewart Punkte 11393

Das Richtige ist meiner Meinung nach, eine readline-ähnliche Funktion zu schreiben, die eine Eingabeaufforderung und Benutzereingabe innerhalb des Puffers ermöglicht.

Dies ist eines der Dinge, die einfach genug zu implementieren sind, aber schwer auf eine wirklich ansprechende Weise zu tun. Es gibt wahrscheinlich guten, wiederverwendbaren Elisp-Code, um dies zu tun, aber ich kenne ihn nicht.

1voto

Sean Punkte 28106

Hier ist eine grundlegende Implementierung, die Ihnen den Einstieg erleichtert:

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

Wenn Sie eingeben M-x prompt-for-sql-statement (oder geben Sie eine Tastenfolge ein, an die Sie den Befehl gebunden haben), erhalten Sie eine Reihe von Eingabeaufforderungen:

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

Sie können den Anweisungstyp mit der Tabulatortaste vervollständigen, und ein leeres Feld beendet die Liste. Dann fügt die Funktion die konstruierte SQL-Anweisung an der Stelle ein, an der Sie den Befehl aufgerufen haben.

Der Befehl, wie er geschrieben ist, erzeugt SQL-Anweisungen, die alle wie ein SELECT aussehen ("select ... from table", "insert ... from table", usw.). Eine intelligentere Implementierung würde wissen, wie man die korrekte Syntax für jede Art von SQL-Anweisung erzeugt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X