Làm thế nào để cuộn từng dòng trong GNU Emacs?


87

Nói một cách đơn giản, tôi đang cố gắng cuộn trong emacs như trong vim và hầu hết các trình soạn thảo khác; khi tôi ví dụ, hai dòng từ đáy / đỉnh, và tôi nhấn xuống / lên ( Ctrl- p, n, , ) nó đi chỉ có một dòng lên hoặc xuống, không một nửa màn hình.


5
Tôi tin rằng điều này sẽ không bao giờ được sửa chữa. Đó là một trở lại sự thiếu hụt trong 90 vừa qua và nó vẫn còn bị phá vỡ ở đây vào năm 2010.
Steve Kuo

12
@Steve Kuo: Thoát bashing - điều này đang hoạt động như được thiết kế , nhưng có thể được thay đổi (hoặc "cố định") với một cài đặt đơn giản.
Teddy

17
@Teddy và "thiết lập đơn giản" này là gì?
Steve Kuo

1
@Teddy yeah, nó là gì?
Scooter

@Rook: Thực ra tôi khuyên bạn nên sử dụng z.trong vim thường xuyên hơn để có được cảm giác Emacs ;-) Nó có thể hơi bất thường, nhưng nó thực sự hữu ích hơn việc cuộn từng dòng IMHO.
U. Windl

Câu trả lời:


51

Xem một số đề xuất trên EmacsWIki:

(setq scroll-bước 1
      cuộn-bảo tồn 10000)

3
Thực sự thì thấy - cả câu trả lời, của bạn và của jrockway nhưng trên Wiki cả hai đều không được khuyến khích. Thật không may, lý do cho điều đó không được giải thích rõ ràng. Đó là lý do tại sao tôi đăng câu hỏi, hy vọng ai đó tìm thấy một phương pháp hoạt động mà không có sai sót.
Rook

1
Tôi không thể hiểu tại sao điều này không được khuyến khích. Tôi đã sử dụng cấu hình tương tự và nó hoạt động khá tốt. Để đảm bảo với bạn thêm, hãy xem tài liệu này về bước cuộn (lưu ý câu cuối cùng): * Số dòng để thử cuộn một cửa sổ khi điểm di chuyển ra ngoài. Nếu điều đó không thể đưa điểm trở lại khung hình, thay vào đó, điểm sẽ được căn giữa. Nếu giá trị này bằng 0, điểm luôn được căn giữa sau khi nó di chuyển khỏi khung. Nếu bạn muốn cuộn luôn là một dòng tại một thời điểm, bạn nên đặt `` cuộn theo hướng thận trọng '' thành một giá trị lớn hơn là đặt giá trị này thành 1.
an0

Vâng, nhìn xung quanh thêm một chút, tôi không thấy nhiều hơn để sao lưu lưu ý cảnh báo đó trên wiki. Ví dụ: bước cuộn dường như khá phổ biến trong nhiều tệp .emacs thông qua tìm kiếm trên google. Có thể tác giả wiki đang đề cập đến một phiên bản cũ của emacs?
ars

Không bao giờ có bất kỳ vấn đề với scroll-conservatively. Các cảnh báo chống lại điều này hơi kỳ lạ - nếu nó gây ra sự cố, thật dễ dàng để xóa dòng khỏi init.el của bạn!
dbr

1
@ars groups.google.com/group/gnu.emacs.help/browse_thread/thread/… vì vậy, với emacs <23.1 và các tệp lớn, đôi khi nó có thể nhảy con trỏ vào giữa, đây không phải là vấn đề lớn nhất
dbr

51

Nếu bạn muốn định vị màn hình chính xác, bạn có thể sử dụng Ctrl-L.

  • Theo mặc định, nó đặt dòng hiện tại ở giữa màn hình.

  • ESC 0 Ctrl-L đặt dòng hiện tại ở trên cùng.


14
Đừng hiểu sai điều này, nhưng điều đó có liên quan gì đến việc cuộn từng dòng? (tức là câu hỏi)
Rook

9
Đưa ra một quy trình làm việc thay thế (theo ý kiến ​​của tác giả) tự nhiên hơn với công cụ trong tay là hợp lý. Nhưng bạn nên mở đầu bằng lời tuyên bố từ chối trách nhiệm về hiệu ứng đó và giải thích tại sao cách tiếp cận này "tốt hơn" nếu có thể.
dmckee --- cựu điều hành kitten

