我希望能够跳转到一个窗口,显示与字符串匹配但不等于排除字符串的缓冲区。跳转位工作正常,但这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来避免这种情况。