2

有没有办法将点移动到缓冲区中的第一个当前可见字符?我想找到这一点,因为对于一个函数,从“第一个可见字符”而不是“缓冲区的开头”查看确实会更快。

编辑:实际上,获取位置的值也可以,而不是将点实际移动到那里。PageUp 和 PageDown 似乎对大段文本有一些奇怪的行为。

4

4 回答 4

2

如果您想要当前窗口滚动到的点:

(window-start)

如果要跳过被文本属性隐藏的文本,请使用invisible-p跳过它们:

(let ((pos (window-start)))
  (while (and (invisible-p pos) (< pos (point-max)))
    (setq pos (1+ pos)))
  pos)
于 2013-01-09T22:07:51.597 回答
1

nschum 给出了通过以下方式获得位置值的答案:(window-start)

要将点移动到该值,请使用:

根据nschum的回答:

(defun goto-window-start ()
 (interactive)
 (let ((pos (window-start)))
  (while (and (invisible-p pos) (< pos (point-max) )
   (setq pos (1+ pos)))
 (goto-char pos))
)
于 2013-01-09T22:11:16.170 回答
0

更新:处理空缓冲区。

(defun goto-first-visible ()
  (interactive)
  (goto-char (point-min))
  (save-match-data 
    (let ((pos (search-forward-regexp (rx graphic) nil t))) 
      (when pos 
        (goto-char (- pos 1))))))
于 2013-01-09T21:02:50.337 回答
0

这是一个高效的版本,可能更适合大块的不可见文本。这里的技巧是利用不可见文本由文本属性控制的事实,并且 emacs 具有用于确定文本属性更改位置的内置工具:

    (defun goto-first-visible ()
      (interactive)
      (goto-char (point-min))
      (while (and (not (eobp)) (invisible-p (point)))
        (goto-char (next-char-property-change (point)))))
于 2013-01-09T22:11:23.790 回答