Макрос Emacs для запуска в режиме оболочки и запуска команды - PullRequest
2 голосов
/ 16 марта 2012

У меня есть признание: я не знаю Лисп.Несмотря на это, с небольшой помощью некоторых коллег мне удалось написать макрос / скрипт emacs, который:

  1. переключился в режим оболочки (т.е. Mx shell-mode)
  2. отключенные усекающие строки (т. Е. Mx toggle-truncate-lines)
  3. запустили консоль базы данных (т. Е. "Mysql")

Затем я смог запустить emacs сэтот макрос, используя опцию --script, и внезапно у меня появился способ запустить mysql в более дружественной среде с помощью одной команды: -)

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

Теперь я действительно ненавижуТАК сообщения, где кто-то говорит: «Пожалуйста, напишите мой код для меня», поэтому я не хочу этого делать.Тем не менее, если какие-либо эксперты по макросам emacs могли бы по крайней мере дать мне несколько указателей (например, «вот как вы вызываете команду Mx в макросе»), или указать мне руководство по написанию макросов emacs, или иначе «научить меня ловить рыбу»В этом вопросе я был бы очень признателен.

... и если бы у кого-то уже был похожий сценарий, который он хотел опубликовать, я бы не стал жаловаться; -)

Ответы [ 3 ]

5 голосов
/ 16 марта 2012

Большинство команд emacs (т. Е. M-x toggle-truncate-lines) могут быть переведены непосредственно в elisp, заключив их в скобки:

(toggle-truncate-lines)

Слухи верны, в lisp вы просто разбрасываете скобки и создаете магию.

Теперь в этом случае вы можете сделать лучше.Переключение имеет смысл для интерактивной функции, но в программе, которую вы на самом деле не хотите переключать усеченных строк, вы хотите включить усеченных строк.То же самое, если для начала отключить truncate-lines, но вы не знаете, когда будет запущена ваша программа.В любом случае, в Emacs функции часто контролируются переменной.В этом случае переменная равна truncate-lines, и для включения этой функции вы устанавливаете переменную на t (что означает true).

Для этого используйте:

(setq truncate-lines t)

Мы используем setq вместо = для назначения, потому что они делали шумиху до того, как было изобретено =.

Для настоящего совка вы должны взглянуть на превосходное Роберт Чассель "ВведениеПрограммированию в Emacs Lisp ".Он встроен в ваш emacs, вы можете получить его с помощью C-h i m Emacs Lisp Intro.

3 голосов
/ 16 марта 2012

Хороший способ (я думаю) начать писать функции elisp - записать макросы клавиатуры, а затем проанализировать их, используя edit-kbd-macro

Например, если вы начнете запись макроса клавиатуры с помощью f3 , затем выполните все необходимые действия в интерактивном режиме и завершите макрос с помощью f4 , вы увидите базовый emacs команды lisp с использованием Mx edit-kbd-macro f4 (это последнее f4 - это привязка клавиш, которую вы использовали для выполнения макроса клавиатуры)

<<shell>>                  ;; shell
<<toggle-truncate-lines>>  ;; toggle-truncate-lines
mysql                      ;; self-insert-command * 5
RET                        ;; comint-send-input

Теперь вы можете написать скрипт, используя эти функции, просматривая документацию (например, C-h f toggle-truncate-lines), чтобы увидеть, следует ли вам вызывать их со специальными аргументами в неинтерактивном режиме. Вам также следует заменить self-insert-command звонками на insert.

Это должно дать вам что-то вроде следующего скрипта, который вы можете вызвать с помощью emacs --load myscript.el

(shell)
(toggle-truncate-lines 1)
(insert "mysql")
(comint-send-input)

Конечно, в первый раз это может работать не так, как ожидалось, поэтому вам, возможно, придется набрать (setq debug-on-error t), чтобы получить отладочную информацию.

1 голос
/ 16 марта 2012

Какую версию Emacs вы используете?

В Emacs 24 у меня есть M-x sql-mysql, который делает все, что вы просите, и имеет блокировку шрифта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...