2010-02-10 3 views
7

Я новичок в emacs, но в шоке от того, что я действительно могу сделать и сколько времени он экономит (Макросы сохраняют много времени). Но мне было интересно, можно ли создавать сценарии на основе шагов, где он запрашивает пользователя для ввода и выполняет на основе этого кода. Например, может быть, я хочу, чтобы создать запрос SQL, так что спровоцирует что-то вроде:Emacs: Есть ли способ создать интерактивный скрипт с помощью Emacs?

>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

увидеть эту маленькую хак на emacswiki: Prompting During Keyboard Macro Execution. В противном случае вы всегда можете приостановить макрос и вставить текст в то место, где вы указываете C-x q во время определения, см. Executing Macros with Variations. Наконец, вы можете определить функцию и использовать 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 .: Ahh, и еще одна идея. Вероятно, более легкий подход для такого рода вещей - использовать YASnippet (посмотрите на страницу скринкаста на странице).

+0

Да, я использую yasnippet, я не знал, что они разрешили вам создавать фрагменты, где он запрашивает информацию, я также не уверен, может ли он обрабатывать действительно тяжелые сценарии, где я собираюсь собрать много вещей, но я обязательно проверю это –

+0

Привет, Джон, yasnippet на самом деле не запрашивает ввод, но вы можете от опции к опции. Я думал о чем-то в строке «select $ {1: fields} из $ {2: table} $ 0". Но если вам нужно что-то более сложное, «defun» может быть лучше ... – danielpoe

+0

Вы также можете настроить его, чтобы вставить запрос прямо в буфер с помощью (insert ...). Но да, аргументы для интерактивной функции - это действительно хорошая вещь, чтобы знать о –

2

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

+0

Это работает, но не нравится, так как вы не можете увидеть результаты предыдущих взаимодействий. –

+0

У вас сломанная ссылка –

2

eg in 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 
+0

Wow awesome response. Больше, чем я мог надеяться. Большое спасибо! :-) –

+0

, подумав об этом, это, похоже, не позволит мне использовать команды emacs на каждой доступной строке. Но хорошо знать, что это решение есть. –

1

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

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

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

Команда, написанная в команде, будет генерировать операторы SQL, все из которых выглядят как SELECT («select ... from table», «insert ... from table» и т. Д.). Более разумная реализация будет знать, как создать правильный синтаксис для каждого типа SQL-оператора.

1

другой Possiblity может быть skeleton или другие EMACS шаблон (возможно, темп?), Возможно, в сочетании с

сокращений
Смежные вопросы