2

同じバッファー (または同様のバッファー) に対して複数のウィンドウが開いている場合があり、ウィンドウ内のバッファーが別のバッファーと同じであるかどうかを区別してから、ウィンドウを強制終了するか、ウィンドウを削除するかを決定する必要があります。

バッファーが既に別のウィンドウに存在する場合にのみ、ウィンドウを単純に削除する emacs の方法はありますか? 理想的には、ウィンドウ内のバッファーの唯一のインスタンスである場合、同じ関数でバッファーとウィンドウも強制終了したいと考えています。

4

4 に答える 4

2
(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)))
于 2013-08-20T03:27:02.680 に答える
1

あなたが望んでいたものの仕様は明確ではありません。「バッファが別のウィンドウに既に存在する場合にのみ、ウィンドウを削除する」と言っていました。つまり、バッファーが別のウィンドウに存在しない場合は、ウィンドウを削除しないでください。それでも、「ウィンドウ内のバッファーの唯一のインスタンスである場合、バッファーとウィンドウを強制終了する」とも言いましたが、これは最初の要件と矛盾しています。

「...の場合にのみウィンドウを削除する」とは、「...の場合にのみウィンドウのみを削除する(バッファも削除しない)」という意味だと思います。

(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))))
于 2013-08-23T03:24:47.570 に答える
1

同様の問題を解決するために、15年前に追加しましたquit-window(通常qは非自己挿入-AKA-バッファにバインドされています)。specialそれまたはその兄弟を試すことができますquit-windows-on

于 2013-08-20T03:13:51.907 に答える
0

これは私が探していた動作です。基本的な機能レイアウトとロジックを手伝ってくれてありがとう。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))))
于 2013-09-12T02:41:37.447 に答える