Emacs 对插入不需要的文本进行娱乐



我希望能够跳转到一个窗口,显示与字符串匹配但不等于排除字符串的缓冲区。跳转位工作正常,但这defun在其跳转到的缓冲区中插入nil(或defun具有的任何返回值(。我怎样才能避免这种情况?

(defun myMoveToWindowNamed (name &optional exclude)
"move to window with name that matches but is not exclude"
(let ((wl (window-list)))
(dolist (w wl)
(let ((wn (buffer-name (window-buffer w))))
(message "checking %s" wn)
(cond  ((and exclude (string-match exclude wn)) (message "exclude"))
((string-match name wn)
(select-window w)
(return))
(t (message "skip")))))))

我怀疑你所做的是通过在*scratch*缓冲区中键入C-j来评估对(myMoveToWindowNamed "NAME")的调用。

这将运行命令eval-print-last-sexp,并且由于所选缓冲区正在更改,因此该命令的插入最终会进入新缓冲区。

我认为您从评论中(with-temp-buffer (select-window w))解决方法与其说是"矫枉过正",不如说是一种不太明显的副作用。 在该命令循环迭代结束时选择的缓冲区是所选窗口的缓冲区;但在此之前,eval-print-last-sexp打印阶段的当前缓冲区已还原到原始选定窗口的缓冲区(您将在其中观察到已插入返回值(。

简而言之,如果以正常方式调用函数,则不会出现问题。请记住,lisp-interaction-mode中的C-j总是插入返回值。 您可以交互式地使用C-x C-e来避免这种情况。

最新更新