Emacs 在隐藏缓冲区上的 goto-char 后不移动点

问题描述

如果我评估

(with-current-buffer "xx" 
 (goto-char(point-max)))

当缓冲区 xx 被掩埋时,点在 I 之后不会移动 切换到它。 在筛选我的代码之后,这让我发疯了 错误 5 天才发现它不是一个而是一个令人发狂的 我找不到相关的文档或搜索结果

解决方法

您将点移到该缓冲区中所需的位置,但不在任何窗口中。有问题的缓冲区永远不需要显示。 with-current-buffer 让 Lisp 代码在缓冲区中做事。您将 window-pointpoint 混淆了。

试试这个,看看有什么不同,假设你的缓冲区 xx 显示在某个框架的某个可见窗口中(或者如果它在一个不可见的窗口中,则使用 t 而不是 visible ):

(with-current-buffer "xx"
  (goto-char 5000)
  (message "PT: %S,WINDOW PT: %S"
           (point)
           (window-point (get-buffer-window "xx" 'visible))))

您可以使用函数 set-window-point 来设置 window-point。请参阅 Elisp 手册,节点 Window Point

,

从阅读源文件看来,emacs 保留了每个窗口先前看到的缓冲区列表(window-prev-buffers),记录了上次查看时占优势的光标位置。 switch-to-buffer 是引发缓冲区的标准方式,当窗口重新访问先前看到的缓冲区时,在决定是否恢复此保存的光标位置时,会参考 switch-to-buffer-preserve-window-point。 通过将变量设置为 nil,缓冲区的实际点用作窗口点。 这得到了我想要的行为,尽管变量不是在缓冲区本地基础上咨询的,因此设置必须是全局的(或者是本地的缓冲区,碰巧从中切换!)这是不可取的,因为我不能说没有替代有很多地方可以让窗口和缓冲区在光标所在的位置不一致。