emacs交互式呼叫和密钥模拟

时间:2015-05-13 19:42:59

标签: emacs elisp

我想编写一个小函数来保存光标的当前位置,标记整个缓冲区,缩进它然后返回到前一个光标位置。我知道可能有更简单的方法来实现相同的结果,但我想了解这些原则在Elisp中是如何工作的。

这是我试图做的事情:

(defun indent-whole-buffer () (interactive)                                                                                                                                                                        
    (call-interactively 'point-to-register)                                                                                                                                                                    
    (call-interactively (kbd "RET"))                                                                                                                                                                                 
    (mark-whole-buffer)                                                                                                                                                                                              
    (call-interactively 'indent-region)                                                                                                                                                                              
    (call-interactively 'jump-to-register)                                                                                                                                                                           
    (call-interactively (kbd "RET"))                                                                                                                                                                                 
  )  

这里的阻塞点是(call-interactively (kbd "RET"))我如何模拟RET键,就像我在做什么

M-x point-to-register RET

2 个答案:

答案 0 :(得分:1)

只需使用save-excursion即可。这就是它的用途。它保存了点和标记以及哪个缓冲区是最新的,然后为您恢复它们。

(如果您决定推出自己的,并且您决定按照计划的方式进行,那么只需直接调用您需要的功能 - 无需使用call-interactively。使用{{1查看每个函数是如何被调用的。例如C-h f在寄存器(point-to-register ?a)中捕获point,并且a缩进整个缓冲区。)

答案 1 :(得分:0)

Emacs Lisp不仅仅是Emacs使用的宏语言 - 它是实现语言。许多Emacs函数具有比通过UI公开的功能更多的功能,并且通常可以通过使用此功能编写更紧凑和优雅的代码。

特别是,如果你的目标是缩进整个缓冲区,那么就不需要移动点和标记 - 函数indent-region能够缩进任意区域:

(defun indent-whole-buffer ()
  (interactive)
  (indent-region (point-min) (point-max)))