2010-02-10 121 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

相关问题