emacs: วิธีการกลับไปที่ตำแหน่งสุดท้ายหลังจากเลื่อน / หน้าขึ้น / ลง?


14

หลังจากออกscroll-upหรือเป็นscroll-downemacs มีวิธีที่รวดเร็วในการคืนจุดไปยังตำแหน่งก่อนหน้านี้หรือไม่ (สมมติว่าฉันจำไม่ได้ว่าเพิ่มลงในเครื่องหมายวงแหวน)

หรือไม่มีวิธีใด (โดยไม่รบกวนวงแหวนเครื่องหมาย) เพื่อปรับเปลี่ยนพฤติกรรมการเลื่อนเพื่อให้การเลื่อนขึ้นแล้วเลื่อนลง (หรือกลับกัน) จะคืนค่ากลับไปที่ตำแหน่งเดิมหรือไม่ (เช่นทำให้การเลื่อนเลื่อนจุดตรง x เส้นโดยที่ x คือความสูงของหน้าจอ)

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

ขอบคุณ

คำตอบ:


13
(setq scroll-preserve-screen-position t)

ด้วยการตั้งค่านี้หากคุณเลื่อนขึ้นและลงเคอร์เซอร์จะกลับไปที่บรรทัดเดิม มันยังคงคอลัมน์เดิมไว้ใน Emacs เวอร์ชัน 23 หรือใหม่กว่า

คุณอาจจะชอบหรือไม่ชอบก็ได้

