2013-01-14 26 views
7

Tôi muốn làm cho một sự thay đổi đơn giản để Emacs để các next-bufferprevious-buffer lệnh (mà tôi đã buộc phải C-x <RIGHT>C-x <LEFT> sẽ bỏ qua bộ đệm *Messages*.Hãy emacs next-đệm skip * Tin nhắn * đệm

tôi đang sử dụng Emacs 24 và Emacs Starter Kit

tôi đã đọc các câu hỏi và câu trả lời liên quan sau đây, nhưng họ không được những gì tôi muốn.

Dưới đây là một số lý do tại sao họ không làm việc:

  • Tôi muốn giữ nó càng đơn giản càng tốt. Ít thay đổi cấu hình tốt hơn.
  • Tôi không muốn giết hoặc ngăn tất cả *Messages* hoàn toàn.
  • (add-to-list 'ido-ignore-buffers "^\*Messages\*" trợ giúp với C-x b (ido-switch-buffer) của mình nhưng không thay đổi cách hoạt động next-bufferprevious-buffer.
+0

Tôi nghĩ bạn nên có một cái nhìn về IDO. Nó không phải là một câu trả lời, nhưng đề nghị, bởi vì (C-x ) xN là ít thuận tiện hơn so với C-x b xN. – desudesudesu

+0

Tôi khuyên người đọc nên tham khảo http://emacs.stackexchange.com/q/17687/454 (gần đây hơn). – phils

Trả lời

6

Đơn giản nhất tôi có thể nghĩ là xác định lời khuyên cho cả hai hàm. Đây là dành cho next-buffer. Tương tự như vậy sẽ cho previous-buffer. Bạn cũng có thể định nghĩa một biến cấu hình để cho phép/vô hiệu hóa hành vi (hoặc kích hoạt/Tăt tư vấn):

(defadvice next-buffer (after avoid-messages-buffer-in-next-buffer) 
    "Advice around `next-buffer' to avoid going into the *Messages* buffer." 
    (when (string= "*Messages*" (buffer-name)) 
    (next-buffer))) 

;; activate the advice 
(ad-activate 'next-buffer) 

lẽ bạn có thể so sánh bộ đệm trong một số cách khác thay cho tên chuỗi của nó, nhưng điều đó sẽ làm việc. Mã cho bộ đệm trước gần như giống nhau. Tôi không biết hoặc là có một cách gọi hàm gốc mà không kích hoạt lời khuyên một lần bên trong lời khuyên, nhưng một lần nữa, mã sẽ hoạt động ngay cả khi tên của bộ đệm được kiểm tra sau đó (sẽ thất bại nếu bạn chỉ có một bộ đệm và đó là bộ đệm thư; một số mã có thể kiểm tra xem chỉ có một bộ đệm và không gọi lại là next-buffer).

Nếu bạn muốn sử dụng một chức năng độc lập làm điều tương tự:

(defun my-next-buffer() 
    "next-buffer, only skip *Messages*" 
    (interactive) 
    (next-buffer) 
    (when (string= "*Messages*" (buffer-name)) 
     (next-buffer))) 

(global-set-key [remap next-buffer] 'my-next-buffer) 
(global-set-key [remap previous-buffer] 'my-next-buffer) 
+5

Tôi sẽ tránh sử dụng 'defadvice' cho các chức năng mà bạn không thể kiểm soát ai sẽ gọi cho họ. Trong trường hợp này, tôi sẽ định nghĩa các hàm mới và liên kết chúng với các khóa được đề cập, theo cách đó bạn sẽ chắc chắn sẽ không có các tác dụng phụ không mong muốn. – Lindydancer

+0

Mmm ... có thể bạn đã đúng, vâng, nhưng OP đã hỏi cụ thể về việc thay đổi cách thức các chức năng này hoạt động. Ngoài ra đây là những gì 'defadvice' là cho, phải không? Dù sao, có, xác định lại các ràng buộc chính là một lựa chọn khả thi khác, tất nhiên. –

+0

Tôi rất sẵn lòng điều chỉnh keybindings của mình để trỏ đến các chức năng mới. –

4

Đây là những gì tôi đang sử dụng, dựa trên Diego câu trả lời:

(setq skippable-buffers '("*Messages*" "*scratch*" "*Help*")) 

(defun my-next-buffer() 
    "next-buffer that skips certain buffers" 
    (interactive) 
    (next-buffer) 
    (while (member (buffer-name) skippable-buffers) 
    (next-buffer))) 

(defun my-previous-buffer() 
    "previous-buffer that skips certain buffers" 
    (interactive) 
    (previous-buffer) 
    (while (member (buffer-name) skippable-buffers) 
    (previous-buffer))) 

(global-set-key [remap next-buffer] 'my-next-buffer) 
(global-set-key [remap previous-buffer] 'my-previous-buffer) 

Nó không phải là rất tốt nhưng , bởi vì nó sẽ treo nếu không có bộ đệm nào khác ngoài danh sách skippable-buffers I. Tôi sử dụng C-g để thoát khỏi vòng lặp khi xảy ra sự cố.

+0

điều này sẽ được chấp nhận câu trả lời vì nó xử lý danh sách các bộ đệm có thể bỏ qua – rkm

13

Bằng cách này bạn có thể tránh được vòng lặp vô hạn:

(defun next-code-buffer() 
    (interactive) 
    (let ((bread-crumb (buffer-name))) 
    (next-buffer) 
    (while 
     (and 
     (string-match-p "^\*" (buffer-name)) 
     (not (equal bread-crumb (buffer-name)))) 
     (next-buffer)))) 
(global-set-key [remap next-buffer] 'next-code-buffer) 

Mã này vòng qua không đóng vai chính bộ đệm ("^\*").Đối với trường hợp của bạn (chỉ tránh *Messages*) nó sẽ là:

(defun next-code-buffer() 
    (interactive) 
    (let ((bread-crumb (buffer-name))) 
    (next-buffer) 
    (while 
     (and 
     (equal "*Messages*" (buffer-name)) 
     (not (equal bread-crumb (buffer-name)))) 
     (next-buffer)))) 
(global-set-key [remap next-buffer] 'next-code-buffer) 

Bạn có thể viết previous-code-buffer chỉ thay thế mỗi next-buffer với previous-buffer.

+2

Cảm ơn bạn, bộ đệm \ * Helm ... \ * thực sự làm tôi khó chịu. – CodyChan

2

Khi câu trả lời của RubenCaro chỉ ra, các câu trả lời khác có thể nhập vòng lặp vô hạn. Tôi nghĩ rằng David James 'cách tiếp cận của một danh sách bộ đệm có thể bỏ qua là một chút đẹp hơn, mặc dù, vì vậy đây là một biến thể của điều đó.

(setq my-skippable-buffers '("*Messages*" "*scratch*" "*Help*")) 

(defun my-change-buffer (change-buffer) 
    "Call CHANGE-BUFFER until current buffer is not in `my-skippable-buffers'." 
    (let ((initial (current-buffer))) 
    (funcall change-buffer) 
    (let ((first-change (current-buffer))) 
     (catch 'loop 
     (while (member (buffer-name) my-skippable-buffers) 
      (funcall change-buffer) 
      (when (eq (current-buffer) first-change) 
      (switch-to-buffer initial) 
      (throw 'loop t))))))) 

(defun my-next-buffer() 
    "`next-buffer' that skips `my-skippable-buffers'." 
    (interactive) 
    (my-change-buffer 'next-buffer)) 

(defun my-previous-buffer() 
    "`previous-buffer' that skips `my-skippable-buffers'." 
    (interactive) 
    (my-change-buffer 'previous-buffer)) 

(global-set-key [remap next-buffer] 'my-next-buffer) 
(global-set-key [remap previous-buffer] 'my-previous-buffer) 
+0

Sao chép ở dạng được cải thiện một chút tại http://emacs.stackexchange.com/a/17694/454 - sử dụng phiên bản thay vì điều này (và nói chung bạn có thể sử dụng * câu hỏi * đó thay vì cái này, như một số câu trả lời ở đây, bao gồm câu trả lời được chấp nhận, khá thiếu sót). – phils