2
@dmckee - Tôi đã sử dụng vim ... uhmm, một thời gian dài. Rất tốt với nó. Tuy nhiên, vì tôi đang làm gì đó với ngọng, tôi bắt đầu buộc bản thân ít nhất phải làm quen với emacs một lần nữa, và cách di chuyển "thay thế" này là quá sức đối với tôi vào lúc này. Đọc hướng dẫn, biết nó ... nhưng, nó quá kỳ lạ, imho. Không thuộc về thiên nhiên.
Rook

1
@Idigas: Chắc chắn rồi. Đó là công bằng, và bạn không cần phải nghe lời khuyên của starblue. Nhưng tôi nghĩ rằng loại câu trả lời này thể hữu ích nếu nó được đưa ra trước và bao gồm một lời giải thích hấp dẫn.
dmckee --- ex-moderator kitten

1
Yay, điều này thực hiện công việc trong một vài lần nhấn phím. (Tôi đã tìm kiếm "cách cuộn từng dòng" trên Google chỉ vì đó có vẻ là một cách hữu ích để tìm kiếm "cách tạo mã đến nơi tôi muốn".) Cảm ơn!
Ennael

42

Tôi hơi muộn đến bữa tiệc, nhưng nếu bạn không ngại cài đặt một gói thì tính năng cuộn mượt ( github , cũng có sẵn trong MELPA ) có thể là thứ bạn đang tìm kiếm - nó chắc chắn phù hợp với tôi.

Sau khi cài đặt xong, bạn có thể bật các thông tin sau trong init.el của mình:

