Để Emacs di chuyển con trỏ ra khỏi màn hình


23

Câu hỏi này ban đầu được hỏi tại /programming/15895313/let-emacs-move-the-cthon-off-screen , nhưng tất cả các câu trả lời tôi nhận được ít nhiều đều nói "không thể thực hiện được" , mà với emacs tôi không chấp nhận.

Có thể để Emacs di chuyển con trỏ ra khỏi màn hình, giống như hầu hết các trình soạn thảo văn bản GUI hoạt động không? Đây là một trong những điều lớn nhất làm phiền tôi khi tôi sử dụng Emacs trên bất kỳ trình soạn thảo GUI nào. Khi tôi cuộn xuống, con trỏ được "đẩy về phía trước" bởi đỉnh của bộ đệm.

Trước đây tôi đã nghĩ rằng điều này là hoàn toàn không thể, bởi vì điều này được kết nối chặt chẽ vào kiến ​​trúc của Emacs, nhưng sau đó tôi thấy nhiều con trỏ, điều này thực hiện chính xác cho các con trỏ thứ cấp (giả sử bạn ngăn các chức năng cuộn hoạt động trên thứ cấp con trỏ). Có thể sử dụng nhiều con trỏ để có con trỏ chính trong một số bộ đệm ẩn và con trỏ hiệu quả là những gì tôi thực sự chỉnh sửa? Hoặc có thể một số mẹo thông minh khác? Hoặc có thể Googling của tôi đã làm tôi thất bại và điều này thực sự đã có thể xảy ra nếu không có phép thuật nào?

Tôi sử dụng các thiết bị đầu cuối, vì vậy nó sẽ hoạt động ở đó.


Hãy ghi nhớ tất cả các gói đa con trỏ đang làm là thêm các con trỏ giả không chịu sự hạn chế của gói thật. Tôi hy vọng sẽ có một câu trả lời dựa trên những gợi ý của câu hỏi trước đó của bạn.
wasamasa

Tôi cho rằng vấn đề này là cụ thể để sử dụng các thanh cuộn, đúng không?
nispio

1
Vì vậy, những lệnh cuộn nào bạn đang sử dụng mà bạn mong đợi sẽ không mang theo con trỏ bên mình? Theo kinh nghiệm của tôi, con trỏ theo bạn trong tất cả các trình soạn thảo khi sử dụng PGUp / PGDn hoặc các phím mũi tên.
nispio

4
@nispio có thể cuộn bằng bánh xe chuột?
ffevotte

2
Trang lên và Trang xuống (Cv và Mv) không di chuyển con trỏ trong emacs trừ khi con trỏ di chuyển khỏi màn hình. Cuộn khác với di chuyển (con trỏ).
asmeker

Câu trả lời:


11

Có một gói mới có sẵn trên GNU ELPA được gọi là scroll-restorecố gắng khắc phục vấn đề này. Có một số hành vi khác nhau để lựa chọn, nhưng cách tôi tự cấu hình nó (xem bên dưới) khiến con trỏ biến thành vô hình trong khi cuộn các lệnh, sau đó nhảy trở lại vị trí ban đầu khi tôi bắt đầu nhập lại.

Cho đến nay, tôi đã gặp một vài lỗi, nhưng gói này dường như hoạt động như - được quảng cáo cho hầu hết các phần. Bạn có thể kiểm tra nó bằng cách cài đặt nó với

M-x package-install RET scroll-restore RET

Sau khi gói được cài đặt, bạn có thể kích hoạt chế độ nhỏ với

M-x scroll-restore-mode

Cá nhân, tôi đang ràng buộc nó với Scroll Lockchìa khóa bởi vì nó dường như vô cùng apropos! Đây là những gì tôi đang thêm vào tập tin init của mình:

(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
Nếu bạn đã ràng buộc một khóa với nó, tôi cho rằng đôi khi bạn muốn vô hiệu hóa nó. Là chế độ này gây phiền nhiễu cho chỉnh sửa bình thường?
T. Verron

1
@ T.Verron Hiện tại có vẻ khá lỗi và một trong những chế độ thất bại của nó là "nhốt" con trỏ của bạn trong một khu vực và không để nó rời đi. Cách duy nhất tôi tìm thấy để giải phóng con trỏ của mình một lần nữa là tắt chế độ. Khi tất cả các lỗi đã được khắc phục, tôi sẽ không bao giờ sử dụng nó.
nispio

2
Công việc này dự định làm như thế nào nhỉ? Tôi dường như không thể làm cho nó để làm bất cứ điều gì.
asmeker

5

Phương pháp mà tôi luôn sử dụng là đặt dấu nơi tôi muốn quay lại và sau đó khi tôi hoàn thành việc lướt qua bộ đệm, tôi bật dấu bằng cách sử dụng C-u C-SPC. Ngay cả khi tôi quên thiết lập nhãn hiệu trước khi đi lang thang, tôi thấy rằng việc bật nhãn hiệu thường đưa tôi đến gần nơi tôi đến. Điều này một phần là do một số lệnh ( isearchví dụ như) đặt dấu mà không cần bạn nhận ra. Vì vậy, trong suốt quá trình chỉnh sửa của bạn, bạn đã vô tình để lại một vệt bánh mì nhỏ.

Từ tài liệu:

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').

Tôi hầu như không bao giờ bận tâm với việc thiết lập dấu trang hoặc đăng ký, nhưng tôi hầu như luôn có thể tìm đường trở về nơi tôi đến nhanh chóng bằng cách sử dụng C-u C-SPChoặc pop-global-mark.


Thành thật mà nói, tôi nghĩ lý do chính khiến mọi người muốn con trỏ có thể di chuyển ra khỏi màn hình là vì chúng được sử dụng cho các biên tập viên không có lịch sử thích hợp về vị trí con trỏ. Bạn cũng có thể làm cho nó sao cho scroll-upscroll-downtự động đặt dấu, để C-u C-SPCchắc chắn sẽ đưa bạn trở lại nơi bạn đến.
Radon Rosborough

0

Đoạn mã sau đủ tốt để tôi quay lại sau khi cuộn bánh xe chuột:

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