Có cách nào để kiểm soát cửa sổ Emacs mở bộ đệm mới không?


12

Tôi đang sử dụng sr-speedbar với emacs và tôi thường chia khung thành 2-3 cửa sổ khác nhau và bất cứ khi nào tôi nhấp vào tệp trong sr-speedbar, nó luôn mở bộ đệm mới trong cửa sổ thấp nhất. Tôi đang cố gắng giữ cửa sổ ngoài cùng bên phải dưới dạng một thuật ngữ tương đối nhỏ và emacs cứ khăng khăng mở bộ đệm mới trong cửa sổ nhỏ hơn là trong khu vực lớn hơn nhiều mà tôi muốn sử dụng để chỉnh sửa bộ đệm.

Có cách nào để tôi có thể định cấu hình logic tạo bộ đệm để thích các cửa sổ cao hơn các cửa sổ thấp hơn không?

Tôi đã thử lấy cửa sổ thấp nhất của mình và đánh dấu nó là được bảo vệ, và điều đó chỉ khiến các emacs chia nó thành hai phần nhỏ một cách vô lý. Sau đó, tôi đã thử bật kích thước cửa sổ cố định và thay vì làm emacs mở bộ đệm phía trên cửa sổ đó, nó chỉ cho tôi một lỗi rằng cửa sổ quá nhỏ để bị chia tách. Tốt, tôi đoán rằng nó đã ngừng đóng cửa sổ thấp nhất của tôi, nhưng thật ngu ngốc khi nó ngăn tôi mở bộ đệm mới thay thế.

Lý tưởng nhất là tôi muốn có thể buộc các emacs chọn cửa sổ phía trên bên phải để hiển thị bộ đệm mới được tạo, không cố gắng phân chia cửa sổ phía dưới bên phải.


Câu hỏi hay, tôi hy vọng ai đó sẽ đưa ra câu trả lời.
cpoile

@cpoile Tôi đã làm! Xem câu trả lời của tôi.
Aaron Miller

Câu trả lời:


8

Tôi giả sử bạn đang sử dụng Emacs 24; Tôi chưa thử câu trả lời này trong bất kỳ phiên bản nào trước đó và không biết khi nào khái niệm cửa sổ chuyên dụng được thêm vào Emacs. Tôi đã thấy đề cập đến việc sử dụng nó từ ngày 2011, vì vậy tôi cho rằng Emacs 23 (ít nhất) cũng có khả năng.

Bạn có thể ngăn Emacs mở bộ đệm mới trong một cửa sổ nhất định bằng cách dành cửa sổ cho bộ đệm của nó .

Trong trường hợp đơn giản nhất, bạn có thể thực hiện việc này bằng cách chọn cửa sổ bạn muốn dành, đảm bảo nó hiện hiển thị bộ đệm mà bạn muốn dành cho nó, sau đó thực hiện M-: (set-window-dedicated-p (selected-window) t). Điều này sẽ ngăn Emacs xem xét cửa sổ đã được sửa đổi khi quyết định cửa sổ nào hiển thị bộ đệm. Để loại bỏ sự cống hiến, hãy đánh giá biểu thức tương tự, thay thế đối số thứ hai bằng nil.

Bạn có thể ngăn Emacs cố gắng phân tách một cửa sổ hiển thị bộ đệm đã cho, cài đặt biến cửa sổ biến cục bộ-size-size thành giá trị không phải là số không.

Trong trường hợp đơn giản nhất, bạn có thể làm điều này bằng cách chọn cửa sổ và thực hiện M-: (setq window-size-fixed t). Để chỉ sửa chiều cao hoặc chiều rộng của các cửa sổ hiển thị bộ đệm, hãy đánh giá cùng biểu thức, chuyển 'heighthoặc 'widthlàm đối số thứ hai; để loại bỏ hạn chế, thay thế đối số thứ hai bằng nil.

Trong trường hợp chung, tôi thấy vấn đề của bạn đủ thú vị để hack một giải pháp mà bạn có thể thả vào đường dẫn tải của mình (require)và sử dụng:

;;; dedicate-windows-manually.el --- Manually (un)dedicate windows

;; Copyright (C) 2013 Aaron Miller
;; <me@aaron-miller.me>

;; This program is free software; you can redistribute it and/or
;; modify it under the terms of the GNU General Public License as
;; published by the Free Software Foundation; either version 2 of
;; the License, or (at your option) any later version.

;; This program is distributed in the hope that it will be
;; useful, but WITHOUT ANY WARRANTY; without even the implied
;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
;; PURPOSE.  See the GNU General Public License for more details.

