มีวิธีการควบคุมหน้าต่าง Emacs ที่เปิดบัฟเฟอร์ใหม่หรือไม่?


12

ฉันใช้ sr-speedbar กับ emacs และฉันมักจะแบ่งเฟรมออกเป็น 2-3 หน้าต่างที่แตกต่างกันและเมื่อใดก็ตามที่ฉันคลิกไฟล์ใน sr-speedbar มันจะเปิดบัฟเฟอร์ใหม่ในหน้าต่างต่ำสุดเสมอ ฉันพยายามเก็บหน้าต่างล่างขวาสุดไว้เป็นคำที่ค่อนข้างเล็กและ emac พยายามยืนกรานเปิดบัฟเฟอร์ใหม่ในหน้าต่างคำศัพท์เล็ก ๆ มากกว่าในพื้นที่ขนาดใหญ่กว่าที่ฉันต้องการใช้สำหรับแก้ไขบัฟเฟอร์

มีวิธีที่ฉันสามารถกำหนดค่าตรรกะการสร้างบัฟเฟอร์ที่ต้องการหน้าต่างที่สูงขึ้นกว่าหน้าต่างด้านล่าง?

ฉันได้ลองใช้หน้าต่างที่ต่ำที่สุดของฉันแล้วทำเครื่องหมายว่าได้รับการป้องกันและนั่นทำให้ emacs แบ่งออกเป็นสองส่วนเล็ก ๆ อย่างไม่มีเหตุผล จากนั้นฉันพยายามเปิดใช้งานขนาดหน้าต่างคงที่และแทนที่จะทำให้ emacs เปิดบัฟเฟอร์ด้านบนหน้าต่างนั้นฉันเพิ่งพบข้อผิดพลาดว่าหน้าต่างเล็กเกินไปที่จะแยก ดีฉันคิดว่ามันหยุดการอุดตันหน้าต่างต่ำสุดของฉัน แต่ก็โง่ที่มันหยุดฉันจากการเปิดบัฟเฟอร์ใหม่แทน

โดยหลักการแล้วฉันต้องการจะบังคับให้ emacs เลือกหน้าต่างด้านบนขวาสุดสำหรับการแสดงบัฟเฟอร์ที่สร้างขึ้นใหม่ไม่ได้พยายามแยกหน้าต่างล่างขวาสุด


เป็นคำถามที่ดีฉันหวังว่าบางคนจะได้คำตอบ
cpoile

@cpoile ฉันทำ! ดูคำตอบของฉัน
Aaron Miller

คำตอบ:


8

ฉันถือว่าคุณใช้ Emacs 24 ฉันยังไม่ได้ทดสอบคำตอบนี้ในรุ่นก่อนหน้าใด ๆ และไม่ทราบว่าเมื่อมีการเพิ่มแนวคิดของหน้าต่างเฉพาะลงใน Emacs ฉันเคยเห็นการใช้งานของวันที่ใดจากปี 2011 ดังนั้นฉันคิดว่า Emacs 23 (อย่างน้อย) ก็มีความสามารถเช่นกัน

คุณสามารถป้องกัน Emacs จากการเปิดกันชนใหม่ในหน้าต่างที่กำหนดโดยทุ่มเทหน้าต่างเพื่อกันชน

M-: (set-window-dedicated-p (selected-window) t)ในกรณีที่ง่ายที่คุณสามารถทำได้โดยการเลือกหน้าต่างที่คุณต้องการที่จะอุทิศเพื่อให้มั่นใจว่ามันกำลังแสดงบัฟเฟอร์ที่คุณต้องการที่จะอุทิศมันแล้วทำ สิ่งนี้จะป้องกัน Emacs ที่พิจารณาหน้าต่างที่แก้ไขดังนั้นเมื่อตัดสินใจว่าจะแสดงบัฟเฟอร์ในหน้าต่างใด nilในการลบความทุ่มเทในการประเมินการแสดงออกเดียวกันเปลี่ยนอาร์กิวเมนต์ที่สองด้วย

คุณสามารถป้องกัน Emacs จากความพยายามที่จะแยกหน้าต่างซึ่งแสดงการตั้งค่าบัฟเฟอร์ที่กำหนดตัวแปรบัฟเฟอร์หน้าต่างขนาดคงที่เป็นค่าที่ไม่ใช่ศูนย์

M-: (setq window-size-fixed t)ในกรณีที่ง่ายที่คุณสามารถทำได้โดยการเลือกหน้าต่างและทำ ในการแก้ไขเฉพาะความสูงหรือความกว้างของหน้าต่างที่แสดงบัฟเฟอร์ให้ประเมินนิพจน์เดียวกันส่งผ่าน'heightหรือ'widthเป็นอาร์กิวเมนต์ที่สอง เพื่อลบข้อ จำกัด nilเปลี่ยนอาร์กิวเมนต์ที่สองด้วย

ในกรณีทั่วไปฉันพบว่าปัญหาของคุณน่าสนใจพอที่จะแฮ็คโซลูชันซึ่งคุณสามารถวางลงในพา ธ โหลด(require)และใช้:

;;; 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

display-buffer-alistมีการเพิ่มตัวเลือกการเผยแพร่ Emacs ล่าสุด มันให้การควบคุมอย่างละเอียดผ่านจอแสดงผลบัฟเฟอร์หน้าต่างที่ใช้ ฯลฯ อย่างไรก็ตามเนื่องจากมันช่วยให้คุณทำหลายสิ่งหลายอย่างมันค่อนข้างซับซ้อนและยากที่จะอธิบาย ศึกษาเอกสาร: C-h v display-buffer-alist.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.