विंडो लेआउट के बीच स्विच करना


24

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

मैं अपने लेआउट को बचाने के लिए एक प्लगइन / क्विज़ कोड चाहूंगा और सहेजे गए लेआउट के बीच स्विच करने में सक्षम हो सकता हूं।

अद्यतन करें

आप सभी को धन्यवाद।

विजेता मोड का उपयोग करने के लिए abo-abo सुझाव वास्तव में अच्छा है और मुझे यह शून्य समय में काम मिला।

वामासा ने सुझाव दिया था कि मैंने बहुत से प्लगइन्स का एक गुच्छा नहीं सुना है और रजिस्टरों का उपयोग करने की जानकारी प्रदान की है।

जॉर्डन बियोन्डो ने मुझे समझाया कि रजिस्टरों का उपयोग कैसे करें और यह सामान वास्तव में वही है जो मैं सबसे सरल तरीके से चाहता था।

आप सभी को धन्यवाद।

जवाबों:


23

ऐसा करने का तरीका रजिस्टरों के साथ है।

उदाहरण के लिए C-xrwa, वर्तमान विंडो विन्यास को बचाने के लिए पंजीकरण का उपयोग करें।

फिर आप C-x1चलाने के लिए अंतर्निहित बंधन का उपयोग कर सकते हैंdelete-other-windows

जब आप एकल फ़ाइल को देख रहे हैं, तो C-xrjaरजिस्टर में विंडो में सहेजे गए कॉन्फ़िगरेशन पर वापस जाने के लिए उपयोग करें।

संक्षेप में:

C-xrwa (रजिस्टर में कॉन्फिग सेव करें)

C-x1 (अन्य विंडो हटाएं)

C-xrja (पुन: सहेजे गए विंडो कॉन्फ़िगरेशन)


मुझे लगता है कि रजिस्टरों को कमज़ोर होना चाहिए, हालांकि, मैं अपने कॉन्फिग को प्रबंधित करने के लिए एक कस्टम विंडो कॉन्फिगर स्टैक का उपयोग करता हूं।

मेरे पास दो बाइंडिंग हैं जो स्टैक पर करंट कॉन्फिगर को पुश करते हैं, और पॉप अप और टॉप कॉन्फिगरेशन को लागू करते हैं।

तो आपके लैंडियो में, मैं अपना पुश बाइंडिंग करूँगा, फिर Cx 1, फिर अपना पॉप बाइंडिंग करूँगा।

यहाँ कोड है:

