Làm thế nào để tránh cuộn với các tệp lớn treo trong thời gian ngắn? (giữ phím trang chẳng hạn)


9

Ngay cả khi sử dụng cài đặt mặc định ( emacs -Q) Tôi đã tìm thấy các tệp C lớn có thể chậm khi cuộn bằng Emacs.

Nếu ví dụ, tôi mở một tệp lớn và giữ Page-Down. Nó sẽ cuộn xuống 1-2 trang, sau đó treo trong một hoặc hai giây, khi phát hành tài liệu được cuộn xuống nhiều trang (20 trang hoặc hơn). *

Tôi biết Emacs có khả năng hành vi ít thất thường hơn vì nếu tôi nhanh chóng chạm vào page down, nó sẽ cố gắng theo kịp và không bị treo như trước.

Có thể có Emacs không cố gắng xử lý nhiều sự kiện cùng một lúc và thay vào đó vẽ lại giữa các sự kiện?

Hoặc bằng cách nào đó trở nên phản ứng nhanh hơn thay vì treo trong khi nó cố gắng xử lý nhiều sự kiện?


* Việc chậm thực tế trong trường hợp này là do tô sáng cú pháp, vì nếu tôi cuộn toàn bộ tài liệu một lần, sau đó tất cả các thao tác cuộn đều nhanh. Tôi đã xem xét các tùy chọn khác nhau liên quan đến khóa phông chữ và kết luận rằng mặc định khóa phông chữ là hợp lý và điều chỉnh chúng không giải quyết được vấn đề, đề cập đến điều này vì tôi đã điều tra và không nghĩ đó là một phần quan trọng của việc này câu hỏi


1
Điều đó không có vẻ bình thường. Bạn đã thực hiện bất kỳ thử nghiệm để tìm ra nguyên nhân là gì? Nó có thể liên quan đến cấu hình emacs của bạn (kiểm tra emacs -Qđể loại trừ điều đó) hoặc có thể là đĩa của bạn rất chậm. Bạn cũng có thể thử tắt tô sáng cú pháp hoặc hành vi hữu ích khác (đặt bộ đệm vào chế độ cơ bản).
db48x

1
Theo cài đặt mặc định tôi có nghĩa là emacs -Q, câu hỏi được chỉnh sửa. Chậm lại là cú pháp nổi bật. Tuy nhiên, nó trở nên tồi tệ hơn bởi các emacs cố gắng xử lý tất cả các sự kiện trước khi vẽ lại.
ideaman42

Câu trả lời:


10

Như bạn đã nhận thấy, điều này về cơ bản xảy ra khi quá trình phát lại quá chậm vì một số lý do. Chúng ta không thể làm gì nhiều trong trường hợp chung (khi nó "quá chậm") nhưng khi "chỉ hơi chậm một chút", bạn có thể thử một trong những điều đó (hoặc cả hai, tho nó có thể không làm gì hơn chỉ một trong hai):

(setq jit-lock-defer-time 0)
(setq fast-but-imprecise-scrolling t)

Lưu ý rằng cả hai đều mới trong Emacs-25.


2
Chuỗi doc cho biến fast-but-imprecise-scrollingtrạng thái " Khi không phải là số không, hãy tăng tốc các thao tác cuộn. " Có lẽ ví dụ này sẽ phản ánh giá trị không phải là số không vì nó sẽ tăng tốc cuộn.
luật