(require 'smooth-scrolling)
(smooth-scrolling-mode 1)
(setq smooth-scroll-margin 5)

Dòng cuối cùng là tùy chọn; nó bắt đầu cuộn gần mép màn hình hơn là ở nó, vì vậy bạn luôn có một chút ngữ cảnh xung quanh điểm. Điều chỉnh theo khẩu vị.


7
Tôi đã khóc khi đọc được điều này. Khá chắc chắn đây là câu trả lời cho câu hỏi.
Eric Brown

3
Vâng, với tư cách là một người dùng Vim đang thử Emacs, đây chính xác là những gì tôi đang tìm kiếm.
juanjux

tôi đã sử dụng cả giải pháp này và giải pháp bước cuộn, sự kết hợp này thật thú vị khi tôi di chuyển đến dòng thứ 6 từ dưới lên và nhấn xuống nó sẽ cuộn một dòng và tương tự từ trên xuống.
Emad Elsaid

Đáng buồn thay, thao tác cuộn trơn hiện nay thường xuyên bị lỗi khi bạn đang di chuyển xung quanh tệp của mình bằng cách sử dụng, ví dụ: chế độ xảy ra hoặc tìm kiếm: cả hai đều có thể đưa điểm ra ngoài màn hình và bạn phải nhấn CL để hiển thị kết quả.
Erik Knowles

27

Giải pháp của tôi không phải là thay đổi cách cuộn mặc định của Emac, mà là tạo một lệnh chuỗi khóa từ macro. Bằng cách này, bạn có một cách thuận tiện để cuộn từng dòng một khi bạn muốn. Không lý tưởng, nhưng siêu dễ dàng. Nó chỉ xảy ra rằng M- (↓) và M- (↑) có sẵn, vì vậy đó là những gì tôi đã sử dụng.

Đây là cách tôi đã làm điều đó. Đầu tiên, bạn cần ghi macro cho một dòng cuộn, lên và xuống.

Bắt đầu macro

C-x ( 

Cuộn xuống một

C-u 1 C-v

Dừng macro

C-x )

Để cuộn lên một, hãy sử dụng

C-u 1 M-v

Tiếp theo, bạn cần đặt tên cho macro.

M-x name-last-kbd-macro

Đặt tên cho nó khi được nhắc như:

down-one-line

Sau đó, chỉ cần sử dụng phần sau để liên kết chuỗi khóa với tên lệnh đó:

M-x global-set-key

Và khi được nhắc, hãy sử dụng những thứ như:

M-(down arrow)

Sau đó, nó sẽ hỏi bạn lệnh nào bạn muốn liên kết và bạn nên đặt cho nó cái tên mà bạn đã phát minh ra trước đó, ví dụ: xuống một dòng.

Đây là nơi tôi lấy thông tin này. Bạn cũng có thể tìm thấy hướng dẫn bên dưới và những nơi khác về cách thêm macro của bạn vào tệp .emacs.

Đây để giải thích định nghĩa macro

Đây để biết cách kiểm soát cuộn


22

Tôi đã sử dụng những thứ này trong .emacstệp của mình từ năm 2000.

(global-set-key (quote [M-down]) (quote View-scroll-line-forward))
(global-set-key (quote [M-up]) (quote View-scroll-line-backward)) 

Bằng cách này, tôi có thể giữ hành vi mặc định của Emacs cũng như cuộn từng dòng một, tùy thuộc vào công việc tôi đang làm.

Điều này hoạt động cho đến ít nhất GNU Emacs 22. Gần đây tôi đã nâng cấp lên Emacs 24 và phát hiện ra rằng View-scroll-line-forwardView-scroll-line-backwardkhông còn nữa. Sau một hồi tìm kiếm, tôi phát hiện ra rằng cuộn lên và cuộn xuống hoạt động. Vì vậy, nếu bạn đang sử dụng Emacs 24, bạn có thể sử dụng cái này.

(global-set-key (quote [M-down]) (quote scroll-up-line))
(global-set-key (quote [M-up]) (quote scroll-down-line)) 

Tôi hầu như đã bỏ qua Emacs 23, vì vậy nếu đó là phiên bản bạn đang sử dụng, bạn có thể thử nghiệm với cả hai phiên bản trên.

Lưu ý: scroll-up-linethực sự cuộn xuống một dòng , vì bộ đệm đang được di chuyển lên một dòng.


Cảm ơn, điều này hoạt động ... nhưng tôi gặp phải một vấn đề khác mà tôi đã hỏi ở đây: stackoverflow.com/questions/19256551/…
scorpiodawg

13

Tôi gắn lại các phím mũi tên của mình để thực hiện các thao tác cuộn.

(global-set-key [up] (lambda () (interactive) (scroll-down 1)))
(global-set-key [down] (lambda () (interactive) (scroll-up 1)))

(global-set-key [left] (lambda () (interactive) (scroll-right tab-width t)))
(global-set-key [right] (lambda () (interactive) (scroll-left tab-width t)))

2
Đây không phải là chính xác những gì tôi đang tìm kiếm. Tôi không muốn màn hình cuộn (vì nó giống như khóa cuộn đã được bật), nhưng để màn hình "di chuyển" ... ồ, ... chỉ là cách notepad thực hiện :)
Rook

12

Các mẫu làm điều này:

(global-set-key [M-up] (lambda () (interactive) (scroll-up 1)))
(global-set-key [M-down] (lambda () (interactive) (scroll-down 1)))

sau đó con trỏ meta di chuyển lên và con trỏ meta di chuyển xuống.

QED. Không chắc chắn những gì tất cả những người trên đã hút thuốc!


Hoặc, như tôi vừa đăng, bạn có thể sử dụng cuộn lên dòng và cuộn xuống dòng.
Rajesh J Advani

5

Tôi có phần sau trong tệp .emacs của mình để kích hoạt hành vi cuộn ctrl-up, ctrl-down tốt đẹp. Tôi cũng sử dụng cái này cho con lăn chuột.

(defun scroll-down-in-place (n)
  (interactive "p")
  (previous-line n)
  (scroll-down n))

(defun scroll-up-in-place (n)
  (interactive "p")
  (next-line n)
  (scroll-up n))

