Emacs宏以Shell模式启动并运行命令

时间:2012-03-15 23:19:26

标签: emacs macros

我有一个忏悔:我不知道Lisp。尽管如此,在一些同事的帮助下,我设法编写了一个emacs宏/脚本:

  1. 切换到shell模式(即M-x shell-mode)
  2. 禁用截断线(即M-x toggle-truncate-lines)
  3. 启动了一个数据库控制台(即“mysql”)
  4. 然后我可以使用--script选项启动带有该宏的emacs,突然间我有一种方法可以在一个更友好的环境中用一个命令启动mysql: - )

    但问题在于:我改变了工作并将该脚本抛在了后面。现在我非常想在我的新工作中重新创建该脚本,但我不再有任何emacs专家来帮我写出来,就像我在旧工作中那样。

    现在,我真的很讨厌有人基本上说“请为我写代码”的帖子,所以我不想这样做。但是,如果任何emacs宏专家至少可以给我一些指针(比如“这里是你如何在宏中调用Mx命令”),或者指向一个emacs-macro-writing指南,或者“教我钓鱼”在这个问题上,我将不胜感激。

    ...如果有人恰好有类似的脚本已经躺在他们想要发布的地方,我当然不会抱怨; - )

3 个答案:

答案 0 :(得分:5)

大多数emacs命令(即M-x toggle-truncate-lines)可以通过将它们括在括号中直接翻译成elisp:

(toggle-truncate-lines)

谣言是真实的,在口齿不清中,你只是将括号分散开来并制造魔法。

现在在这种情况下,你可以做得更好。切换对于交互式功能是有意义的,但是在程序中,您实际上并不想切换截断线,您希望打开截断线。如果截断行开始时关闭它也是一样的,但是你不知道下一次运行程序的时间。无论如何,在Emacs中,功能通常由变量控制。在这种情况下,变量为truncate-lines,要打开该功能,可以将变量设置为t(这意味着为真)。

为此,请使用:

(setq truncate-lines t)

我们使用setq代替=进行分配,因为他们在=发明之前就已经制作了lisp。

对于真正的独家新闻,你应该看看Robert Chassel出色的“Emacs Lisp编程简介”。它内置了您的emacs,您可以使用C-h i m Emacs Lisp Intro进行访问。

答案 1 :(得分:3)

开始编写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)

当然,第一次这可能无法正常工作,因此您可能需要eval (setq debug-on-error t)来获取调试信息。

答案 2 :(得分:1)

您使用的是什么版本的Emacs?

在Emacs 24中,我有 M-x sql-mysql,它可以执行您提出的所有操作并具有字体锁定功能。