2010-02-10 26 views
7

Tôi mới làm quen với emacs, nhưng bị sốc với những gì tôi thực sự có thể làm và thời gian nó tiết kiệm được bao nhiêu (Macro tiết kiệm rất nhiều thời gian). Nhưng tôi đã tự hỏi rằng có thể tạo các kịch bản dựa trên bước mà nó yêu cầu người dùng nhập và thực thi mã dựa trên đó. Ví dụ có lẽ tôi muốn tạo một truy vấn SQL để nó sẽ nhắc một cái gì đó như:Emacs: Có cách nào để tạo kịch bản tương tác bằng Emacs không?

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

Đây chỉ là một phác thảo của một ý tưởng nhưng tôi tự hỏi vì một cái gì đó như thế này sẽ hữu ích để có. Có người đã đề cập đến các kịch bản AWK nhưng tôi không chắc liệu đó có phải là cây phải sủa hay không. Tôi đang ở trên Windows nhưng tôi không nghĩ rằng vấn đề là rất nhiều.

Tôi chắc chắn đánh giá cao bất kỳ thông tin về vấn đề này, Cảm ơn

Trả lời

7

thấy ít hack này trên EmacsWiki: Prompting During Keyboard Macro Execution. Nếu không, bạn luôn có thể tạm dừng macro và chèn bạn thực thi văn bản tại các điểm mà bạn cung cấp cho C-x q trong khi định nghĩa, xem Executing Macros with Variations. Cuối cùng, bạn có thể định nghĩa một hàm và sử dụng interactive để có được những thông số cần thiết, tức là .:

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

Bạn có thể đặt chức năng này trong ~/.emacs của bạn và thực hiện nó với M-x: my-build-query.

Hy vọng điều này sẽ cung cấp cho bạn một số gợi ý để bắt đầu!

P.S .: Ahh và một ý tưởng khác. Cách tiếp cận có lẽ dễ dàng hơn cho loại công cụ này là sử dụng YASnippet (xem qua màn hình trên trang).

+0

vâng tôi sử dụng yasnippet, tôi không biết rằng họ cho phép bạn tạo đoạn trích mà nó nhắc thông tin, tôi cũng không chắc liệu nó có thể xử lý kịch bản thực sự nặng nề không, tôi sẽ xây dựng nhiều thứ, nhưng tôi chắc chắn sẽ kiểm tra nó ra –

+0

Hi John, yasnippet sẽ không thực sự nhắc nhở cho đầu vào, nhưng bạn có thể từ tùy chọn đến tùy chọn. Tôi đã suy nghĩ về một cái gì đó trong dòng "chọn $ {1: fields} từ $ {2: table} $ 0". Nhưng nếu bạn muốn một cái gì đó phức tạp hơn "defun" có thể tốt hơn ... – danielpoe

+0

Bạn cũng có thể thiết lập nó để chèn truy vấn thẳng vào bộ đệm với (chèn ....) Nhưng vâng, đối số cho một hàm tương tác là một điều thực sự thú vị để biết về –

2

Bạn có thể sử dụng read-from-minibuffer, sử dụng Emacs Lisp, aka elisp.

+0

này hoạt động, nhưng không phải là dễ chịu, kể từ khi bạn không thể nhìn thấy đầu ra của tương tác trước đây. –

+0

Bạn có liên kết bị hỏng –

2

ví dụ như trong 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 
    } 
} 
} 

tiết kiệm như myscript.awk và trên dòng lệnh

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

Phản hồi tuyệt vời. Nhiều hơn tôi có thể hy vọng. Cảm ơn rất nhiều! :-) –

+0

khi nghĩ về điều này, điều này dường như không cho phép tôi sử dụng lệnh emacs trên mỗi dòng có sẵn. Nhưng nó là tốt để biết giải pháp này là ra khỏi đó. –

1

Điều đúng đắn, tôi nghĩ, là viết một chức năng giống như đường dây cho phép nhập và nhắc người dùng trong bộ đệm.

Đây là một trong những điều dễ thực hiện, nhưng khó làm theo cách thực sự dễ chịu. Có lẽ có thể sử dụng mã elisp có thể tái sử dụng tốt để làm điều này, nhưng tôi không biết về nó.

1

Dưới đây là một việc thực hiện cơ bản để giúp bạn bắt đầu:

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

Khi bạn gõ M-x prompt-for-sql-statement (hoặc gõ một dãy phím bạn đã bị ràng buộc lệnh để), bạn sẽ nhận được một loạt các nhắc nhở:

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

Bạn có thể thực hiện hoàn thành tab trên loại câu lệnh và trường trống sẽ chấm dứt danh sách. Sau đó, hàm sẽ chèn câu lệnh SQL được xây dựng ở bất cứ đâu khi bạn gọi ra lệnh.

Lệnh được viết sẽ tạo ra các câu lệnh SQL mà tất cả trông giống như một SELECT ("select ... from table", "insert ... from table", v.v ...). Triển khai thông minh hơn sẽ biết cách tạo cú pháp chính xác cho từng loại câu lệnh SQL.

1

possiblity khác có thể là một skeleton hoặc emacs khác mẫu (có thể tiến độ?) Có thể kết hợp với abbrevs

Các vấn đề liên quan