ウィンドウをフレームに「ポップ」する


13

多くの場合、現在のフレームにすべてのウィンドウに十分な不動産がないと任意に決定するまで、ウィンドウは自動的に分割されます。これが発生したら、手動でウィンドウを削除し、フレームを作成して、その削除されたウィンドウに切り替えます。これを行うelisp関数を作成するにはどうすればよいですか?

私は試した:

(defun pop-window-into-frame ()
  (interactive)
  (delete-window)
  (make-frame-command)
  (switch-to-prev-buffer))

しかし、何らかの理由で、これは私が考えるはずのことをしません。

回答:


15

代わりにこれを試してください:

(defun my-turn-current-window-into-frame ()
  (interactive)
  (let ((buffer (current-buffer)))
    (unless (one-window-p)
      (delete-window))
    (display-buffer-pop-up-frame buffer nil)))

1
他の誰かが書いてくれるまで、私が欲しかったとは知らなかったもう一つのこと。涼しい。
グルーカス

いいね!簡潔にするために+1。
PythonNut

(最小限の)パフォーマンスへの影響という点で、letフォームとexceptフォームを交換すると、違いが生じますか?
マティアス

@Matthiasこの時点で反転が意味をなすかどうかわかりません。現在のバッファーをバインドしている理由は、ウィンドウを削除すると現在のバッファーの概念が変わる可能性があるためです。私がそれを見る唯一の方法は、ウィンドウが1つだけであるかどうかをチェックすることでコードをより複雑にします。そうであれば、現在のバッファーをバインドし、削除してポップし、新しいフレームに現在のバッファーを表示しない場合。明快さを失うことは、私見のわずかなパフォーマンス変更にとっては価値がありません。
-wasamasa

@wasamasa正確な情報が得られないのは残念です。(one-window-p)(let
マティアス

4
;; Inspired from `mouse-tear-off-window'.
(defun tear-off-window ()
  "Create a new frame displaying buffer of selected window.
    If window is not the only one in frame, then delete it.
    Otherwise, this command effectively clones the frame and window."
  (interactive)
  (let ((owin  (selected-window))
        (buf   (window-buffer))
        (fr    (make-frame)))
    (select-frame fr)
    (switch-to-buffer buf)
    (save-window-excursion 
      (select-window owin)
      (unless (one-window-p) (delete-window owin)))))

このコマンドは、選択したウィンドウがフレーム内に単独である場合は何もしない次のコマンドと同様に、libraryで使用できますframe-cmds.el

(defun tear-off-window-if-not-alone ()
  "Move selected window to a new frame, unless it is alone in its frame.
If it is alone, do nothing.  Otherwise, delete it and create a new
frame showing the same buffer."
  (interactive)
  (if (one-window-p 'NOMINI)
      (message "Sole window in frame")
    (tear-off-window)))

ここでは、新しいフレーム(gnome3.28)に焦点を当てていませんでした。(select-frame-set-input-focus fr)最後に追加すると動作しました。
olejorgenb

@olejorgenb:はい、新しく作成されたフレームが入力フォーカスを取得するかどうかは、ウィンドウマネージャーによって異なります。はい、追加する必要があるかもしれませんselect-frame-set-input-focus。たとえば、MS Windowsでは、フォーカスが取得されるため、必要ありません。また、コマンドの説明では、フレームがフォーカスされるとは言われていません。それが必要な場合は、これを呼び出してフレームにフォーカスする別のコマンドを作成できます。
ドリュー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.