Jak mogę zablokować podział ramki?

16

Obecnie pracuję z ruby ​​i rspec. Naprawdę podoba mi się pomysł posiadania oddzielnej ramki na innym monitorze pokazującym mi bufor kompilacji. Moja obecna konfiguracja używa ramki „kodu” (w której faktycznie wykonuję pracę) i ramki „wyniku testu” (w której widzę wyniki rspec)

Problem polega na tym, że kiedy próbuję otworzyć jakiś błąd kompilacji lub plik w ramce „wyniku testu”, okno dzieli się w tej ramce. To, co naprawdę chciałbym zrobić, to otworzyć go w mojej ramce „kodu”.

Już korzystam z tej opcji display-buffer-reuse-frames. Próbowałem również ustawić okno wyników kompilacji dedicated, ale za każdym razem, gdy emacs próbuje otworzyć nowe okno, tworzona jest nowa ramka (co jest szczególnie okropne, jeśli używasz Helma).

Czy jest jakiś prosty sposób na osiągnięcie tego?

Renan Ranelli
źródło
1
Używanie emacsa jako IDE byłoby o wiele wygodniejsze, gdyby istniał łatwy do „przypięcia” bufor, tak aby odtąd zawsze pojawiał się w tym samym miejscu. Jedną z funkcji programu Visual Studio, której najbardziej brakuje mi podczas używania emacsa, jest prosty i intuicyjny sposób dzielenia, przypinania, dokowania, ukrywania i innego rodzaju manipulowania oknami.
nispio
1
Tak. Pochodzę także z tła vs i tęsknię za tym, chociaż wydaje mi się, że interfejs emacs clean-no-button-no-bullshit jest lepszy przez większość czasu.
Renan Ranelli
@nispio Nie używam VS, więc możesz określić, co rozumiesz przez „pin”. Ramki Emacsa są zwykle wyłączne i nie zmieniają się, chyba że z nimi wejdziesz.
Vamsi
@vamsi: VS używa wielu małych okien, które można przymocować do górnej / dolnej / bocznej strony ramki, lub można je wysunąć i utworzyć nową ramkę. Możesz zadokować okno do krawędzi ramki i ustawić automatyczne ukrywanie. Na przykład okno wyjściowe kompilacji magicznie wyskoczy z dołu, gdy kompilacja się rozpocznie, i ukryje się ponownie wkrótce po zakończeniu kompilacji. Jeśli nie chcesz, aby okno automatycznie się ukrywało, możesz przypiąć je w miejscu, a następnie ponownie odblokować, gdy skończysz je odnosić.
nispio
@nispio Rozumiem. Używam popwin.elz MELPA do kompilacji wyskakujących okienek i pomocy buforom, które trwają do C-gnaciśnięcia. Jeśli potrzebuję ich w pełnym wymiarze godzin, po prostu przełączam się na nie w innym oknie. Nie myślałem o przypinaniu okien, ponieważ emacs tak robi split-windows-sensibly.
Vamsi

Odpowiedzi:

9

Musisz skonfigurować 600-funtowego goryla, display-buffer-alistktóry określa sposób display-bufferwyboru miejsca wyświetlania bufora. Sprawia, że display-buffer-reuse-framesprzestaje być aktualny w nowszych emacsenach. Oto konfiguracja, która powinna cię poprowadzić (przynajmniej 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)))))

Jak widać, używam wyrażenia regularnego, aby dopasować bufor dziennika kompilacji. Dokumentacja display-bufferpowinna dać ci wyobrażenie o tym, co się dzieje. Tylko jedna wiadomość, że nie jest to najbardziej przyjemna dokumentacja, jaką kiedykolwiek przeczytałeś. Dodałem je sekwencyjnie, aby wyrażenie regularne w dzienniku kompilacji zostało dopasowane przed ogólnym wyrażeniem regularnym. Dostosuj wyrażenie regularne do swoich potrzeb.

EDYCJA Aby dowolna ramka była niewypełniona, możesz ją wyświetlić M-: (set-frame-parameter nil 'unsplittable t)w tej konkretnej ramce. Wymień zero na wymagane, FRAMEjeśli robisz to z elisp. Pomiędzy tymi dwoma ustawieniami powinna ona wyłączać ramkę kompilacji, chyba że konkretnie znajdziesz plik w tej ramce.

Vamsi
źródło
Chodzi o to, że nie chcę cały czas otwierać nowych ramek. Chcę ograniczyć wszystkie okna do ramki „kod”, z wyjątkiem bufora „dziennik kompilacji”, który powinien być zawsze wyświetlany w ramce „test”. Nie mogłem znaleźć sposobu na przekierowanie wszystkich nowych okien do mojej głównej ramki „kodu”. Może nie byłem wystarczająco jasny w pytaniu = (
Renan Ranelli
Powinno to otworzyć tylko nową ramkę dla dziennika kompilacji, która będzie dostępna tylko wtedy, gdy nie będzie żadnej ramki. Czy możesz mi powiedzieć, co się dzieje. Zobacz edycję o tym, jak sprawić, by każda ramka była niewypełniona
Vamsi