(setq scroll-preserve-screen-position 'always)

ซึ่งจะรักษาตำแหน่งหน้าจอของเคอร์เซอร์เสมอเมื่อเลื่อนแทนที่จะรักษาตำแหน่งเคอร์เซอร์ในบัฟเฟอร์หากตำแหน่งเดิมยังคงมองเห็นได้


2
ขอบคุณจากฉันด้วย! สำหรับ (จำนวนมาก!) หลายปีที่ฉันพิมพ์ "<>" ก่อนที่จะเลื่อนไปรอบ ๆ เพียงแค่มีเป้าหมายการค้นหาที่จะกลับไป
JRobert

สำหรับฉันนี่เป็นสาเหตุscroll-up-line(ซึ่งเป็นสิ่งที่ฉันใช้กับล้อเลื่อนของฉัน) เพื่อทำให้เคอร์เซอร์เลื่อนไปข้างหน้าอักขระหนึ่งตัวเมื่อมันกระทบกับด้านบนหรือด้านล่างของหน้าจอ
asmeurer

@memeurer ฉันไม่เห็นสิ่งนี้ จะต้องมีสิ่งแปลก ๆ ในไฟล์ init ของคุณหรือมีข้อบกพร่องใน Emacs เวอร์ชันของคุณ
Gilles 'ดังนั้นหยุดความชั่วร้าย'

ใช่ฉันคิดออกหลังจากที่โพสต์นี้ ผมเปิดคำถามใหม่ที่emacs.stackexchange.com/questions/12439/...
asmeurer

(setq scroll-preserve-screen-position 'always)ผมคิดว่านี่ควรจะเป็น มิฉะนั้นC-v M-vอย่าวางจุดหลังที่คุณเริ่มต้น (ตำแหน่งจุดที่สองสามารถมองเห็นได้บนหน้าจอแรกดังนั้นจุดจะไม่ย้ายกลับ)
Wilfred Hughes

6

สิ่งที่ฉันพบว่าใช้งานได้ดีคือการใช้goto-last-change.elซึ่งทำให้คุณย้อนกลับไปยังตำแหน่งที่คุณแก้ไขครั้งล่าสุด ฉันชอบความผูกพัน:

(require 'goto-last-change) ;; download this package and install in load-path
(global-set-key (kbd "C-x C-\\") 'goto-last-change)

2
อย่างเท่าเทียมกันโดยไม่จำเป็นต้องมีแพ็คเกจเพิ่มเติม: C-_ C-f C-_(เลิกทำ, ย้าย, เลิกทำ)
Gilles 'หยุดความชั่วร้าย'

1
@Gilles True แต่เมื่อเลิกทำสแต็คของคุณเพิ่มขึ้นอีกสององค์ประกอบ :)
Trey Jackson

1

ตอบคำถามของคุณเกี่ยวกับวิธีที่ฉันหลีกเลี่ยงปัญหาที่คุณอธิบาย (ดูที่อื่นในรหัสแล้วกลับไปยังจุดที่ฉันกำลังทำงานอยู่) ...

โดยปกติฉันจะแยกหน้าจอเมื่อฉันต้องการดูที่อื่นในเวลาสั้น ๆ จากนั้นฉันสามารถกลับไปที่หน้าจอเดิมด้วยC-x oไม่แสดงด้วยC-x 1และฉันกลับมาเป็นปกติ

ฉันยังใช้ forward และ reverse i-search เพื่อค้นหาจุดที่น่าสนใจในรหัส ฉันพบว่าเป็นวิธีที่มีประสิทธิภาพพอสมควรในการนำทางรหัสเมื่อฉันรู้ว่าฉันกำลังมองหาอะไร


0

หากฉันเลื่อนเพียงไม่กี่บรรทัดจากที่ฉันอยู่ในปัจจุบันฉันสามารถใช้สิ่งนี้เพื่อเลื่อนหน้าต่างโดยไม่ต้องย้ายจุด:

(defun scroll-in-place (scroll-up)
  "Scroll window up (or down) without moving point (if possible).

SCROLL-Up is non-nil to scroll up one line, nil to scroll down."
  (interactive)
  (let ((pos (point))
        (col (current-column))
        (up-or-down (if scroll-up 1 -1)))
    (scroll-up up-or-down)
    (if (pos-visible-in-window-p pos)
        (goto-char pos)
      (if (or (eq last-command 'next-line)
              (eq last-command 'previous-line))
          (move-to-column temporary-goal-column)
        (move-to-column col)
        (setq temporary-goal-column col))
      (setq this-command 'next-line))))

;;;; ------------------------------------------------------------------------
(defun scroll-up-in-place ()
  "Scroll window up without moving point (if possible)."
  (interactive)
  (scroll-in-place t))

;;;; ------------------------------------------------------------------------
(defun scroll-down-in-place ()
  "Scroll window up without moving point (if possible)."
  (interactive)
  (scroll-in-place nil))

(global-set-key (read-kbd-macro "M-<down>") 'scroll-up-in-place)
(global-set-key (read-kbd-macro "M-<up>") 'scroll-down-in-place)

หากฉันย้ายไปยังส่วนที่แตกต่างกันโดยสิ้นเชิงของไฟล์ (หรือไปยังไฟล์อื่นโดยสิ้นเชิง) บางครั้งฉันก็ใช้breadcrumbแม้ว่าจะมีแพ็คเกจอื่น ๆ มากมายที่ทำสิ่งที่คล้ายกัน

หากฉันต้องการเห็นโค้ดสองส่วนในเวลาเดียวกันฉันจะแบ่งเฟรมในแนวนอนเป็นสองหน้าต่างแล้วละทิ้งหน้าต่างที่สองเมื่อฉันทำเสร็จแล้ว

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


หากสิ่งที่คุณต้องการทำคือดูด้านบนหรือด้านล่างของจุดปัจจุบันโดยไม่ย้ายไปที่นั่นคุณสามารถวนC-lได้
asmeurer

0

จุดคืนค่าแพ็คเกจทำสิ่งที่คุณได้อธิบายไว้อย่างชัดเจน

มันตรวจสอบไม่ว่าจะเป็นชุดของ (กำหนด) คำสั่งที่ถูกประหารชีวิต (โดยค่าเริ่มต้นคำสั่งเครื่องหมายเลื่อนหน้าขึ้น / ลง) และจากนั้นช่วยให้คุณสามารถที่จะกลับไปยังจุดก่อนหน้า (เคอร์เซอร์) ตำแหน่งงานโดยการกดปุ่มkeyboard-quitมักจะถูกผูกไว้กับหรือC-gESC

คำเตือน: ฉันเป็นผู้เขียนของแพคเกจนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.