Bagaimana saya bisa memblokir bingkai agar tidak terbelah?

16

Saat ini saya bekerja dengan ruby ​​dan rspec. Saya sangat menyukai gagasan memiliki bingkai terpisah di monitor lain yang menunjukkan kepada saya buffer kompilasi. Pengaturan saya saat ini menggunakan bingkai 'kode' (di mana saya melakukan pekerjaan sebenarnya) dan kerangka 'hasil-tes' (di mana saya melihat hasil rspec)

Masalahnya adalah bahwa ketika saya mencoba untuk membuka beberapa kesalahan kompilasi atau file dalam frame 'test-hasil', perpecahan jendela yang bingkai. Yang benar-benar ingin saya lakukan adalah membukanya di bingkai 'kode' saya.

Saya sudah menggunakan opsi display-buffer-reuse-frames. Saya juga mencoba untuk mengatur jendela hasil kompilasi dedicated, tetapi setiap kali emacs mencoba membuka jendela baru, bingkai baru akan dibuat (yang sangat buruk jika Anda menggunakan Helm.)

Apakah ada cara mudah untuk mencapai ini?

Renan Ranelli
sumber
1
Menggunakan emacs sebagai IDE akan jauh lebih nyaman jika ada yang mudah "menyematkan" buffer pada tempatnya sehingga selalu muncul di tempat yang sama mulai sekarang. Salah satu fitur Visual Studio yang paling saya rindukan saat menggunakan emacs adalah cara sederhana dan intuitif untuk membagi, menyematkan, merapat, menyembunyikan, dan memanipulasi jendela.
nispio
1
Ya. Saya juga datang dari latar belakang vs, dan saya juga melewatkan ini, meskipun saya merasa antarmuka emacs clean-no-button-no-bullshit lebih baik sebagian besar waktu.
Renan Ranelli
@nispio Saya tidak menggunakan VS sehingga Anda dapat menentukan apa yang Anda maksud dengan "pin". Frame Emacs biasanya eksklusif dan tidak berubah kecuali jika Anda berinteraksi dengannya.
Vamsi
@vamsi: VS menggunakan banyak jendela kecil yang dapat Anda lampirkan ke atas / bawah / sisi bingkai Anda, atau Anda dapat meletuskannya dan membuat bingkai baru. Anda dapat memasang jendela di tepi bingkai dan mengaturnya agar menyembunyikan otomatis. Sebagai contoh, jendela keluaran kompilasi akan secara ajaib muncul dari bawah ketika kompilasi dimulai, dan menyembunyikan dirinya lagi tidak lama setelah kompilasi berakhir. Jika Anda tidak ingin jendela disembunyikan secara otomatis, Anda dapat menyematkannya di tempat, dan kemudian mencopotnya lagi ketika Anda selesai merujuknya.
nispio
@nispio saya mengerti. Saya menggunakan popwin.eldari MELPA untuk mengkompilasi popup dan membantu buffer yang bertahan sampai C-gditekan. Jika saya membutuhkan mereka penuh waktu, saya hanya beralih ke mereka di jendela lain. Saya belum berpikir tentang menyematkan windows karena emacs split-windows-sensibly.
Vamsi

Jawaban:

9

Anda perlu mengkonfigurasi gorilla 600 pon display-buffer-alistyang menentukan bagaimana display-buffermemilih tempat untuk menampilkan buffer. Itu membuat display-buffer-reuse-framesusang di emacsen yang lebih baru. Berikut adalah konfigurasi yang harus memandu Anda (minimal dalam emacs 24.3).

;; all buffers, try to reuse windows across all frames
(add-to-list 'display-buffer-alist
           '(".*". (display-buffer-reuse-window .
                                  ((reusable-frames . t)))))

;; except for compilation buffers where you want new and dedicated frames when necessary
(add-to-list 'display-buffer-alist
         '("^\\*Compile-Log\\*". ((display-buffer-reuse-window
                                   display-buffer-pop-up-frame) .
                                  ((reusable-frames . t)
                                  (inhibit-same-window . t)))))

Seperti yang Anda lihat, saya menggunakan regexp untuk mencocokkan buffer-log kompilasi. Dokumentasi display-bufferharus memberi Anda gambaran tentang apa yang terjadi. Hanya perlu diingat bahwa itu bukan bagian dokumentasi yang paling menyenangkan yang pernah Anda baca. Saya menambahkannya secara berurutan sehingga compexp-log regexp akan dicocokkan sebelum regexp generik. Sesuaikan regexp dengan kebutuhan Anda.

EDIT Untuk membuat frame apa pun tidak dapat dilepas, Anda dapat mengevaluasi M-: (set-frame-parameter nil 'unsplittable t)dalam frame tertentu. Ganti nil dengan yang diminta FRAMEjika melakukannya dari elisp. Di antara kedua pengaturan ini, itu harus membuat frame kompilasi eksklusif kecuali Anda secara khusus menemukan file dalam frame itu.

Vamsi
sumber
Masalahnya adalah saya tidak ingin membuka bingkai baru setiap saat. Yang saya inginkan adalah membatasi semua jendela ke bingkai 'kode', dengan pengecualian buffer 'kompilasi-log', yang harus selalu ditampilkan dalam bingkai 'pengujian'. Saya tidak dapat menemukan cara untuk mengalihkan semua jendela baru ke bingkai 'kode' utama saya. Mungkin saya tidak cukup jelas dalam pertanyaan = (
Renan Ranelli
Ini seharusnya hanya membuka frame baru untuk log kompilasi juga hanya jika tidak ada frame yang ada. Bisakah Anda memberi tahu saya apa yang salah. Lihat edit tentang cara membuat bingkai apa pun tidak dapat dilukis.
Vamsi