(defvar winstack-stack '()
  "A Stack holding window configurations.
Use `winstack-push' and
`winstack-pop' to modify it.")

(defun winstack-push()
  "Push the current window configuration onto `winstack-stack'."
  (interactive)
  (if (and (window-configuration-p (first winstack-stack))
         (compare-window-configurations (first winstack-stack) (current-window-configuration)))
      (message "Current config already pushed")
    (progn (push (current-window-configuration) winstack-stack)
           (message (concat "pushed " (number-to-string
                                       (length (window-list (selected-frame)))) " frame config")))))

(defun winstack-pop()
  "Pop the last window configuration off `winstack-stack' and apply it."
  (interactive)
  (if (first winstack-stack)
      (progn (set-window-configuration (pop winstack-stack))
             (message "popped"))
    (message "End of window stack")))

इसके बाद आप बाध्य कर सकते हैं winstack-pushकी तरह कुछ करने के लिए C-cC-u, और winstack-popकरने के लिए C-cC-oआसानी से आस-पास जाएं।


यह बहुत बहुत अच्छा है!
लुकास.पुकेनिस

20

मैं उपयोग करता हूं winner-mode। यहाँ मेरा सेटअप है:

(winner-mode)
(global-set-key [f7] 'winner-undo)
(global-set-key [C-f7] 'winner-redo)
(global-set-key [f9] 'delete-other-windows)
(global-set-key [C-f9] 'delete-window)

मुझे नहीं पता कि किसी लेआउट या किसी चीज़ को बुकमार्क करने का कोई तरीका है, लेकिन पिछले लेआउट में लगातार स्विच करने में सक्षम होना मेरे लिए पर्याप्त है।


वाह, बस पिछले लेआउट में वापस जाने में सक्षम होने के नाते मेरे लिए बहुत कुछ है। धन्यवाद!
lukas.pukenis

11

Emacs आपके वर्तमान विंडो कॉन्फ़िगरेशन जैसे डेटा को सहेजने और लागू करने के लिए रजिस्टर प्रदान करता है, इसके साथ C-x r wऔर किया जा सकता है C-x r j। हालाँकि यह दृष्टिकोण अस्पष्ट है क्योंकि आपको विंडो रजिस्टरों को याद रखने की आवश्यकता है।

इसमें सुधार के लिए कुछ पैकेज हैं। iregister इस मूल विशेषता को और अधिक निरीक्षण योग्य और इंटरैक्टिव बनाता है। अन्य लोगों को मैं इसे रजिस्टरों को प्रभावित किए बिना उपयोग करने के बारे में जानता हूं, जैसे कि एलस्क्रीन और एसस्क्रीन जो टैब प्रदर्शित करने के लिए हेडर बार का उपयोग करते हैं। कार्यसमूह और कार्यसमूह 2 इस समस्या के दो नए और अधिक व्यापक दृष्टिकोण हैं। मुझे व्यक्तिगत रूप से पसंद नहीं आया और इसलिए मैंने अपना लिखा कि यह बीच में कहीं है और उम्मीद से कम बग और जटिलता है।


रजिस्टरों के बारे में यह बहुत अच्छा है लेकिन मुझे इस मामले में उनका उपयोग कैसे करना चाहिए? अगर आपने मेरे लिए कोई सफलता पाई है, तो मैं आपके द्वारा सूचीबद्ध किए गए प्लगइन्स की जाँच करूंगा :)
lukas.pukenis

आप अपने वर्तमान लेआउट को एक रजिस्टर में सहेजते हैं, कुछ बदलाव करते हैं, फिर एक बार जब आप इसकी पुरानी स्थिति पर स्विच करना चाहते हैं तो रजिस्टर से लेआउट को पुनर्स्थापित करें। जिन पैकेजों को मैंने सूचीबद्ध किया है, वे हर बार जब आप लेआउट स्विच करना चाहते हैं, तो ऐसा करने के मानसिक बोझ से आपको उठाते हैं।
वामासा

क्या स्टार्टअप (मेरे .emacs फ़ाइल में) के दौरान एक निश्चित विंडो कॉन्फ़िगरेशन बनाना संभव है और फिर इसे रजिस्टर में सहेजना है? मैंने (window-configuration-to-register "1")अपने .emacs में एक कमांड के रूप में कोशिश की , लेकिन यह काम नहीं किया
शाम

इसके लिए Desktop.el का उपयोग करने का प्रयास करें, इसे पहले भौं के साथ सफलतापूर्वक जोड़ा गया है।
वामासा

2

आप वर्तमान विंडो लेआउट को एक रजिस्टर में सहेज सकते हैं और फिर इसका उपयोग करके पुनर्स्थापित कर सकते हैं jump-to-register। आदेश डिफ़ॉल्ट रूप window-configuration-to-registerसे बाध्य है C-x r w

उदाहरण के लिए, जब आपके पास आपकी खिड़कियां एक उपयोगी तरीके से व्यवस्थित होती हैं, तो आप उनका iउपयोग करके उन्हें बचाने के लिए बचा सकते हैं : C-x r w iऔर बाद में उपयोग करके लेआउट को पुनर्स्थापित करें C-x r j i


1
हा, हम तीनों ने एक ही समय में रजिस्टरों के बारे में उत्तर दिया।
ग्लूकोज

1

Zygospore उस स्थिति के लिए एक त्वरित समाधान प्रदान करता है जहां आपके पास कई विंडो खुली हैं, और उनमें से एक को अस्थायी रूप से अधिकतम करना चाहते हैं। यह के व्यवहार को संशोधित करता है C-x 1। जब आपके पास कई विंडो खुली होती हैं, तो यह डिफ़ॉल्ट की तरह व्यवहार करता है delete-other-windows, और आपके द्वारा देखे जा रहे को छोड़कर सभी विंडो को हटा देता है। जब आप इसे फिर से मारते हैं, तो यह अन्य खिड़कियों को पुनर्स्थापित करता है।

विजेता-मोड एक अधिक सामान्य समाधान प्रदान करता है, लेकिन एक फ्रेम में एकल खिड़की पर अस्थायी रूप से ज़ूम करने के लिए ज़िगस्पोर महान है। सबसे अच्छी बात यह है कि यह किसी भी नए कीबाइंडिंग का उपयोग नहीं करता है - यह C-x 1बहुत ही सहज तरीके से फिर से परिभाषित करता है, इसलिए सीखने के लिए कोई नया बाइंडिंग नहीं है।


1

यह एक दिलचस्प सवाल है। कई साल पहले मैंने सभी समाधानों की जांच की। कोने के सभी मामलों को कवर करने के लिए केवल वर्कग्रुप 2.ल काफी भारी है।

लेकिन वर्कग्रुप 2 यूआई एक आपदा है। उदाहरण के लिए, यदि आप कार्यसमूह-मोड को सक्षम करते हैं (जैसा कि इसके README ने सुझाव दिया है), पिछले लेआउट को स्वचालित रूप से emacs स्टार्टअप के दौरान लोड किया जाएगा। यह स्टार्टअप को बहुत धीमी गति से हर बार बनाता है।

मेरा समाधान बॉक्स से बाहर प्रयोग करने योग्य उपकरण के बजाय एपीआई के संग्रह के रूप में कार्यसमूह 2 का इलाज करना है। इसलिए मैं @ abo-abo से ivy-mode ( https://github.com/abo-abo/swiper ) का उपयोग करके इसकी डिफ़ॉल्ट UI इंटरैक्शन को बदल देता हूं

यहाँ छवि विवरण दर्ज करें

पूर्ण विंडो टॉगल करना आसान है, विजेता-मोड से एपीआई का उपयोग करना पर्याप्त है।

यहां पूरा कोड है (मैं केवल उपयोग करता हूं M-x toggle-full-window, M-x wg-create-workgroupऔर M-x my-wg-switch-workgroup, आपको स्विपर स्थापित करने की भी आवश्यकता है, जैसा कि मैंने ऊपर उल्लेख किया है),

(defun toggle-full-window()
  "Toggle the full view of selected window"
  (interactive)
  ;; @see http://www.gnu.org/software/emacs/manual/html_node/elisp/Splitting-Windows.html
  (if (window-parent)
      (delete-other-windows)
    (winner-undo)))

(setq wg-use-default-session-file nil)
;; don't open last workgroup automatically in `wg-open-session',
;; I only want to check available workgroups! Nothing more.
(setq wg-load-last-workgroup nil)
(setq wg-open-this-wg nil)

;(workgroups-mode 1) ; put this one at the bottom of .emacs
;; by default, the sessions are saved in "~/.emacs_workgroups"
(autoload 'wg-create-workgroup "workgroups2" nil t)

(defun my-wg-switch-workgroup ()
  (interactive)
  (let (group-names selected-group)
    (unless (featurep 'workgroups2)
      (require 'workgroups2))
    (setq group-names
          (mapcar (lambda (group)
                    ;; re-shape list for the ivy-read
                    (cons (wg-workgroup-name group) group))
                  (wg-session-workgroup-list (read (f-read-text (file-truename wg-session-file))))))
    (ivy-read "work groups" group-names
              :action (lambda (group)
                        (wg-find-session-file wg-default-session-file)
                        (wg-switch-to-workgroup group)))))

(eval-after-load 'workgroups2
  '(progn
     ;; make sure wg-create-workgroup always success
     (defadvice wg-create-workgroup (around wg-create-workgroup-hack activate)
       (unless (file-exists-p (wg-get-session-file))
         (wg-reset t)
         (wg-save-session t))

       (unless wg-current-session
         ;; code extracted from `wg-open-session'.
         ;; open session but do NOT load any workgroup.
         (let ((session (read (f-read-text (file-truename wg-session-file)))))
           (setf (wg-session-file-name session) wg-session-file)
           (wg-reset-internal (wg-unpickel-session-parameters session))))
       ad-do-it
       ;; save the session file in real time
       (wg-save-session t))

     (defadvice wg-reset (after wg-reset-hack activate)
       (wg-save-session t))

     ;; I'm fine to to override the original workgroup
     (defadvice wg-unique-workgroup-name-p (around wg-unique-workgroup-name-p-hack activate)
       (setq ad-return-value t))))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.