@Gilles trả lời là cách đúng đắn để đi. Tôi sẽ giữ cái này ở đây để biết thông tin và hack.
Tôi tin rằng point
chuyển động được thực hiện bởi các hàm C
window_scroll_line_based
và window_scroll_pixel_based
(phụ thuộc vào tham số khung của bạn). Các chức năng này không được tiếp xúc với máy lisp, vì vậy bạn không thể tư vấn cho chúng. Bạn sẽ phải tư vấn các chức năng gọi chúng.
Hai trong số các hàm (lisp access) có thể làm điều này là
scroll-up
và
scroll-down
. Đây là cách tôi tìm hiểu về họ:
- Đi đến một số bộ đệm dài.
- Chọn một vùng nhỏ.
- Gọi ,
M-x (put-text-property (region-beginning) (region-end) 'point-left (lambda (&rest _) (error "Point leaving")))
. Điều này sẽ ném một lỗi khi điểm rời khỏi khu vực.
- Kích hoạt
M-x toggle-debug-on-error
.
- Hãy chắc chắn rằng điểm nằm trong khu vực này.
- Cuộn bằng bánh xe chuột cho đến khi điểm được kéo ra khỏi khu vực.
Bạn sẽ được cung cấp một bộ đệm backtrace như thế này, trong đó chỉ rõ scroll-down
chức năng.
Debugger entered--Lisp error: (error "Point leaving")
signal(error ("Point leaving"))
error("Point leaving")
(lambda (&rest _) (error "Point leaving"))(1508 1192)
scroll-down(10)
funcall(scroll-down 10)
mwheel-scroll((double-mouse-4 (#<window 50 on *Backtrace*> 1299 (578 . 545) 77086296 nil 1299 (57 . 25) nil (398 . 20) (10 . 21)) 2))
funcall-interactively(mwheel-scroll (double-mouse-4 (#<window 50 on *Backtrace*> 1299 (578 . 545) 77086296 nil 1299 (57 . 25) nil (398 . 20) (10 . 21)) 2))
call-interactively(mwheel-scroll nil nil)
command-execute(mwheel-scroll)
Tôi đã làm theo scroll-down
định nghĩa C của nó, dẫn tôi đến
window_scroll
, dẫn tôi đến hai chức năng trên.
Bạn có thể làm gì
Bạn có thể tư vấn scroll-down/up
với một around
lời khuyên (cũng như bất kỳ chức năng nào khác cũng có thể dẫn đến chuyển động điểm). Sử dụng lời khuyên này để kiểm tra xem vị trí của point
đã thay đổi và ghi lại vị trí cũ. Và sau đó làm bất cứ điều gì bạn muốn với nó.
Được cảnh báo, lời khuyên rất không đáng tin cậy khi nói đến chức năng C. Một số hàm quan trọng có địa chỉ đặc biệt trong mã được biên dịch byte, có nghĩa là lời khuyên về chúng không được gọi khi mã được biên dịch. Tôi không nghĩ rằng đó sẽ là trường hợp ở đây, nhưng tôi đoán bạn không nên.