emacs取消插入不需要的文本

emacs取消插入不需要的文本,emacs,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

我希望能够跳转到一个窗口,显示与字符串匹配但不等于排除字符串的缓冲区。跳转位工作正常,但此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来评估对MyMoveToIndowName的调用

它运行命令eval print last sexp,由于所选缓冲区正在更改,因此该命令的插入操作将在新缓冲区中结束

我认为您在评论中使用temp buffer select window w的解决方法并不是太过分,而是一个不太明显的副作用。在该命令循环迭代结束时选择的缓冲区是所选窗口的缓冲区;但在此之前,eval print last sexp的打印阶段的当前缓冲区已恢复为原始选定窗口的缓冲区,您将在其中观察到已插入返回值


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

没有为Elisp的dolist定义函数返回。在全球范围内,return是cl-return的别名,它可能不符合您的要求。使用cl-dolist,您可以使用cl-return更改dolist并返回到cl-dolist,而cl-return并不能解决问题。函数仍然将nil插入它跳入的缓冲区。。。。。。甚至删除return语句也不会更改文本在目标缓冲区中的插入。是否确实插入nil?当我运行你的函数时,我似乎不明白。您没有使用*消息*作为您的测试缓冲区吗?谢谢。你说得对,我学到了一些新东西。伟大的