2010-02-10 86 views
7

我是emacs的新手,但對我真正能做的事情以及它節省多少時間感到震驚(宏可以節省很多時間)。但是我想知道可以創建基於腳本的腳本,它會要求用戶輸入並根據這些腳本執行代碼。比如,也許我想創建一個SQL查詢,以便它會提示是這樣的:Emacs:有沒有辦法使用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" 

這只是一個想法的輪廓,但我很奇怪,因爲這樣的事情將是有有益的。有人提到AWK腳本,但我不確定這是否是正確的樹。我在Windows上,但我認爲這不重要。

我絕對欣賞的任何信息在此,感謝

回答

7

看到emacswiki這個小黑客:Prompting During Keyboard Macro Execution。否則,您可以始終暫停宏並在您定義期間給予C-x q的位置插入文本執行,請參閱Executing Macros with Variations。最後,你可以定義一個函數,並使用interactive獲得所需要的參數,即:

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

你可以把這個功能在你的~/.emacsM-x: my-build-query執行它。

希望這能爲您提供一些入門指南!

評分:啊,還有一個想法。這種東西可能更簡單的方法是使用YASnippet(查看頁面上的屏幕錄像)。

+0

是啊我使用yasnippet,我沒有意識到他們允許你創建片段,它提示信息,我也不確定它是否可以處理真正的重型腳本,我要建立很多東西,但我一定會檢查出它 – 2010-02-10 11:55:49

+0

嗨約翰,yasnippet實際上不會提示輸入,但你可以從選項到。我正在考慮從$ {2:table} $ 0中選擇$ {1:fields}的行。但是,如果你想要更復雜的一個「defun」可能會更好... – danielpoe 2010-02-10 16:07:15

+0

你也可以設置它插入查詢直接插入緩衝區(插入....)但是,交互函數的參數是一個真的很好的事情要知道 – 2010-02-10 16:31:28

2

您可以使用read-from-minibuffer,使用的Emacs Lisp,又名elisp的。

+0

這工作,但不愉快的,因爲你看不到以前的交互的輸出組合。 – 2010-02-10 12:58:08

+0

你有一個斷開的鏈接 – 2015-09-09 17:16:39

2

例如在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 
    } 
} 
} 

另存爲myscript.awk和命令行

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

哇真棒迴應。超過我本來希望的。非常感謝! :-) – 2010-02-10 10:26:17

+0

一想到這似乎就不允許我在每條可用的行上使用emacs命令。但很高興知道這個解決方案在那裏。 – 2010-02-10 10:40:10

1

我認爲,正確的做法是編寫一個類似readline的函數,允許緩衝區中的提示和用戶輸入。

這是很容易實現的事情之一,但很難以真正令人滿意的方式做到。可能有好的可重用的elisp代碼可以做到這一點,但我不知道它。

1

這是一個基本的實現,讓你開始:

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

當您鍵入M-x prompt-for-sql-statement(或鍵入您綁定的命令鍵序列),你會得到一系列的提示:

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

您可以對語句類型執行tab完成,並且空字段將終止列表。然後,該函數將在您調用該命令的任何位置插入構造的SQL語句。

寫入的命令將生成所有類似於SELECT(「select ... from table」,「insert ... from table」等)的SQL語句。更聰明的實現將知道如何爲每種類型的SQL語句生成正確的語法。

1

另一種可能也許是一個skeleton或其他emacs的模板(也許節奏?)可能與abbrevs

相關問題