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

Emacs:有没有办法使用Emacs创建交互式脚本?,emacs,macros,awk,editing,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 "selec

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

我非常感谢您提供有关这方面的任何信息,谢谢您使用Emacs Lisp,又名elisp。

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

在emacswiki上查看此小技巧:。否则,您可以始终暂停宏并在定义过程中给出
C-x q
的点插入文本执行,请参阅。最后,您可以定义一个函数并使用它来获取所需的参数,即:

(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
执行它

希望这能给你一些开始的建议


附言:啊,还有一个想法。对于这类东西,可能更简单的方法是使用(查看页面上的屏幕广播)。

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


这是很容易实现的事情之一,但很难以真正令人愉快的方式实现。可能有很好的可重用elisp代码可以做到这一点,但我不知道它。

这里有一个基本的实现让您开始:

(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))
键入sql语句的M-x提示符时(或键入已将命令绑定到的键序列),将得到一系列提示:

Table name? myTable
Type of statement? select
Field #1: foo
Field #2: bar
Field #3: baz
Field #4:
您可以对语句类型执行制表符补全,一个空字段将终止列表。然后,函数将在调用命令时插入构造的SQL语句


所编写的命令将生成SQL语句,这些语句看起来都像SELECT(“SELECT…from table”,“insert…from table”,等等)。一个更智能的实现将知道如何为每种类型的SQL语句生成正确的语法。

另一种可能是一个或其他emacs模板(可能是tempo?),可能与abbrevs结合使用。比我希望的要多。非常感谢!:-)仔细想想,这似乎不允许我在每一行上使用emacs命令。但是很高兴知道这个解决方案就在那里。是的,我使用yasnippet,我不知道他们允许你在提示信息的地方创建代码段,我也不确定它是否能够处理非常繁重的脚本,我将构建很多东西,但我肯定会检查出来Hi John,yasnippet实际上不会提示输入,但你可以从一个选项到另一个选项。我在想“从${2:table}$0中选择${1:fields}”一行中的内容。但是如果你想要更复杂的东西,“defun”可能更好…你也可以设置它,用(insert…)将查询直接插入缓冲区。但是,是的,交互函数的参数是了解这项工作的一件非常好的事情,但并不愉快,因为你看不到以前交互的输出。你有一个断开的链接