2009-06-16 29 views
18

cấu hình cửa sổ của tôi trông như thế này:Làm thế nào để buộc Emacs không hiển thị bộ đệm trong một cửa sổ cụ thể?

  +----------+-----------+ 
     |   |   | 
     |   |   | 
     |   |   | 
     |   |   | 
     |   |   | 
     |   +-----------+ 
     |   |   | 
     +----------+-----------+ 

Và tôi sử dụng cửa sổ phía dưới bên phải cho màn hình đặc biệt (như giúp đỡ, hoàn vv), nhưng emacs khẳng định về việc sử dụng cửa sổ đó khi tôi gọi lệnh (find-file-other-window, vv .) sử dụng display-buffer và đổi kích thước cửa sổ đó. Thật khó chịu ... Có cách nào mà tôi có thể bắt emacs KHÔNG sử dụng cửa sổ đó không? Tôi đã suy nghĩ của tư vấn display-buffer, nhưng nó là một chức năng trong c. Bất kỳ suy nghĩ về điều này?

EDIT:

Dựa nhiều vào câu trả lời Trey, đây là những gì làm việc cho tôi cho đến nay:

(setq special-display-function 'my-display-buffer) 
(setq special-display-regexps '(".*")) 

(defun display-special-buffer (buf) 
    "put the special buffers in the right spot (bottom rigt)" 
    (let ((target-window (window-at (- (frame-width) 4) (- (frame-height) 4))) 
      (pop-up-windows t)) 
     (set-window-buffer target-window buf) 
     target-window)) 

(defun my-display-buffer (buf) 
    "put all buffers in a window other than the one in the bottom right" 
    (message (buffer-name buf)) 
    (if (member (buffer-name buf) special-display-buffer-names) 
     (display-special-buffer buf) 
     (progn 
     (let ((pop-up-windows t) 
       (windows (delete (window-at (- (frame-width) 4) (- (frame-height) 4)) 
         (delete (minibuffer-window) (window-list))))) 
      (message (buffer-name (window-buffer (car windows)))) 
      (set-window-buffer (car (cdr windows)) buf) 
      (car (cdr windows)))))) 

Trả lời

18

Vâng, ai đó đã hỏi những same question for completion. Và tôi đã viết một số answer dường như hoạt động khá tốt.

Có vẻ như bạn có thể sử dụng cùng một giải pháp, ngoại trừ thay vì thêm vào special-display-buffer-names, bạn có thể sử dụng biến special-display-regexps. Vì vậy, một cái gì đó dọc theo dòng:

(add-to-list 'special-display-regexps '(".*" my-display-buffers)) 

(defun my-display-buffers (buf) 
    "put all buffers in a window other than the one in the bottom right" 
    (let ((windows (delete (window-at (- (frame-width) 2) (- (frame-height) 4)) 
         (delete (minibuffer-window) (window-list)))) 
    (if (<= 2 (length windows)) 
     (progn 
      (select-window (cadr windows)) 
      (split-window-vertically))) 
    (let ((pop-up-windows t)) 
     (set-window-buffer (car windows) buf) 
     (car windows))))) 

Rõ ràng bạn sẽ phải thay đổi regexp để không phù hợp với *Help* và các bộ đệm mà bạn thực sự muốn trong cửa sổ phía dưới bên phải.

Về tư vấn display-buffer, điều đó sẽ hiệu quả. Bạn có thể tư vấn cho các hàm được viết bằng c, lời khuyên hoạt động trong mọi trường hợp bạn muốn trừ khi các hàm được gọi là từ c hoặc các macro cố định (không hoạt động b/c các macro thường được mở rộng ở mọi nơi ' tái sử dụng).

+0

Tôi đã thấy câu hỏi khác và thực sự đã sử dụng giải pháp của bạn; nhưng câu hỏi của tôi không giống nhau. Tôi yêu cầu không phải ép buộc các emacs sử dụng một cửa sổ nhưng trên các emacs KHÔNG sử dụng một cửa sổ cụ thể. – polyglot

+0

Phải, tôi không nghĩ Emacs có khả năng loại trừ cửa sổ, vì vậy bạn sẽ phải sử dụng phiên bản đã sửa đổi để loại trừ cửa sổ dưới cùng bên phải khỏi danh sách cửa sổ. Tôi nhận thấy tôi quên làm điều đó trong việc cắt/dán vội vàng của tôi, hãy cập nhật điều đó. –

+0

Khi bạn làm (cửa sổ xe hơi), nó thực sự trả về các cửa sổ hiện tại. Nhưng (xe hơi (cửa sổ cdr)) sẽ hoạt động hoàn hảo. Ngoài ra (- (khung chiều cao) 2) đôi khi tìm thấy bộ đệm mini thay vì (đôi khi nó mở rộng thành 2 dòng), vì vậy tôi sử dụng 4 thay vì 2. – polyglot

3

Có lẽ một cái gì đó như thế này có thể làm việc:

(defun display-buffer-avoiding-lr-corner (buffer &optional not-this-window) 
    (save-selected-window 
    (when (buffer-file-name buffer) 
     (select-window (window-at (- (frame-width) 1) 
           (- (frame-height) 2)))) 
    (let ((display-buffer-function nil)) 
     (display-buffer buffer not-this-window)))) 

(setq display-buffer-function 'display-buffer-avoiding-lr-corner) 
2

Tôi đã nghĩ đến việc tư vấn cho màn hình-đệm, nhưng đó là một chức năng trong c.

"display-buffer is an interactive Lisp function in `window.el'." 

Ngoài ra, bạn cũng có thể tham khảo chức năng C.

+0

Emacs của tôi nói "display-buffer là một hàm tích hợp tương tác trong' mã nguồn C '. " Phiên bản khác biệt, có thể? – polyglot

2

Có thể bạn có ý nghĩa khi đặt cửa sổ bên phải thấp hơn này theo số set-window-dedicated-p. Sau đó, cửa sổ này sẽ bị bỏ qua trong các hoạt động như find-file-other-window như bạn muốn.

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