7

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

我绝对感谢有关此的任何信息,谢谢

4

6 回答 6

7

请参阅 emacswiki 上的这个小技巧:在键盘宏执行期间提示。否则,您始终可以暂停宏并C-x q在定义期间指定的位置插入文本执行,请参阅Executing Macros with Variations。最后,您可以定义一个函数并使用交互来获取所需的参数,即:

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

希望这能给您一些入门的指导!

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

于 2010-02-10T10:47:30.137 回答
2

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

于 2010-02-10T10:21:44.203 回答
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
于 2010-02-10T10:25:15.867 回答
1

另一种可能性可能是骨架或其他 emacs 模板(可能是节奏?)可能与缩写结合

于 2010-02-10T16:19:03.243 回答
1

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

这是很容易实现但很难以真正令人愉悦的方式完成的事情之一。那里可能有很好的可重用 elisp 代码来执行此操作,但我不知道。

于 2010-02-10T13:02:53.533 回答
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 语句生成正确的语法。

于 2010-02-10T15:57:24.320 回答