有没有办法将点移动到缓冲区中的第一个当前可见字符?我想找到这一点,因为对于一个函数,从“第一个可见字符”而不是“缓冲区的开头”查看确实会更快。
编辑:实际上,获取位置的值也可以,而不是将点实际移动到那里。PageUp 和 PageDown 似乎对大段文本有一些奇怪的行为。
如果您想要当前窗口滚动到的点:
(window-start)
如果要跳过被文本属性隐藏的文本,请使用invisible-p
跳过它们:
(let ((pos (window-start)))
(while (and (invisible-p pos) (< pos (point-max)))
(setq pos (1+ pos)))
pos)
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))
)
更新:处理空缓冲区。
(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))))))
这是一个高效的版本,可能更适合大块的不可见文本。这里的技巧是利用不可见文本由文本属性控制的事实,并且 emacs 具有用于确定文本属性更改位置的内置工具:
(defun goto-first-visible ()
(interactive)
(goto-char (point-min))
(while (and (not (eobp)) (invisible-p (point)))
(goto-char (next-char-property-change (point)))))