Emacs: есть ли способ создать интерактивный скрипт с использованием Emacs? - PullRequest
7 голосов
/ 10 февраля 2010

Я новичок в 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 ]

7 голосов
/ 10 февраля 2010

см. Этот небольшой взлом в 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.

Надеюсь, это даст вам несколько указателей для начала!

P.S .: Ааа, и еще одна идея. Вероятно, более простой подход для такого рода вещей - использовать YASnippet (посмотрите на скринкаст на странице).

2 голосов
/ 10 февраля 2010

например в 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
2 голосов
/ 10 февраля 2010

Вы можете использовать чтение из минибуфера , используя Emacs Lisp, иначе elisp.

1 голос
/ 10 февраля 2010

другой возможностью может быть скелет или другой шаблон emacs (может быть, темп?), Возможно, в сочетании с сокращениями

1 голос
/ 10 февраля 2010

Вот базовая реализация, с которой можно начать:

(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, где бы ни находилась точка, когда вы вызывали команду.

Команда, как написано, будет генерировать операторы SQL, которые выглядят как SELECT («выбрать ... из таблицы», «вставить»... из таблицы "и т. д.).Разумная реализация будет знать, как создать правильный синтаксис для каждого типа оператора SQL.

1 голос
/ 10 февраля 2010

Думаю, что правильно написать функцию, похожую на readline, которая позволяет запрашивать и вводить данные пользователем внутри буфера.

Это одна из тех вещей, которые достаточно легко реализовать, но трудно сделать действительно приятным способом. Вероятно, для этого есть хороший многоразовый код elisp, но я об этом не знаю.

...