2
  1. Một điều bạn có thể làm là chuyển một đối số tiền tố số cho lệnh cuộn, thay vì chỉ nhấn và giữ phím của nó để gọi nó nhiều lần.

    Ví dụ: nếu bạn đang sử dụng <next>khóa (aka PageDown) thì lệnh mà nó gọi là scroll-up-command. Và C-h f scroll-up-commandcho bạn biết rằng một tiền tố số arg nói để cuộn nhiều dòng đó.

    Ví dụ: Giả sử bộ đệm của bạn có 50.000 dòng và con trỏ ở trên cùng của nó (trên dòng đầu tiên). Nếu bạn làm như vậy C-u 25000 <next>thì nó sẽ cuộn một nửa xuống bộ đệm (25.000 dòng).

    Vẫn sẽ có một khoảng dừng, nhưng nó sẽ có phần ngắn hơn.

  2. Một khả năng khác là di chuyển xuống bởi một số lượng lớn các điều Emacs lớn. Nếu bộ đệm của bạn phân tách các phần văn bản bằng các ký tự ^L(Control-L, form-feed) thì bạn có thể sử dụng các lệnh điều hướng trang, chẳng hạn như forward-page, được ràng buộc với C-x ]. Một lần nữa, bạn có thể truyền cho nó một đối số tiền tố số, để chuyển tiếp nhiều trang cùng một lúc. Nếu không có ^Lký tự, bạn có thể sử dụng forward-paragraph( C-<down>) hoặc forward-linelệnh chuyển động khác với tiền tố arg.

  3. Tương tự, bạn có thể sử dụng lệnh goto-line( M-g M-g) để đi đến một số dòng cụ thể. (Chọn một số lớn.) Lệnh what-linecho bạn biết số dòng hiện tại là gì (bạn cũng có thể hiển thị nó trong dòng chế độ). ( M->đưa bạn đến cuối bộ đệm, nơi M-x what-linesẽ cho bạn biết có bao nhiêu dòng hoàn toàn.)

  4. (Đã thêm sau khi nhận xét của bạn về việc lướt qua cho đến khi bạn thấy điều này hoặc điều đó.) Sử dụng tìm kiếm gia tăng để điều hướng. Tìm kiếm về phía trước một cái gì đó gần nơi bạn muốn cuộn, bằng cách sử dụng C-shoặc (cho tìm kiếm regrec) C-M-s.

    Nếu bạn sử dụng thư viện Isearch + thì bạn cũng có thể kết hợp các biến vị ngữ tùy ý vào tìm kiếm của mình một cách nhanh chóng.

    Đó là, bạn không cần tìm kiếm chỉ sử dụng khớp mẫu. Ví dụ, bạn có thể tìm kiếm (1) khớp với một mẫu chọn toàn bộ khối nhận xét hoặc một switchtuyên bố hoàn chỉnh và (2) yêu cầu rằng kết quả khớp có kích thước nhất định (số ký tự).

    Isearch + cũng cho phép bạn tìm kiếm kết quả khớp với nhiều mẫu hoặc tìm kiếm kết quả khớp với một mẫu trong một khoảng cách nhất định với ("gần") một kết quả khớp với mẫu khác (trong đó khoảng cách được đo bằng ký tự, từ, giới tính, danh sách, câu. ..)


1
Làm quen với các cách để nhảy xung quanh tài liệu, đặt trang xuống hoặc sử dụng bánh xe chuột chủ yếu là cách đọc lướt tệp (bạn có thể nhanh chóng cuộn xuống cho đến khi bạn nhấn một khối nhận xét lớn của câu lệnh chuyển đổi lớn, ví dụ: tương đương kỹ thuật số của việc lướt qua một cuốn sách :)) .
ideaman42

1

Đăng bài này vì nó là một giải pháp yếu nhưng tốt hơn là không có gì.

Thay vì thay đổi tất cả các hành vi của emacs, bạn có thể viết các chức năng buộc phải vẽ lại sau mỗi thao tác, điều này tránh bị treo và làm cho việc cuộn trở nên nhạy hơn đối với trang lên / xuống và bánh xe chuột.

(global-set-key [next]
 (lambda () (interactive)
   (condition-case nil (scroll-up)
     (end-of-buffer (goto-char (point-max))))
   (redisplay)))

(global-set-key [prior]
 (lambda () (interactive)
   (condition-case nil (scroll-down)
     (beginning-of-buffer (goto-char (point-min))))
   (redisplay)))

(global-set-key (kbd "<mouse-4>")
 (lambda () (interactive) (scroll-down mouse-wheel-scroll-amount) (redisplay)))
(global-set-key (kbd "<mouse-5>")
 (lambda () (interactive) (scroll-up mouse-wheel-scroll-amount) (redisplay)))

Lưu ý rằng điều này sẽ có xu hướng làm cho Emacs bị tụt lại phía sau khóa lặp lại của bạn, vì vậy khi bạn nhả phím, việc cuộn sẽ tiếp tục đi xa hơn bạn nghĩ :-(
Stefan

Đúng vậy, trong thực tế tôi không thấy đây là một vấn đề như vậy bởi vì tôi thường chỉ giữ trong một thời gian ngắn.
ideaman42
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.