有没有办法将点移动到缓冲区中的第一个当前可见字符?我想找到这一点,因为对于一个函数来说,从“第一个可见字符”而不是“缓冲区开始”看起来真的会更快。
编辑:实际上,获得该位置的价值也不错,而不是实际移动那里的点。 PageUp和PageDown似乎有一些奇怪的行为,包含大量文本。
答案 0 :(得分:2)
如果您想要当前窗口滚动到的点:
(window-start)
如果您想跳过文字属性隐藏的文字,请使用invisible-p
跳过它们:
(let ((pos (window-start)))
(while (and (invisible-p pos) (< pos (point-max)))
(setq pos (1+ pos)))
pos)
答案 1 :(得分: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))
)
答案 2 :(得分: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))))))
答案 3 :(得分: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)))))