Emacs:有没有办法使用Emacs创建交互式脚本?

时间:2010-02-10 10:01:48

标签: emacs macros awk editing

我是emacs的新手,但对我真正做的事情和节省的时间感到震惊(宏节省了很多时间)。但我想知道有可能创建基于步骤的脚本,它要求用户输入并基于此执行代码。例如,我可能想创建一个SQL查询,因此它会提示如下:

>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上,但我认为这不重要。

我非常感谢您的任何信息,谢谢

6 个答案:

答案 0 :(得分: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)
)

您可以将此功能放在~/.emacs中,然后使用M-x: my-build-query执行此操作。

希望这能为您提供一些入门指南!

P.S。:啊,还有一个想法。这种东西可能更简单的方法是使用YASnippet(看看页面上的截屏视频)。

答案 1 :(得分:2)

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

答案 2 :(得分: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

答案 3 :(得分:1)

我认为,正确的做法是编写类似readline的函数,允许在缓冲区内进行提示和用户输入。

这是容易实现的事情之一,但很难以一种非常令人愉悦的方式做到。可能有很好的可重复使用的elisp代码可以做到这一点,但我不知道。

答案 4 :(得分: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:

您可以对语句类型执行制表符完成,空字段将终止列表。然后,该函数将在您调用命令时的任何位置插入构造的SQL语句。

写入的命令将生成所有看起来像SELECT的SQL语句(“select ... from table”,“insert ... from table”等)。更智能的实现将知道如何为每种类型的SQL语句生成正确的语法。

答案 5 :(得分:1)

另一种可能性可能是skeleton或其他emacs模板(也许是节奏?)可能与缩写相结合