Emacs: существует ли способ создать интерактивное использование сценария Emacs?

Я плохо знаком с 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, но я не думаю, что имеет значение много.

Я определенно ценю любую информацию об этом, Спасибо

7
задан John Baker 10 February 2010 в 10:01
поделиться

6 ответов

см. этот небольшой хак на emacswiki: Ввод подсказки во время выполнения макроса с клавиатуры. В противном случае вы всегда можете приостановить макрос и вставить выполнение текста в тех местах, где вы вводите C-x q во время определения, см. Выполнение макросов с вариациями. Наконец, вы можете определить функцию и использовать 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 (посмотрите на скринкаст на странице).

7
ответ дан 6 December 2019 в 15:21
поделиться

, например, в Оук.

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
ответ дан 6 December 2019 в 15:21
поделиться

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

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

1
ответ дан 6 December 2019 в 15:21
поделиться

Вот базовая реализация для начала:

(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 ("select ... from table", "insert ... from table" и т.д.). Более умная реализация будет знать, как создать правильный синтаксис для каждого типа SQL-оператора.

1
ответ дан 6 December 2019 в 15:21
поделиться

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

1
ответ дан 6 December 2019 в 15:21
поделиться

Вы можете использовать read-from-minibuffer, используя Emacs Lisp, он же elisp.

2
ответ дан 6 December 2019 в 15:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: