Beralih di antara tata letak jendela

24

Ketika saya mengkonfigurasi tata letak khusus dan kemudian hanya perlu melihat sementara ke dalam satu file layar penuh dan sekali saya ingin tata letak itu kembali - saya perlu secara manual untuk reflow.

Saya ingin plugin / kode elisp untuk menyimpan tata letak saya dan untuk dapat beralih di antara tata letak yang disimpan.

MEMPERBARUI

Terima kasih semua.

saran abo-abo untuk menggunakan mode pemenang sangat bagus dan saya membuatnya bekerja dalam waktu nol.

wasamasa menyarankan banyak plugin hebat yang belum pernah saya dengar dan memberikan informasi cara menggunakan register.

Jordon Biondo menjelaskan kepada saya bagaimana cara menggunakan register dan hal-hal ini sebenarnya yang saya inginkan dengan cara yang paling sederhana.

Terima kasih semua.

lukas.pukenis
sumber

Jawaban:

23

Cara bawaan untuk melakukan ini adalah dengan register.

Misalnya digunakan C-xrwauntuk menyimpan konfigurasi jendela saat ini untuk mendaftar a.

Kemudian Anda dapat menggunakan penjilidan bawaan C-x1untuk dijalankandelete-other-windows

setelah Anda selesai melihat file tunggal, gunakan C-xrjauntuk membuka kembali ke konfigurasi jendela yang disimpan dalam register a.

Pendeknya:

C-xrwa (simpan config ke register)

C-x1 (hapus jendela lain)

C-xrja (mendaftar ulang konfigurasi jendela)


Saya menemukan register menjadi sulit digunakan, saya menggunakan custom config stack window untuk mengelola konfigurasi saya.

Saya memiliki dua binding yang mendorong konfigurasi saat ini ke tumpukan, dan muncul dan menerapkan konfigurasi atas.

Jadi dalam sceneario Anda, saya akan melakukan pengikatan push saya, lalu Cx 1, lalu melakukan pengikatan pop saya.

Ini kodenya:

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

Anda kemudian dapat mengikat winstack-pushsesuatu seperti C-cC-u, dan winstack-popuntuk C-cC-odengan mudah melompat-lompat.

Jordon Biondo
sumber
Ini sangat sangat sangat bagus!
lukas.pukenis
20

Saya menggunakan winner-mode. Inilah pengaturan saya:

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

Saya tidak tahu apakah ada cara untuk mem-bookmark tata letak atau sesuatu, tetapi dapat terus beralih kembali ke tata letak sebelumnya sudah cukup bagi saya.

abo-abo
sumber
wow, hanya bisa beralih kembali ke tata letak sebelumnya BANYAK bagiku. Terima kasih!
lukas.pukenis
11

Emacs menawarkan register untuk menyimpan dan menerapkan data seperti konfigurasi jendela Anda saat ini, ini dapat dilakukan dengan C-x r wdan C-x r j. Namun pendekatan ini menjadi sulit karena Anda perlu mengingat register jendela.

Ada beberapa paket untuk memperbaikinya. iregister membuat fitur dasar ini lebih dapat diperiksa dan interaktif. Yang lain saya sadar menggunakannya tanpa memengaruhi register, seperti elscreen dan escreen yang menggunakan bilah header untuk menampilkan tab. workgroups dan workgroups2 adalah dua pendekatan yang lebih baru dan lebih luas untuk masalah ini. Saya pribadi tidak suka dan karena itu menulis sendiri di antara keduanya dan semoga lebih sedikit bug dan kompleksitasnya.

wasamasa
sumber
Itu hal bagus tentang register tetapi bagaimana saya harus menggunakannya dalam hal ini? Saya akan memeriksa plugin yang Anda daftarkan untuk melihat apakah ada keberhasilan untuk saya :)
lukas.pukenis
Anda menyimpan tata letak Anda saat ini ke register, lakukan beberapa perubahan, lalu setelah Anda ingin beralih ke keadaan semula, kembalikan tata letak dari register. Paket-paket yang saya daftarkan mengangkat Anda dari beban mental melakukan ini setiap kali Anda ingin berganti layout.
wasamasa
apakah mungkin untuk membuat konfigurasi jendela tertentu selama startup (dalam file .emacs saya) dan kemudian menyimpannya ke register? Saya mencoba (window-configuration-to-register "1")sebagai perintah di .emacs saya, tetapi tidak berhasil
pm
Coba gunakan desktop.el untuk itu, telah berhasil dikombinasikan dengan alis sebelumnya.
wasamasa
2

Anda dapat menyimpan tata letak jendela saat ini ke register dan kemudian mengembalikannya menggunakan jump-to-register. Perintah window-configuration-to-registerterikat C-x r wsecara default.

Misalnya, ketika Anda mengatur windows dengan cara yang bermanfaat, Anda dapat menyimpannya untuk didaftarkan imenggunakan: C-x r w idan mengembalikan tata letak nanti menggunakan C-x r j i.

glukas
sumber
1
Ha, kami bertiga menjawab tentang register pada saat yang sama.
glukas
1

Zygospore menyediakan perbaikan cepat untuk situasi di mana Anda memiliki beberapa jendela terbuka, dan ingin memaksimalkan salah satunya untuk sementara. Ini memodifikasi perilaku C-x 1. Ketika Anda memiliki beberapa jendela terbuka, itu berperilaku seperti default delete-other-windows, dan menghapus semua jendela kecuali yang Anda lihat. Ketika Anda menekannya lagi, itu mengembalikan windows lainnya.

Mode pemenang menyediakan solusi yang lebih umum, tetapi zygospore sangat bagus untuk memperbesar sementara pada satu jendela dalam sebuah bingkai. Yang terbaik adalah tidak menggunakan ikatan kunci baru - itu mendefinisikan kembali dengan C-x 1cara yang sangat intuitif, sehingga tidak ada ikatan baru untuk dipelajari.

Tyler
sumber
1

Ini pertanyaan yang menarik. Beberapa tahun yang lalu saya menyelidiki semua solusi. Hanya workgroups2.el yang cukup berat untuk menutupi semua kasing sudut.

Tapi workgroups2 UI adalah bencana. Misalnya, jika Anda mengaktifkan worksgroup-mode (seperti yang disarankan README), tata letak sebelumnya akan dimuat secara otomatis saat emacs startup. Itu membuat startup sangat lambat SETIAP waktu.

Solusi saya adalah memperlakukan workgroups2 sebagai kumpulan API, bukan alat yang dapat digunakan di luar kotak. Jadi saya mengubah interaksi UI default dengan menggunakan ivy-mode ( https://github.com/abo-abo/swiper ) dari @ abo-abo

masukkan deskripsi gambar di sini

Beralih jendela penuh itu mudah, gunakan API dari mode pemenang sudah cukup.

Berikut adalah kode lengkap (saya hanya menggunakan M-x toggle-full-window, M-x wg-create-workgroupdan M-x my-wg-switch-workgroup, Anda juga perlu menginstal swiper, seperti yang saya sebutkan di atas),

(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))))
chen bin
sumber