Как я могу заблокировать кадр от разделения?

16

В настоящее время я работаю с ruby ​​и rspec. Мне очень нравится идея иметь отдельный кадр в другом мониторе, показывающий мне буфер компиляции. Моя текущая настройка использует фрейм 'code' (в котором я выполняю реальную работу) и фрейм 'test-result' (в котором я вижу результаты rspec)

Проблема в том, что когда я пытаюсь открыть какую-то ошибку или файл компиляции во фрейме 'test-result', окно разбивается на этот фрейм. Что я действительно хотел бы сделать, так это открыть его в моем «кодовом» фрейме.

Я уже использую эту опцию display-buffer-reuse-frames. Я также пытался установить окно результатов компиляции dedicated, но всякий раз, когда emacs пытается открыть новое окно, создается новый фрейм (что особенно ужасно, если вы используете Helm.)

Есть ли простой способ добиться этого?

Ренан Ранелли
источник
1
Использование emacs в качестве IDE было бы намного удобнее, если бы можно было легко «закрепить» буфер, чтобы он всегда появлялся в одном и том же месте. Одна из функций Visual Studio, которую мне больше всего не хватает при использовании emacs, - это простой и интуитивно понятный способ разделения, закрепления, закрепления, скрытия и других манипуляций с окнами.
Ниспио
1
Ага. Кроме того, я работаю в фоновом режиме, и мне тоже не хватает этого, хотя я чувствую, что интерфейс emacs «чистый-без-кнопок-без-чушь» в большинстве случаев лучше.
Ренан Ранелли
@nispio Я не использую VS, так что вы можете указать, что вы подразумеваете под "pin". Кадры Emacs обычно являются эксклюзивными и не изменяются, если вы не взаимодействуете с ними.
Вамси
@vamsi: VS использует множество маленьких окон, которые вы можете прикрепить к верху / низу / сторонам вашего кадра, или вы можете выдвинуть их и создать новый кадр. Вы можете прикрепить окно к краям рамки и настроить его на автоматическое скрытие. Например, окно вывода компиляции волшебным образом всплывает снизу, когда начинается компиляция, и снова скрывается вскоре после окончания компиляции. Если вы не хотите, чтобы окно автоматически скрывалось, вы можете закрепить его на месте, а затем снова открепить, когда закончите ссылаться на него.
Ниспио
@nispio я вижу. Я использую popwin.elиз MELPA всплывающие окна компиляции и помощи, которые сохраняются до C-gнажатия. Если они нужны мне полный рабочий день, я просто переключаюсь на них в другом окне. Я не думал о закреплении окон, потому что Emacs делает split-windows-sensibly.
Вамси

Ответы:

9

Вам необходимо настроить 600-фунтовую гориллу, display-buffer-alistкоторая определяет, как display-bufferвыбрать место для отображения буфера. Это делает display-buffer-reuse-framesустаревшим в более новом Emacsen. Вот конфиг, который должен вам помочь (по крайней мере в 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)))))

Как видите, я использую регулярное выражение для сопоставления с буфером журнала компиляции. Документация display-bufferдолжна дать вам представление о том, что происходит. Только на голову, что это не самая приятная часть документации, которую вы когда-либо читали. Я добавил их последовательно, чтобы регулярное выражение компилируемого журнала совпадало с общим регулярным выражением. Приспособьте регулярное выражение к вашим потребностям.

РЕДАКТИРОВАТЬ Чтобы сделать любой кадр нерасщепляемым, вы можете оценить M-: (set-frame-parameter nil 'unsplittable t)в этом конкретном кадре. Замените ноль на обязательный, FRAMEесли делаете это из elisp. Между этими двумя настройками он должен сделать фрейм компиляции эксклюзивным, если вы не найдете файл в этом фрейме.

Vamsi
источник
Дело в том, что я не хочу постоянно открывать новые кадры. Я хочу ограничить все окна фреймом «code», за исключением буфера «compilation-log», который всегда должен отображаться в фрейме «test». Я не смог найти способ перенаправить все новые окна в мой основной кадр кода. Возможно я не был достаточно ясен в вопросе = (
Ренан Ранелли
Это должно открыть только новый фрейм для журнала компиляции, который тоже, только если нет существующего фрейма. Можете ли вы сказать мне, что происходит не так. Смотрите правку о том, как сделать любой кадр неразделимым.
Вамси