我想编写一个小函数来保存光标的当前位置,标记整个缓冲区,缩进它然后返回到前一个光标位置。我知道可能有更简单的方法来实现相同的结果,但我想了解这些原则在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
答案 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)))