ให้ Emacs เลื่อนเคอร์เซอร์ออกจากหน้าจอ


23

แต่เดิมมีการถามคำถามนี้ที่/programming/15895313/let-emacs-move-the-cursor-off-screenแต่คำตอบทั้งหมดที่ฉันได้รับมาไม่มากก็น้อย " ฉันไม่ยอมรับด้วย emacs

เป็นไปได้ไหมที่จะให้ Emacs เลื่อนเคอร์เซอร์ออกไปนอกหน้าจอเหมือนกับโปรแกรมแก้ไขข้อความ GUI ส่วนใหญ่ นี่คือสิ่งที่ยิ่งใหญ่ที่สุดที่ทำให้ฉันรำคาญเมื่อฉันใช้ Emacs บนตัวแก้ไข GUI ใด ๆ เมื่อฉันเลื่อนลงเคอร์เซอร์จะ "ผลักไปข้างหน้า" ที่ด้านบนของบัฟเฟอร์

ก่อนหน้านี้ฉันเคยคิดว่ามันเป็นไปไม่ได้อย่างสมบูรณ์เพราะนี่เป็นแบบสายเข้ากับสถาปัตยกรรมของ Emacs แต่จากนั้นฉันเห็นเคอร์เซอร์หลาย ๆ ตัวซึ่งทำสิ่งนี้เพื่อเคอร์เซอร์รอง (ถ้าคุณป้องกันไม่ให้ฟังก์ชันเลื่อนบนหน้าที่รอง เคอร์เซอร์) อาจเป็นไปได้ที่จะใช้หลายเคอร์เซอร์เพื่อให้มีเคอร์เซอร์หลักในบัฟเฟอร์ที่ซ่อนอยู่และเคอร์เซอร์ที่มีประสิทธิภาพเป็นสิ่งที่ฉันแก้ไขด้วยจริงหรือไม่? หรืออาจจะมีเคล็ดลับที่ฉลาดอื่น ๆ ? หรือบางที Googling ของฉันทำให้ฉันล้มเหลวและนี่ก็เป็นไปได้จริง ๆ หากปราศจากเวทมนตร์?

ฉันใช้เทอร์มินัล emacs ดังนั้นจึงควรทำงานที่นั่น


โปรดทราบว่าแพคเกจแบบหลายเคอร์เซอร์จะเพิ่มเคอร์เซอร์ปลอมซึ่งไม่ได้อยู่ภายใต้ข้อ จำกัด ของเคอร์เซอร์จริง ฉันหวังว่าจะมีคำตอบตามคำแนะนำของคำถามก่อนหน้านี้ของคุณ
wasamasa

ฉันคิดว่าปัญหานี้เป็นปัญหาเฉพาะของการใช้แถบเลื่อนใช่ไหม?
nispio

1
ดังนั้นสิ่งที่คุณใช้คำสั่งเลื่อนที่คุณคาดว่าจะไม่นำเคอร์เซอร์ไปกับคุณ? จากประสบการณ์ของฉันเคอร์เซอร์จะติดตามคุณในทุกบรรณาธิการเมื่อใช้ PgUp / PgDn หรือปุ่มลูกศร
nispio

4
@nispio อาจเลื่อนด้วยเม้าส์
ffevotte

2
เลื่อนหน้าขึ้นและเลื่อนลง (Cv และ Mv) ไม่เลื่อนเคอร์เซอร์เป็น emacs เว้นแต่ว่าเคอร์เซอร์จะเลื่อนออกจากหน้าจอ การเลื่อนจะแตกต่างจากการเลื่อน (เคอร์เซอร์)
asmeurer

คำตอบ:


11

มีแพ็คเกจใหม่ในGNU ELPA ที่เรียกscroll-restoreว่าพยายามแก้ไขปัญหานี้ มีพฤติกรรมที่แตกต่างกันให้เลือกจำนวนหนึ่ง แต่วิธีที่ฉันกำหนดค่าไว้สำหรับตัวฉันเอง (ดูด้านล่าง) ทำให้เคอร์เซอร์หันไปมองไม่เห็นในระหว่างการเลื่อนคำสั่งแล้วกระโดดกลับไปที่ตำแหน่งเดิมเมื่อฉันเริ่มพิมพ์อีกครั้ง

จนถึงตอนนี้ฉันได้พบข้อบกพร่องเล็กน้อย แต่ดูเหมือนว่าแพคเกจจะทำงานได้ตามที่โฆษณาไว้เป็นส่วนใหญ่ คุณสามารถทดสอบได้โดยติดตั้งด้วย

M-x package-install RET scroll-restore RET

