Pencere düzenleri arasında geçiş yapma


24

Özel bir düzen yapılandırdığımda ve sadece bir dosya tam ekranına geçici olarak bakmam gerektiğinde ve bir kez bu düzeni geri istiyorum - El ile yeniden akış yapmam gerekiyor.

Düzenlerimi kaydetmek ve kaydedilen düzenler arasında geçiş yapabilmek için bir eklenti / elisp kodu istiyorum.

GÜNCELLEŞTİRME

Hepinize teşekkür ederim.

Kazanan modu kullanmak için abo-abo öneri gerçekten güzel ve sıfır zaman çalışmaya başladım.

wasamasa , hiç duymadığım bir sürü harika eklenti önerdi ve kayıtların nasıl kullanılacağına dair bilgi verdi.

Jordon Biondo , kayıtları nasıl kullanacağımı açıkladı ve bu şeyler aslında en basit şekilde istediğim şeydi.

Hepinize teşekkür ederim.

Yanıtlar:


23

Bunu yapmanın bir yolu da kayıtlıdır.

Örneğin C-xrwa, geçerli pencere yapılandırmasını kaydetmek için a'yı kullanın .

Sonra C-x1çalıştırmak için yerleşik ciltleme kullanabilirsinizdelete-other-windows

tek bir dosyaya bakmayı bitirdikten sonra, C-xrjaa.

Kısacası:

C-xrwa (config'i register'a kaydedin)

C-x1 (diğer pencereleri sil)

C-xrja (yeniden kaydedilen pencere yapılandırma)


Kayıtlı olmadıkça kayıtları buluyorum, yapılandırmalarımı yönetmek için özel bir pencere config yığını kullanıyorum.

Geçerli konfigürasyonu istifin üzerine iten iki bağlama var ve üst konfigürasyonu aç ve uygula.

Bu yüzden senaryonuzda, push ciltlememi ve sonra Cx 1'i ve ardından pop ciltlememi gerçekleştiririm.

İşte kod:

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

Daha sonra bağlayabilir winstack-pushgibi bir şey C-cC-uve winstack-pophiç C-cC-okolay etrafında atlamak için.


Bu çok çok çok güzel!
lukas.pukenis

20

Kullandığım winner-mode. İşte kurulumum:

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

Bir mizanpajı veya başka bir şeyi işaretlemenin bir yolu olup olmadığını bilmiyorum, ancak sürekli önceki mizanpaja geri dönebilmek benim için yeterli.


vay, sadece önceki düzene geçmek mümkün olmak benim için çok şey yapar. Teşekkürler!
lukas.pukenis

11

Emacs mevcut pencere yapılandırmanız gibi verileri kaydetmek ve uygulamak için kayıtlar sunar, bu C-x r wve ile yapılabilir C-x r j. Ancak, pencere kayıtlarını hatırlamanız gerektiğinden bu yaklaşım hantallaşıyor.

Bunu geliştirmek için birkaç paket var. irregister bu temel özelliği daha denetlenebilir ve etkileşimli kılar. Diğerlerinin , sekmeleri görüntülemek için başlık çubuğunu kullanan elscreen ve escreen gibi kayıtları etkilemeden kullandığını biliyorum . çalışma grupları ve çalışma grupları2 bu soruna iki daha yeni ve daha kapsamlı yaklaşımlardır. Şahsen ben de beğenmedim ve bu nedenle kendi aralarında bir yerde olan ve umarım daha az hata ve karmaşıklığa sahip olan kendime yazdım .


Bu kayıtlar hakkında harika şeyler ama bu durumda bunları nasıl kullanmalıyım? Benim için başarılı olup olmadığını görmek için listelediğiniz eklentileri inceleyeceğim :)
lukas.pukenis

Geçerli düzeninizi bir kayıt defterine kaydedersiniz, bazı değişiklikler yaparsınız, daha sonra eski durumuna geçmek istediğinizde düzeni düzenleyiciden geri yükler. Listede bulunduğum paketler sizi mizanpajları değiştirmek istediğinizde bunu yapmanın zihinsel yükünden kurtarıyor.
wasamasa

sırasında (.emacs dosyamda) belirli bir pencere yapılandırması oluşturmak ve sonra bir kayıt defterine kaydetmek mümkün mü? (window-configuration-to-register "1").Emacs'imde bir komut olarak denedim , ancak işe yaramadı
08

Bunun için desktop.el dosyasını kullanmayı deneyin, daha önce kaş ile başarıyla birleştirildi.
wasamasa

2

Geçerli pencere düzenini bir kayıt defterine kaydedebilir ve ardından geri yükleyebilirsiniz jump-to-register. Komut varsayılan window-configuration-to-registerolarak bağlanır C-x r w.

Örneğin, varsa windows yararlı bir şekilde size de kayıt kaydedebilirsiniz düzenlenmiş i: kullanarak C-x r w ive kullanmadan sonra düzeni geri C-x r j i.


1
Ha, üçümüz aynı anda kayıtları yanıtladık.
glucas

1

Zygospore , birden fazla pencerenizin açık olduğu ve bunlardan birini geçici olarak en üst düzeye çıkarmak istediğiniz durum için hızlı bir düzeltme sağlar. Davranışını değiştirir C-x 1. Birden fazla pencereniz açık olduğunda, varsayılan gibi davranır delete-other-windowsve görüntülediğiniz pencerenin dışındaki tüm pencereleri kaldırır. Tekrar bastığınızda diğer pencereleri geri yükler.

Kazanan modu daha genel bir çözüm sağlar, ancak zigospore, çerçevedeki tek bir pencereyi geçici olarak yakınlaştırmak için mükemmeldir. En iyi şey, herhangi bir yeni anahtar C-x 1bağlama kullanmamasıdır - çok sezgisel bir şekilde yeniden tanımladığı için öğrenilecek yeni bir bağ yoktur.


1

Bu ilginç bir soru. Birkaç yıl önce tüm çözümleri araştırdım. Yalnızca workgroups2.el tüm köşe kasalarını kapatacak kadar ağırdır.

Ancak çalışma grupları2 UI bir felakettir. Örneğin, çalışma grubu modunu etkinleştirirseniz (README'nin önerdiği gibi), önceki düzen emacs başlatması sırasında otomatik olarak yüklenir. Bu, başlangıçta HER zaman çok yavaş yapar.

Benim çözümüm, çalışma gruplarını2 kullanılabilir bir araç yerine kullanıma hazır bir API topluluğu olarak ele almak. Bu yüzden, varsayılan UI etkileşimini, ivy-mode ( https://github.com/abo-abo/swiper ) kullanarak @ abo-abo'dan değiştiriyorum.

görüntü tanımını buraya girin

Tam pencerede geçiş yapmak kolaydır, kazanan modundan API kullanmak yeterlidir.

İşte tam kodu (sadece kullanmaktır M-x toggle-full-window, M-x wg-create-workgroupve M-x my-wg-switch-workgroupben yukarıda da belirtildiği gibi ayrıca, Swiper yüklemek gerekmez,),

(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))))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.