emacs: Làm thế nào để trở về vị trí cuối cùng sau khi cuộn / trang lên / xuống?


14

Sau khi phát hành scroll-uphoặc scroll-downtrong emacs, có cách nào nhanh chóng để trả điểm về vị trí trước đó không (giả sử tôi không nhớ thêm nó vào vòng đánh dấu)?

Ngoài ra, có cách nào (không can thiệp vào vòng đánh dấu) để thay đổi hành vi cuộn để cuộn lên sau đó cuộn xuống (hoặc ngược lại) trả điểm về vị trí ban đầu không? (ví dụ: thực hiện di chuyển di chuyển điểm chính xác x dòng trong đó x là chiều cao màn hình)

Tôi đang trong quá trình làm quen với emacs và đây là một trong những tình huống kích thích lời nguyền phổ biến nhất: Tôi cuộn quanh để xem một phần khác của mã mà không nhớ thêm dòng của mình vào vòng đánh dấu và sau đó rất đau khi thử để di chuyển dòng mã tôi đang làm việc. Như vậy, trong khi tôi yêu cầu một giải pháp kỹ thuật, tôi cũng muốn biết làm thế nào người dùng dày dạn tránh được vấn đề này. Bạn có quen với việc nhớ để đặt dấu, chia cửa sổ để nhìn xung quanh hoặc sử dụng một số mẫu khác không?

Cảm ơn

Câu trả lời:


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

Với cài đặt này , nếu bạn lên và xuống trang, con trỏ sẽ trở về dòng ban đầu. Nó cũng giữ lại cột ban đầu của nó trong phiên bản Emacs 23 hoặc mới hơn.

Bạn có thể hoặc không thể

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

luôn giữ vị trí màn hình của con trỏ khi cuộn, thay vì giữ nguyên vị trí con trỏ trong bộ đệm nếu vị trí ban đầu vẫn hiển thị.


2
Cảm ơn tôi quá! Trong nhiều năm, tôi đã gõ "<>" trước khi di chuyển xung quanh, chỉ cần có mục tiêu tìm kiếm để quay lại.
JRobert

Đối với tôi, nguyên nhân này scroll-up-line(đó là những gì tôi sử dụng với bánh xe cuộn của mình) để khiến con trỏ di chuyển về phía trước một ký tự khi nó chạm vào đỉnh hoặc đáy màn hình.
asmeker

@asmeker Tôi không quan sát điều này. Phải có một cái gì đó kỳ lạ trong tệp init của bạn hoặc một lỗi trong phiên bản Emacs của bạn.
Gilles 'SO- ngừng trở thành ác quỷ'

Vâng, tôi đã tìm ra điều đó sau khi tôi đăng bài này. Tôi đã mở một câu hỏi mới tại emacs.stackexchange.com/questions/12439/ .
asmeker

Tôi nghĩ rằng điều này nên được (setq scroll-preserve-screen-position 'always). C-v M-vMặt khác, không đặt điểm trở lại nơi bạn đã bắt đầu. (Vị trí điểm thứ hai có thể nhìn thấy trên màn hình đầu tiên để điểm không di chuyển trở lại.)
Wilfred Hughes

6

Những gì tôi thấy hoạt động tốt là sử dụng goto-last-change.el, điều này đưa bạn trở lại vị trí bạn thực hiện chỉnh sửa lần cuối. Tôi thích sự ràng buộc:

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

2
Tương đương, không cần gói bổ sung: C-_ C-f C-_(hoàn tác, di chuyển, hoàn tác).
Gilles 'SO- ngừng trở nên xấu xa'

1
@Gilles Đúng, nhưng sau đó ngăn xếp hoàn tác của bạn chỉ tăng thêm hai yếu tố nữa. :)
Trey Jackson

1

Trả lời câu hỏi của bạn về cách tôi tránh vấn đề bạn mô tả (tìm mã khác và sau đó quay lại điểm tôi đang làm việc) ...

Thông thường, tôi sẽ chia đôi màn hình khi tôi cần nhìn thoáng qua ở nơi khác. Sau đó, tôi có thể trở lại màn hình gốc với C-x o, không mở C-x 1và tôi trở lại bình thường.

Tôi cũng sử dụng chuyển tiếp và đảo ngược i-search để xác định vị trí quan tâm cụ thể trong mã. Tôi thấy đó là một cách khá hiệu quả để điều hướng mã khi tôi biết những gì tôi đang tìm kiếm.


0

Nếu tôi chỉ cuộn một vài dòng từ nơi tôi hiện đang ở, tôi có thể sử dụng điều này để cuộn cửa sổ mà không di chuyển điểm:

(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)

Nếu tôi chuyển sang một phần hoàn toàn khác của một tệp (hoặc hoàn toàn với một tệp khác), đôi khi tôi sử dụng breadcrumbmặc dù có rất nhiều gói khác làm những việc tương tự.

Nếu tôi cần nhìn trực quan hai khu vực mã cùng một lúc, tôi sẽ chia khung hình theo chiều ngang thành hai cửa sổ và sau đó loại bỏ cửa sổ thứ hai khi tôi hoàn thành.

Mặc dù vậy, hầu hết, tôi chỉ sử dụng hai khung, một khung là khung làm việc hiện tại của tôi và khung kia là khung tham chiếu của tôi, được sử dụng để nhảy xung quanh cùng hoặc các tệp khác.


Nếu tất cả những gì bạn muốn làm là nhìn thấy bên trên hoặc bên dưới điểm hiện tại mà không di chuyển đến đó, bạn có thể quay vòng C-l.
asmeker
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.