;; You should have received a copy of the GNU General Public
;; License along with this program; if not, write to the Free
;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
;; MA 02111-1307 USA

;;; Commentary:

;; Introduction
;; ============

;; The functions here defined allow you to manually dedicate and
;; undedicate windows, that is, prevent `set-window-buffer' from
;; considering them when selecting a window in which to display a
;; given buffer.

;; Windows dedicated in this fashion will also be protected from
;; splitting by setting `window-size-fixed'.

;; Installation
;; ============

;; Place this file in your load path; then, place the following
;; command somewhere in your initialization file:

;; (require 'dedicate-windows-manually)

;; Now you can use M-x dedicate-window to dedicate the selected window
;; to its currently displayed buffer, M-x undedicate-window to release
;; a dedication so applied, and M-x dedicate-window-toggle to switch
;; between the states.

;; These functions will operate only on manually dedicated or
;; undedicated windows; that is, M-x dedicate-window will not dedicate
;; a window which is already dedicated (i.e. "(window-dedicated-p
;; window) -> t", and M-x undedicate-window will not undedicate a
;; window which was not dedicated by way of M-x dedicate-window.

;; If you find yourself frequently doing M-x dedicate-window-toggle,
;; you might wish to place something like this in your init file:

;; (global-set-key (kbd "C-x 4 C-d") 'dedicate-window-toggle)

;; Bugs:
;; * Changing the lighter string while you have windows dedicated is
;;   probably not a good idea.
;; * I should certainly find a better way to change the mode line.

;;; Code:

(defcustom dedicated-window-lighter-string " [D]"
  "A string, propertized with `dedicated-window-lighter-face', prepended
to the mode line of manually dedicated windows.")

(defvar dedicated-windows-by-hand nil
  "A list of windows known to have been manually dedicated. Windows not
in this list will not be undedicated by `undedicate-window'.")

(defun dedicate-window-was-by-hand-p (window)
  (let ((result nil))
    (loop for w in dedicated-windows-by-hand
          collect (if (eq w window) (setq result t)))
    result))

(defun dedicate-window (&optional window flag)
  "Dedicate a window to its buffer, and prevent it from being split.

Optional argument WINDOW, if non-nil, should specify a window. Otherwise,
or when called interactively, the currently selected window is used.

Optional argument FLAG, if non-nil, will be passed verbatim to
`set-window-dedicated-p'."
  (interactive nil)
  (if (eq nil window) (setq window (selected-window)))
  (if (eq nil flag) (setq flag t))
  (if (window-dedicated-p window)
      (message "Window is already dedicated.")
    (progn
      (add-to-list 'dedicated-windows-by-hand window)
      (setq mode-line-format
            (append `(,dedicated-window-lighter-string) mode-line-format))
      (setq window-size-fixed t)
      (set-window-dedicated-p window flag))))

(defun undedicate-window (&optional window)
  "Un-dedicate a window from its buffer.

Optional argument WINDOW, if non-nil, should specify a window listed in
`dedicated-windows-by-hand'. Otherwise, or when called interactively,
the currently selected window is used.

If WINDOW is not in `dedicated-windows-by-hand', a complaint will be
issued and nothing will be done."
  (interactive nil)
  (if (eq nil window) (setq window (selected-window)))
  (if (not (window-dedicated-p window))
      (message "Window is not dedicated.")
    (if (not (dedicate-window-was-by-hand-p window))
        (message "Window is not dedicated by hand.")
      (progn
        (setq dedicated-windows-by-hand
              (remove window dedicated-windows-by-hand))
        (setq mode-line-format
              (remove dedicated-window-lighter-string mode-line-format))
        (setq window-size-fixed nil)
        (set-window-dedicated-p window nil)))))

(defun dedicate-window-toggle (&optional window)
  "Toggle a window's manual buffer dedication state.

Optional argument WINDOW, if non-nil, should specify a window. Otherwise,
or when called interactively, the value of `selected-window' is used."
  (interactive nil)
  (if (eq nil window) (setq window (selected-window)))
  (if (window-dedicated-p window)
      (undedicate-window window)
    (dedicate-window window)))

(provide 'dedicate-windows-manually)

;;; dedicate-windows-manually.el ends here

4

Trong tùy chọn phát hành Emacs gần đây display-buffer-alistđã được thêm vào. Nó cung cấp khả năng kiểm soát chi tiết trên màn hình đệm, các cửa sổ được sử dụng, v.v. Tuy nhiên, vì nó cho phép bạn làm rất nhiều thứ nên nó cũng khá phức tạp và khó diễn tả. Tham khảo tài liệu : C-h v display-buffer-alist.

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.