„Pop” okno w ramkę

13

Często moje okna są automatycznie dzielone, dopóki arbitralnie nie stwierdzę, że w bieżącej ramce nie ma wystarczającej ilości nieruchomości dla nich wszystkich. Kiedy to nastąpi, ręcznie usuwam okno, tworzę ramkę i przełączam się na to usunięte okno. Jak napisać funkcję elisp, która to robi?

Próbowałem:

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

Ale z jakiegoś powodu nie robi tego, co moim zdaniem powinno.

PythonNut
źródło

Odpowiedzi:

15

Spróbuj zamiast tego:

(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)))
wasamasa
źródło
1
Kolejna rzecz, o której nie wiedziałem, że chcę, dopóki ktoś inny tego nie napisze. Chłodny.
glucas,
Ładny! +1 za zwięzłość.
PythonNut,
Jeśli chodzi o (minimalny) wpływ na wydajność - czy miałoby to znaczenie, gdyby formularze let i chyba zostały zamienione?
Matthias
@Matthias Nie jestem pewien, czy inwersja miałaby sens w tym momencie, ponieważ wiążę bieżący bufor, ponieważ usunięcie okna może zmienić pojęcie bieżącego bufora. Jedyny sposób, w jaki go widzę, skomplikowałby kod, sprawdzając, czy jest tylko jedno okno, jeśli tak, pozwól na powiązanie bieżącego bufora, usunięcie go i usunięcie, jeśli nie, to wyświetlenie bieżącego bufora w nowej ramce. Utrata przejrzystości nie jest tego warta w przypadku niewielkiej zmiany wydajności IMHO.
wasamasa,
@wasamasa przepraszamy za niedokładność. Miałem na myśli (chyba że (one-window-p) (niech ...
Matthias,
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)))))

To polecenie, podobnie jak poniższe, które nic nie robi, jeśli wybrane okno znajduje się w ramce, jest dostępne w bibliotece 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)))
Rysował
źródło
Nie skupiało się to na nowej ramce tutaj (gnome3.28). Dodawanie (select-frame-set-input-focus fr)na końcu zadziałało.
olejorgenb
@olejorgenb: Tak, to, czy nowo utworzona ramka zostanie aktywowana, może zależeć od menedżera okien. Tak, może być konieczne dodanie select-frame-set-input-focus. Na przykład w MS Windows jest skupiony, więc nie jest to konieczne. Ponadto opis polecenia nie mówi, że ramka staje się skupiona. Jeśli jest to potrzebne, można utworzyć inne polecenie, które to wywołuje, a następnie ustawia ramkę.
Drew