Split Window di perbatasan terluar

8

Saya sedang mencari cara untuk menambahkan split jendela tinggi penuh baru ke konfigurasi jendela yang sudah ada (terpecah). Karena saya tidak tahu bagaimana menjelaskannya dengan benar, saya hanya akan memposting beberapa grafik ASCII yang menunjukkan perilaku yang diinginkan untuk dua contoh konfigurasi jendela:

             from                              to  

  +-------------------------+      +---------------------+---+  
  |                         |      |                     |   |  
  |                         |      |                     |   |  
  |            A            |  =>  |           A         | E |  
  |                         |      |                     |   |  
  |                         |      |                     |   |  
  +-------------------------+      +---------------------+---+  

  +------------+------------+      +----------+----------+---+  
  |            |     B      |      |          |   B      |   |
  |     A      +------------+      |     A    +----------+   |
  |            |     C      |  =>  |          |   C      | E | 
  +------------+------------+      +----------+----------+   |
  |            D            |      |          D          |   |
  +-------------------------+      +---------------------+---+  

dimana fungsi menerima lebar yang diinginkan dari jendela baru Edan menyusut lebar dari A, B, C, dan Dsesuai. Sunting2 : Perhatikan bahwa dua gambar di atas adalah contoh perilaku yang diharapkan untuk kasus konkret. Saya mencari fungsi umum yang melakukan ini secara independen dari konfigurasi di kolom from (yaitu jumlah windows [splits] di kolom from harus arbitrer).

Saya juga mencari fungsi ini di sisi kiri dan di bagian atas dan bawah bingkai.

Sunting: Dari komentar @ Nsukami_ saya menyadari bahwa fungsionalitas yang saya cari adalah kasus khusus dari masalah yang lebih abstrak. Jadi saya akan mengutarakan masalah itu:

Bagaimana Anda menyimpan konfigurasi jendela (terdiri dari sejumlah jendela dan buffer) dan "menempelkan" konfigurasi tersimpan ke jendela yang ada?

The "paste" maka harus melestarikan ukuran jendela relatif dan membelah; secara alami konfigurasi yang disisipkan adalah salinan skala.

elemakil
sumber
Perilaku pertama dapat diperoleh dengan melewati ukuran argumen untuk split-window-rightsebagai C-u -width C-x 3. Ubah widthke apa pun yang Anda inginkan dan perhatikan tanda negatif.
Vamsi
Saya sedang berpikir tentang pra mendefinisikan beberapa layout, tetapi tidak yakin.
Nsukami _
@Nsukami_ Apakah mungkin untuk menyimpan tata letak jendela (misalnya tata letak A, B, C, dan D) dan kemudian memasukkan tata letak ini ke jendela baru? Maka masalah saya dapat diselesaikan dengan 1) menyimpan konfigurasi jendela saat ini, 2) mengubah tata letak untuk hanya menampilkan satu jendela yang kemudian dipisah secara horizontal [pada dasarnya membentuk jendela untuk Edan jendela pengganti untuk yang lain, sebut saja Z], 3 ) akhirnya penyisipan tata letak asli ke jendela kiri ( Z)
elemakil
Anda harus menyesuaikan tata letak sebelum dimasukkan karena mengandung ukuran jendela juga. Juga penyisipan tata letak ke dalam satu jendela tertentu tidak dimungkinkan tanpa elaik khusus AFAIK
Vamsi

Jawaban:

5

Fungsi berikut harus melakukan apa yang Anda inginkan. Caranya adalah dengan membagi jendela root dari frame saat ini.

(defun my-split-main-window (direction size)
  "Split the main window in the DIRECTION where DIRECTION is a symbol with
possible values of right, left, above or below and SIZE is the final size of the
windows, if the window is split horizontally (i.e. in DIRECTION below or above)
SIZE is assumed to be the target height otherwise SIZE is assumed to be the
target width"
  (let* ((new-window (split-window (frame-root-window) nil direction))
         (horizontal (member direction '(right left))))
    (save-excursion 
      (select-window new-window)
      (enlarge-window (- size (if horizontal
                                  (window-width)
                                (window-height)))
                      horizontal))
    new-window))

Panggil fungsi dengan arah di mana Anda untuk membagi jendela dan ukuran jendela baru. Di atas mengembalikan jendela yang baru dibuat. Konsep dan jendela dan bingkai dijelaskan dengan sangat baik dalam Manual Referensi GNU Emacs Lisp .

Iqbal Ansari
sumber
Sempurna! Inilah yang saya inginkan.
elemakil
0

Tidak yakin apakah solusi terbaik, karena tidak cukup abstrak, saya sebenarnya hanya menyelesaikan satu kasus penggunaan. Caranya adalah menulis fungsi untuk beralih dari layoutX ke layoutY, dan yang lain untuk beralih dari layoutY ke layoutX

(defun from-x-to-y ()
 (interactive)
 (delete-other-windows)
 (split-window-vertically) ;;
 (let ((current-prefix-arg 10)) ;; emulate C-u
   (call-interactively 'enlarge-window) ;; resize
   )
 (split-window-horizontally) ;; -> |
 (next-multiframe-window)
 (split-window-vertically) ;;  -> --
 (previous-multiframe-window)
)

(defun from-y-to-x ()
  (interactive)
  (delete-other-windows)
  (split-window-horizontally) ;; -> |
  (let ((current-prefix-arg -60)) ;; emulate C-u
    (call-interactively 'shrink-window-horizontally) ;; resize
    )
  (split-window-vertically) ;; -> --
  (let ((current-prefix-arg 10)) ;;
    (call-interactively 'enlarge-window) ;;
    )
  (split-window-horizontally) ;;
  (next-multiframe-window)
  (split-window-vertically) 
  (previous-multiframe-window)
)

Saya harap solusi itu akan membantu

Bagaimana Anda menyimpan konfigurasi jendela (terdiri dari sejumlah jendela dan buffer) dan "menempelkan" konfigurasi tersimpan ke jendela yang ada?

Baru saja menemukan paket bernama layout.el , saya belum pernah menggunakannya tetapi sepertinya itu yang Anda cari, Anda akan memberi tahu kami jika ok.

EDIT:

Mencoba menemukan solusi yang lebih umum, tampaknya Anda dapat menggunakan M-x switch-to-buffer-other-frameuntuk beralih dari buffer dalam sebuah frame, katakanlah dengan layout X, ke buffer lain di frame lain dengan layout Y.

Anda juga dapat berada dalam tata letak X, menyimpan tata letak ini dalam register C-x r f(frame-configuration-to-register), pergi ke tata letak lain, dan bila perlu, kembali ke yang sebelumnya, memanggil apa yang ada di dalam register dengan C-x r j (lompat- mendaftar)

Nsukami _
sumber
Sejauh yang saya tahu layout.elmelakukan hal yang sama seperti winner: (kembali) menyimpan konfigurasi jendela dari bingkai lengkap, tidak menyimpan konfigurasi lengkap dan mengembalikannya ke jendela yang ada. Fungsi yang Anda tulis di sisi lain memang bukan solusi umum yang saya cari. Mereka memecahkan contoh kedua saya, yang tidak dimaksudkan sebagai masalah nyata tetapi hanya sebuah contoh. Saya mencari solusi yang berfungsi dalam kasus umum.
elemakil
Masih menggali, dan saya pikir solusi umum bisa switch-to-buffer-other-framejika 'dari' adalah bingkai dan 'ke' adalah bingkai lain
Nsukami _