หลังจากติดตั้งแพ็คเกจแล้วคุณสามารถเปิดใช้งานโหมดรองได้ด้วย

M-x scroll-restore-mode

โดยส่วนตัวแล้วฉันผูกมันไว้กับScroll Lockกุญแจเพราะมันดูน่าเหลือเชื่อมาก! นี่คือสิ่งที่ฉันเพิ่มลงในไฟล์ init ของฉัน:

(require 'scroll-restore)
(scroll-restore-mode 1)
;; Allow scroll-restore to modify the cursor face
(setq scroll-restore-handle-cursor t)
;; Make the cursor invisible while POINT is off-screen
(setq scroll-restore-cursor-type nil)
;; Jump back to the original cursor position after scrolling
(setq scroll-restore-jump-back t)
;; Toggle scroll-restore-mode with the Scroll Lock key
(global-set-key (kbd "<Scroll_Lock>") 'scroll-restore-mode)

1
หากคุณได้ผูกกุญแจไว้ฉันคิดว่าคุณต้องการปิดการใช้งานบางครั้ง โหมดนี้น่ารำคาญสำหรับการแก้ไขปกติหรือไม่
T. Verron

1
@ T.Verron ตอนนี้ดูเหมือนรถสวยและโหมดความล้มเหลวอย่างใดอย่างหนึ่งคือ "ดักจับ" เคอร์เซอร์ของคุณในพื้นที่และไม่ปล่อยให้มันออกไป วิธีเดียวที่ฉันพบว่าทำให้เคอร์เซอร์ของฉันว่างอีกครั้งคือปิดโหมด เมื่อข้อบกพร่องทั้งหมดได้ผลฉันก็ไม่รังเกียจที่จะใช้มันตลอดเวลา
nispio

2
มันควรจะทำงานอย่างไร ฉันไม่สามารถทำอะไรได้เลย
asmeurer

5

วิธีการที่ฉันมักจะใช้คือการตั้งเครื่องหมายที่ฉันต้องการที่จะกระโดดกลับไปและจากนั้นเมื่อฉันกำลังทำ perusing C-u C-SPCบัฟเฟอร์ผมปรากฏเครื่องหมายใช้ แม้ว่าฉันจะลืมตั้งเครื่องหมายก่อนที่จะเดินออกไปฉันก็พบว่าการทำเครื่องหมายนั้นมักทำให้ฉันอยู่ใกล้กับที่ฉันมา นี่เป็นเพราะความจริงที่ว่าบางคำสั่ง (เช่นisearchตัวอย่าง) ตั้งเครื่องหมายโดยที่คุณไม่รู้ตัว ดังนั้นในระหว่างการแก้ไขของคุณคุณได้ทิ้งร่องรอยเส้นทางเล็ก ๆ ไว้โดยไม่ตั้งใจ

จากเอกสาร:

set-mark-command is an interactive compiled Lisp function in `simple.el'.

It is bound to C-@, C-SPC.

(set-mark-command ARG)

....

With prefix argument (e.g., C-u C-SPC), jump to the mark, and set the mark
from position popped off the local mark ring (this does not affect the global
mark ring).  Use C-x C-@ to jump to a mark popped off the global mark ring
(see `pop-global-mark').

ผมแทบจะไม่เคยรำคาญกับการตั้งค่าบุ๊คมาร์คหรือลงทะเบียน แต่ฉันมักจะสามารถหาทางกลับของฉันที่ฉันมาจากอย่างรวดเร็วโดยใช้อย่างใดอย่างหนึ่งหรือC-u C-SPCpop-global-mark


ตรงไปตรงมาฉันคิดว่าเหตุผลหลักที่คนต้องการให้เคอร์เซอร์สามารถย้ายออกนอกจอได้เพราะพวกเขาคุ้นเคยกับบรรณาธิการที่ไม่มีประวัติตำแหน่งเคอร์เซอร์ที่เหมาะสม คุณสามารถทำเครื่องหมายนั้นscroll-upและscroll-downตั้งเครื่องหมายให้โดยอัตโนมัติเพื่อให้C-u C-SPCแน่ใจว่าจะนำคุณกลับมาที่ที่คุณมา
Radon Rosborough

0

รหัสต่อไปนี้ดีพอสำหรับฉันที่จะย้อนกลับไปหลังจากการเลื่อนล้อเม้าส์:

(advice-add 'mwheel-scroll :before (lambda (arg) (if (not (eq last-command 'mwheel-scroll)) (setq point-before-mwheel-scroll (window-point)))))
(defun jump-back () (goto-char point-before-mwheel-scroll))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.