2010-02-10 7 views
7

Jestem nowy dla emacsa, ale zszokowany tym, co naprawdę mogę zrobić i ile czasu to oszczędza (makra oszczędzają DUŻO czasu). Zastanawiam się jednak, czy można tworzyć skrypty oparte na krokach, w których prosi się użytkownika o dane wejściowe i wykonuje kod oparty na tym. Na przykład może chcę utworzyć kwerendę SQL więc byłoby skłonić coś takiego:Emacs: Czy istnieje sposób na stworzenie interaktywnego skryptu za pomocą Emacsa?

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

Jest to tylko zarys pomysłu, ale byłem dziwnego, bo coś takiego byłoby przydatne. Ktoś wspomniał o skryptach AWK, ale nie byłam pewna, czy to było właściwe drzewo do szczekania, czy nie. Jestem w systemie Windows, ale nie sądzę, że to ma znaczenie.

pewno wdzięczni za wszelkie informacje na ten temat, dzięki

Odpowiedz

7

zobaczyć ten mały siekać na emacswiki: Prompting During Keyboard Macro Execution. W przeciwnym razie możesz zawsze wstrzymać makro i wstawić tekst w punktach, w których podczas definiowania podajesz C-x q, patrz Executing Macros with Variations. Wreszcie można zdefiniować funkcję i używać interactive aby uzyskać wymagane parametry, tj .:

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

Można umieścić tę funkcję w swojej ~/.emacs i wykonać go z M-x: my-build-query.

Mam nadzieję, że daje to kilka wskazówek do rozpoczęcia!

P.S .: Ahh, i jeszcze jeden pomysł. Prawdopodobnie łatwiejszym podejściem do tego rodzaju rzeczy jest użycie YASnippet (spójrz na screencast na stronie).

+0

Tak, używam yasnippet, nie wiedziałem, że pozwolili ci tworzyć fragmenty, w których prosi o informacje, nie jestem też pewien, czy potrafi obsłużyć naprawdę ciężkie skrypty, w których zamierzam zbudować mnóstwo rzeczy, ale na pewno to sprawdzę. –

+0

Cześć John, Yasnippet nie prosi o wprowadzenie danych, ale możesz z opcji do opcji. Myślałem o czymś w linii "wybierz $ {1: pola} z $ {2: table} 0 $". Ale jeśli chcesz czegoś bardziej złożonego, "defun" może być lepszy ... – danielpoe

+0

Możesz także ustawić go tak, by wstawiał zapytanie bezpośrednio do bufora za pomocą (wstaw ....) Ale tak, argumenty do funkcji interaktywnej są naprawdę miło o tym wiedzieć –

2

można użyć read-from-minibuffer korzystając Emacs Lisp, aka elisp.

+0

To działa, ale nie jest przyjemne, ponieważ nie można zobaczyć wyjście poprzednich interakcji. –

+0

Masz zepsuty link –

2

np. W 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 
    } 
} 
} 

Zapisz myscript.awk i na linii poleceń

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

Wow, wspaniała odpowiedź. Więcej, niż mogłem się spodziewać. Wielkie dzięki! :-) –

+0

przy myśleniu o tym nie wydaje mi się, żebym mógł używać poleceń emacs na każdej dostępnej linii. Ale dobrze jest wiedzieć, że to rozwiązanie istnieje. –

1

Właściwe jest, jak sądzę, napisanie funkcji podobnej do tej, która pozwala na podpowiadanie i wprowadzanie danych przez użytkownika w buforze.

Jest to jedna z tych rzeczy, które są łatwe do wdrożenia, ale trudne do zrobienia w naprawdę przyjemny sposób. Jest tam prawdopodobnie dobry kod elizujący wielokrotnego użytku, ale nie wiem.

1

Oto podstawowe wdrożenie możesz zacząć:

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

Po wpisaniu M-x prompt-for-sql-statement (lub wpisz sekwencję klawiszy pan związany polecenie), otrzymasz serię podpowiedzi:

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

Możesz wykonać uzupełnianie tabulatorem w typie instrukcji, a puste pole zakończy listę. Następnie funkcja wstawi skonstruowaną instrukcję SQL, gdziekolwiek był punkt, kiedy wywołałeś polecenie.

Komenda w formie pisemnej wygeneruje instrukcje SQL, które wyglądają jak SELECT ("wybierz ... z tabeli", "wstaw ... z tabeli" itp.). Lepsza implementacja będzie wiedzieć, jak utworzyć poprawną składnię dla każdego typu instrukcji SQL.

1

inna możliwośc może być skeleton lub inne emacs szablon (być może tempo?), Ewentualnie w połączeniu z abbrevs

Powiązane problemy