(global-set-key [mouse-4] 'scroll-down-in-place)
(global-set-key [mouse-5] 'scroll-up-in-place)
(global-set-key [C-up] 'scroll-down-in-place)
(global-set-key [C-down] 'scroll-up-in-place)

Tôi vừa thử điều này, nhưng đó không phải là hành vi mà tôi đang tìm kiếm. Nó cho phép bạn xuống dòng cuối cùng trên màn hình, nhưng khi bấm xuống nó vẫn "giật màn hình lên mấy dòng" ... không biết giải thích thế nào cho rõ hơn.
Rook

Tôi thích ý tưởng lập bản đồ con lăn chuột. Nhưng không phải Chế độ xem-cuộn-dòng-tiến và Xem-cuộn-dòng-lùi (hoặc cuộn-dòng-lên và-dòng-xuống-dòng mới hơn) tích hợp sẽ hoạt động, thay vì xác định các chức năng của riêng bạn?
Rajesh J Advani

2

Để cuộn "vim", hãy đưa tệp này vào tệp .emacs của bạn:

(defun next-line-and-recenter () (interactive) (next-line) (recenter))
(defun previous-line-and-recenter () (interactive) (previous-line) (recenter))
(global-set-key (kbd "C-n") 'next-line-and-recenter)
(global-set-key (kbd "C-p") 'previous-line-and-recenter)

@Matt nó làm cho tôi
jjpikoov

2

Vì nó có thể gây khó chịu khi sử dụng M-up, M-downbởi vì nó can thiệp vào chế độ tổ chức làm quá tải các lệnh này. Để tránh vấn đề này, cá nhân tôi sử dụng các lệnh kết hợp M-page-up M-page-down". Ở đây tôi xác định cuộn lên và xuống 1 dòng.

;;;scroll by `number-of-lines' without the cursor attached to the screen
(global-set-key [M-prior] (lambda () (interactive) (let ((number-of-lines 1))
                                                  (scroll-down number-of-lines)
                                                  (forward-line (- number-of-lines)))))
(global-set-key [M-next] (lambda () (interactive) (let ((number-of-lines 1))
                                                  (scroll-up number-of-lines)
                                                  (forward-line number-of-lines))))

;;;scroll by `number-of-lines' with the cursor attached to the screen
(global-set-key [S-M-prior] (lambda () (interactive) (let ((number-of-lines 1))
                                                  (scroll-down number-of-lines))))
(global-set-key [S-M-next] (lambda () (interactive) (let ((number-of-lines 1))
                                                  (scroll-up number-of-lines))))

1

M-x customize-variable scroll-conservatively

Đặt nó thành 1.

Tuy nhiên, bạn không thực sự muốn làm điều này.


5
Thực ra thì thấy - cả câu trả lời, của bạn và của ars nhưng trên Wiki cả hai đều không được khuyến khích. Thật không may, lý do cho điều đó không được giải thích rõ ràng. Đó là lý do tại sao tôi đăng câu hỏi, hy vọng ai đó tìm thấy một phương pháp hoạt động mà không có sai sót.
Rook

3
sẽ rất hữu ích nếu bạn có thể giải thích cho chúng tôi biết lý do tại sao đây không phải là một ý kiến ​​hay.
Daniel

Lý do duy nhất tôi có thể nghĩ tại sao đây không phải là một ý tưởng hay là việc cuộn trở nên chậm chạp: bạn sẽ luôn phải cuộn từng dòng một, thay vì toàn màn hình mặc định. (Tôi đoán?)
ShreevatsaR

1

Nếu bạn đang tìm kiếm một cách nhanh chóng để tạo hiệu ứng giống như cuộn, hãy nhập C-nC-ltuần tự thao tác này sẽ di chuyển con trỏ xuống rồi căn giữa.


0

Nếu bạn bắt đầu emacs trong .xsession, trong trường hợp của tôi, thiết lập bảo tồn cuộn đến 100+ sẽ không hoạt động, cũng không phải cuộn bước 1. Nhưng nếu bạn bắt đầu emacs sau X, nó hoạt động.


0

Nếu bạn không phiền khi sử dụng chuột và có con lăn, bạn có thể tùy chỉnh số lượng con lăn chuột có thể thay đổi bằng cách:

Ch v chuột-bánh xe-cuộn-số lượng (nhấp vào tùy chỉnh, thay đổi giá trị thành "Số dòng cụ thể" 1, ApplyAndSave.)

hoặc thêm vào .emacs dòng: '(mouse-wheel-scroll-amount' (1 ((shift). 1) ((meta)) ((control). text-scale)))

Có rất nhiều khả năng được liệt kê tại https://www.emacswiki.org/emacs/Scrolling

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.