Emacs / Slime按键绑定 / 发送命令到Swank服务器

3

我熟悉Scheme,但对于Emacs(从VIM切换过来)和Elisp还很陌生。

我知道如何做以下操作:

  • 创建简单的键绑定
    • C-c iwb = 缩进整个缓冲区
    • F2 = 打开/关闭折叠
  • 使用emacs中的slime
  • 一些基本的键,如C-x 2,paredit键,一些基本的移动键

我需要在更高级的操作上获得帮助:

我想让F3等于:

  • 将emacs切换到C-x 2模式
  • 在底部窗口中,切换到“slime-repl”缓冲区
  • 在“slime-repl”缓冲区中,发送命令“(test/run)”<--注意,这是要发送到swank服务器,而不是elisp

我知道这样要求别人为我编写脚本很不妥,但如果有人能做到,我会从中学到很多东西。[这也将使我通过研究您的示例进行更复杂的脚本编写。]

谢谢!


你应该注意到 C-x 2 不是一个模式;它只是调用了函数 split-window-below。不可否认,这种区分可能被认为是稍微任意的——模式函数具有与任何其他函数相同的功能,而全局次要模式(如 menu-bar-mode)影响的是帧而不是缓冲区——但模式大多数提供给个体缓冲区的行为,并且按照惯例它们的函数名总是以 -mode 结尾。因为模式是 Emacs 的重要组成部分,如果您不使用这个术语来引用其他函数,就可以避免一些混淆。 - phils
哦,你绝对应该通过优秀的内置教程来进行工作:C-h t。在那之后,你可能会发现在这里搜索包含该术语的问题和答案会很有帮助:http://stackoverflow.com/search?q=[emacs]+tutorial - phils
1
@phils:也许这有点儿傲慢。你知道有没有一份好的emacs脚本教程而不是emacs使用教程?我有大约10年的vim_script行为想要移植到emacs上,但到目前为止,我甚至无法掌握最基本的操作。我认为(但不确定)我真正想要的是一个关于emacs执行模型的高级概述。 - user1311390
我不确定我理解你的意思,但是Emacs中还有全面的手册,包括Emacs Lisp Intro和完整的Elisp参考,以及使用编辑器和功能的手册。您可以键入“C-h i”进入信息阅读器;请仔细注意主要内容页面顶部列出的键绑定,并记住“d”始终会将您带回那里。 - phils
http://www.emacswiki.org/emacs/LearningEmacs 对你来说可能会很有帮助。 - phils
2个回答

2

这不完全是您想要的,但应该是进一步调整的良好起点:

(defun slime-run-test ()
  (interactive)
  (slime-interactive-eval "(test/run)")
  (slime-pop-to-buffer (slime-output-buffer) t))

(global-set-key (kbd "<f3>") 'slime-run-test)

我们到了;我知道一定有更好的方法 :) - phils

1

我不使用Slime,但是假设它使用comint-mode,那么我认为以下内容可能会起作用:

(defun my-slime-test-run ()
  (interactive)
  (delete-other-windows)
  (split-window-below)
  (with-selected-window (next-window)
    (switch-to-buffer "slime-repl")
    (goto-char (point-max))
    (insert "(test-run)")
    (comint-send-input)))

(global-set-key (kbd "<f3>") 'my-slime-test-run)

可能有更好的方法来完成这个任务,但希望这能让你了解如何编写elisp函数来执行编辑器中的任务(请注意函数的读取方式非常类似于一组编辑器指令--您可以通过将要使用的按键转换为等效代码--甚至不编写代码,只需记录和保存键盘宏,就可以做很多事情)。

使用C-hf函数名称RET获取该函数/宏调用的文档。

对于绑定键,我使用C-hkF3检查Emacs如何引用该键,然后将该字符串用作kbd的参数(请注意,您可以使用该序列找到绑定到任何给定键序列的函数名称,如果需要,可以在代码中使用它)。

许多事情如果您不知道它们,那么它们就不会那么明显,但是考虑到这个代码库非常庞大(并且存在时间非常长),这是可以预料的。

不可否认,Emacs 的自我文档化特性是其最好的优点之一。如果您不知道自己正在寻找什么,可以使用 C-uC-ha 搜索与函数名称匹配的模式(同样适用于变量、值、库和文档;有关此功能的更多信息,请参见 M-: (info "(emacs) Apropos") RET)。此外,info 手册(包括索引 - 在任何特定手册中按下 Ii,或使用 info-apropos 命令一次搜索所有 info 手册)也是非常有帮助的。

这实际上很有帮助,因为它展示了设计背后的“直觉”。谢谢! - user1311390

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接