2012-06-15 30 views
8

Cảm ơn bạn rất nhiều trước đã giúp đỡ.Emacs: Kết hợp chuyển tiếp và thu hồi-top-bottom

Trong Emacs, tôi thích sử dụng iseach-forward (C-s) nhưng tôi muốn nó hơn bao giờ hết nếu các từ nổi bật được đánh dấu sẽ được căn giữa ở giữa màn hình thay vì ở dưới cùng.

tôi thấy mình làm điều này liên tục:

foo

C-s C-s C-s C-s ... oh! đó là 'foo' tôi đang tìm kiếm! C-l

Có cách nào để căn giữa các kết quả tìm kiếm ở giữa màn hình không?

Cheers

Trả lời

1

Bạn có thể sử dụng để chạy defadvicerecenter-top-bottom sau isearch-forward.

5

cách tiếp cận tốt nhất có lẽ sẽ để thêm móc sau:

(add-hook 'isearch-mode-end-hook 'recenter-top-bottom) 

này sẽ thực hiện lệnh recenter-top-bottom khi hoàn thành mọi tìm kiếm gia tăng thành công.

Edit: Tôi đã điều tra một chút, và các chức năng được thực hiện trên các tìm kiếm lặp đi lặp lại cho cùng một chuỗi (ví dụ, với đầu vào liên tiếp của C-s hoặc C-r trong một cuộc tìm kiếm đang hoạt động) dường như isearch-repeat-forward và/hoặc isearch-repeat-backward. Do đó, nếu bạn muốn để quay lại trên mỗi lặp lại là tốt, bạn cần phải tư vấn cho các chức năng cho biết ngoài việc xác định các móc phía trên, như vậy:

(defadvice 
    isearch-repeat-forward 
    (after isearch-repeat-forward-recenter activate) 
    (recenter-top-bottom)) 

(defadvice 
    isearch-repeat-backward 
    (after isearch-repeat-backward-recenter activate) 
    (recenter-top-bottom)) 

(ad-activate 'isearch-repeat-forward) 
(ad-activate 'isearch-repeat-backward) 

Cá nhân, tôi tìm thấy những hành vi dẫn đến cực kỳ khó chịu và mất phương hướng , nhưng de gustibus non est disputandum. Có lẽ đặt recenter-top-bottom để sử dụng trong isearch-mode-end-hook ban đầu và sử dụng recenter một mình trong lời khuyên cho các chức năng repeat sẽ ít đáng ghét hơn.

Tự mình tư vấn isearch-forward tương đương với việc thêm móc tôi đã đề xuất ở trên và dường như không ảnh hưởng đến tìm kiếm lặp lại. Thêm móc đơn giản hơn và tôi nghĩ thành ngữ hơn, vì vậy nó có lẽ nên được ưu tiên hơn thông báo cho hàm.

3

Cảm ơn bạn Nicolas và Greg.

Đề xuất của bạn đã chỉ cho tôi đúng hướng. Đây là mã để thực hiện những gì tôi đã yêu cầu:

(defadvice 
    evil-search-forward 
    (after evil-search-forward-recenter activate) 
    (recenter)) 
(ad-activate 'evil-search-forward) 

(defadvice 
    evil-search-next 
    (after evil-search-next-recenter activate) 
    (recenter)) 
(ad-activate 'evil-search-next) 

(defadvice 
    evil-search-previous 
    (after evil-search-previous-recenter activate) 
    (recenter)) 
(ad-activate 'evil-search-previous) 

Giải thích:

Tôi không muốn để có được những điều phức tạp hơn và thêm rằng tôi sử dụng Evil (chế độ vim trong Emacs), vì vậy tôi bỏ qua điều đó trong câu hỏi của tôi.

Tôi sử dụng biện pháp để tìm kiếm, chuyển sang mục được tìm kiếm tiếp theo và chuyển sang mục được tìm kiếm trước đó.

Điều đáng nói là tôi không sử dụng chức năng (recenter-top-bottom).Hành vi này rất điên rồ vì nó tập trung vào mục được tìm kiếm đầu tiên ở giữa màn hình, căn giữa phần thứ hai lên trên và màn hình thứ ba ở phía dưới. Tôi chỉ sử dụng chức năng 'recenter' để căn giữa nó luôn ở giữa màn hình.

Đối với người dùng không Ác mã sẽ trông như thế này:

(defadvice 
    isearch-forward 
    (after isearch-forward-recenter activate) 
    (recenter)) 
(ad-activate 'isearch-forward) 

(defadvice 
    isearch-repeat-forward 
    (after isearch-repeat-forward-recenter activate) 
    (recenter)) 
(ad-activate 'isearch-repeat-forward) 

(defadvice 
    isearch-repeat-backward 
    (after isearch-repeat-backward-recenter activate) 
    (recenter)) 
(ad-activate 'isearch-repeat-backward) 

Cheers (Không thử nghiệm!)!

Các vấn đề liên quan