एक फ्रेम में "पॉप" एक खिड़की


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

(न्यूनतम) प्रदर्शन प्रभाव के संदर्भ में - क्या इससे कोई फर्क पड़ेगा कि क्या लेट और जब तक फॉर्म स्वैप नहीं किए जाते हैं?
मथियास

@ मैथियास मुझे यकीन नहीं है कि क्या उलटा इस बिंदु पर समझ में आएगा, इसका कारण मैं वर्तमान बफर को बांध रहा हूं क्योंकि खिड़की को हटाने से वर्तमान बफर की धारणा बदल सकती है। जिस तरह से मैं इसके चारों ओर देखता हूं, वह यह जाँच कर कोड को और अधिक जटिल बना देगा कि क्या केवल एक ही खिड़की है, यदि हाँ, वर्तमान बफ़र को बाइंड करते हैं, उसे हटाते हैं और उसे पॉप-अप करते हैं, यदि कोई नया फ्रेम में केवल वर्तमान बफ़र प्रदर्शित नहीं करता है। स्पष्टता का नुकसान न्यूनतम मानदंड परिवर्तन IMHO के लिए इसके लायक नहीं है।
वामासा

@wasamasa सटीक मधुमक्खी पालन के लिए खेद है। मेरे मन में था (जब तक (एक-खिड़की-पी)) (चलो ...
मैथियास

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

यह कमांड, साथ ही साथ निम्नलिखित, जो कुछ भी नहीं करता है यदि चयनित विंडो अपने फ्रेम में अकेली है, तो लाइब्रेरी में उपलब्ध हैं 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

@ होलजॉर्गेनब: हाँ, क्या एक नव निर्मित फ्रेम को इनपुट फ़ोकस मिलता है, यह आपके विंडो मैनेजर पर निर्भर कर सकता है। तो हाँ, आपको जोड़ने की आवश्यकता हो सकती है select-frame-set-input-focus। उदाहरण के लिए, एमएस विंडोज में, यह फोकस प्राप्त करता है, इसलिए इसकी आवश्यकता नहीं है। साथ ही, कमांड विवरण यह नहीं कहता है कि फ्रेम केंद्रित हो गया है। अगर वह चाहता है तो एक अलग कमांड बनाई जा सकती है जो इसे कॉल करती है और फिर फ्रेम को फोकस करती है।
आकर्षित किया
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.