Я плохо знаком с 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, но я не думаю, что имеет значение много.
Я определенно ценю любую информацию об этом, Спасибо
см. этот небольшой хак на 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 (посмотрите на скринкаст на странице).
, например, в Оук.
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
Я думаю, что правильно написать функцию, подобную 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))
Когда вы набираете 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-оператора.
другой возможностью может быть скелет или другой шаблон emacs (возможно, tempo?), возможно, в сочетании с аббревиатурами
Вы можете использовать read-from-minibuffer, используя Emacs Lisp, он же elisp.