同じバッファー (または同様のバッファー) に対して複数のウィンドウが開いている場合があり、ウィンドウ内のバッファーが別のバッファーと同じであるかどうかを区別してから、ウィンドウを強制終了するか、ウィンドウを削除するかを決定する必要があります。
バッファーが既に別のウィンドウに存在する場合にのみ、ウィンドウを単純に削除する emacs の方法はありますか? 理想的には、ウィンドウ内のバッファーの唯一のインスタンスである場合、同じ関数でバッファーとウィンドウも強制終了したいと考えています。
(defun delete-extra-windows ()
(interactive)
(let* ((selwin (selected-window))
(buf (window-buffer selwin)))
(walk-windows (lambda (ww)
(unless (eq ww selwin)
(when (eq (window-buffer ww) buf)
(delete-window ww))))
'NO-MINI 'THIS-FRAME)))
あなたが望んでいたものの仕様は明確ではありません。「バッファが別のウィンドウに既に存在する場合にのみ、ウィンドウを削除する」と言っていました。つまり、バッファーが別のウィンドウに存在しない場合は、ウィンドウを削除しないでください。それでも、「ウィンドウ内のバッファーの唯一のインスタンスである場合、バッファーとウィンドウを強制終了する」とも言いましたが、これは最初の要件と矛盾しています。
「...の場合にのみウィンドウを削除する」とは、「...の場合にのみウィンドウのみを削除する(バッファも削除しない)」という意味だと思います。
(defun delete-window-maybe-kill-buffer ()
"Delete selected window.
If no other window shows its buffer, kill the buffer too."
(interactive)
(let* ((selwin (selected-window))
(buf (window-buffer selwin)))
(delete-window selwin)
(unless (get-buffer-window buf 'visible) (kill-buffer buf))))
同様の問題を解決するために、15年前に追加しましたquit-window
(通常qは非自己挿入-AKA-バッファにバインドされています)。special
それまたはその兄弟を試すことができますquit-windows-on
。
これは私が探していた動作です。基本的な機能レイアウトとロジックを手伝ってくれてありがとう。Elisp を扱うのはまだ非常にわかりにくいので、大まかな問題を解決するための助けに感謝します。
動作を説明するコードの一部を参照してください。また、ソースから直接理解できる必要があります。
私が使用したコードの大部分を含む以前の回答に賛成票を投じました。
;;; Delete the selected window without killing the buffer if the buffer is open
;;; in another; otherwise close the window and its buffer. If called on the
;;; last visible window then the buffer will simply be killed and replaced by
;;; the next available buffer.
(defun delete-window-maybe-kill-buffer ()
"Delete selected window.
If no other window shows its buffer, kill the buffer too."
(interactive)
(let* ((selwin (selected-window))
(buf (window-buffer selwin)))
(if (> (length (window-list)) 1)
(delete-window selwin)
(unless (get-buffer-window buf 'visible) (kill-buffer buf))
(kill-buffer buf))))