我通常在我的暂存缓冲区上使用elisp代码。我发现很难使用以这种方式移动游标的elisp代码,因为我不知道如何分离用于编辑代码的缓冲区和用于测试代码的缓冲区。
例如,如果我想使用以下代码:
(backward-up-list 1)
(backward-sexp 1)
(kill-sexp 2)
来自searching with intelligent bracket counting elisp,我想一次运行一行,看看每行的作用。但代码将插入符号移动到我粘贴该代码的暂存缓冲区中,并且我已经使用该插入符来编辑或运行代码。另一个问题是这个代码应该在TeX文档上测试,我的暂存缓冲区不是TeX文档。
这一切都归结于如何将画家和绘画分开。
虽然在那个例子中,只要查看C-h f手册就足以了解正在发生的事情。但这只是因为这个示例代码很简单。
答案 0 :(得分:5)
使用edebug编译函数(C-u C-M-x
而不是C-M-x
),切换到缓冲区进行试验,通过M-:调用函数,然后单步执行(n
)在调试器中。
否则,学会用更大的块思考,并用M-:在测试缓冲区中进行测试。这就是我几乎所有事情,包括非常复杂的代码,如cperl-mode。
答案 1 :(得分:3)
除M-:
(即eval-expression)外,还请查看with-selected-window
。它在给定窗口的上下文中执行其主体。例如,假设您有两个窗口,
(with-selected-window (next-window)
(backward-up-list 1))
将在另一个窗口中执行backward-up-list
操作。
答案 2 :(得分:1)
我找到了其他一些解决方法(类似于with-selected-window)
使用带有progn的set-buffer:
(progn
(set-buffer "edithere.el")
(insert "hello")
(beginning-of-line))
缓冲区名称edithere.el必须存在。按C-M-x评估预后表格。你也可以使用let。当你想编写一个编辑缓冲区或移动光标的命令时,而不是以“(defun ......”)开头,你可以从上面开始“(progn ...”,一旦完成,就改为defun。 / p>
使用with-current-buffer :(按C-M-x评估带有当前缓冲区的形式)
(with-current-buffer "edithere.el"
(insert "hello")
(beginning-of-line))
答案 3 :(得分:0)
C-x 4 f 。输入文件名:foo.el
。将代码放在那里,然后在那里进行测试。 Lot比*scratch*
缓冲区更好(Emacs-Lisp模式,一方面),你可以更轻松地保存你的工作。