バッファ内で現在表示されている最初の文字にポイントを移動する方法はありますか?関数の場合、「バッファの先頭」ではなく「最初に表示される文字」から見る方が実際に高速であるため、この点を見つけたいと思います。
編集:実際には、ポイントを実際にそこに移動する代わりに、位置の値を取得することも問題ありません。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)))))