Мне было интересно, есть ли способ пометить определенные кадры в сеансе Emacs с разделенным окном как не изменяющиеся. У меня обычно есть 4 кадра для исходных файлов и 2-3 кадра для других представлений, таких как компиляция /grep-find /etc.
Я хотел бы как-то пометить последние фреймы, чтобы они никогда не разделялись или их содержимое не изменялось в emacs. Таким образом, если я нажму на результат поиска, у меня не будет разбитого окна компиляции и вставленного исходного файла.
Я хочу, чтобы любые исходные файлы помещались в мои исходные окна и не попадали в окна неправильного просмотра.
Есть ли способ сделать это?
2 ответа
Да, есть способ сделать это, но я не думаю, что это будет легко. Быстрый просмотр функций и переменных, связанных с фреймами, подтвердил мое убеждение, что здесь нет простого решения. Проблема в том, что Emacs не будет знать, что делать, когда эти кадры являются единственными оставшимися кадрами, и что-то нужно с ними сделать.
Я думаю, что было бы возможно закодировать пакет, который советовал бы все низкоуровневые функции управления кадрами так, чтобы некоторые кадры оставались нетронутыми при любой операции, но это потребовало бы идентификации и интерпретации каждой из этих низкоуровневых функций. Я думаю, что лучшим подходом (если вы не являетесь мастером elisp) было бы определить функции, которые вы используете, которые раздражают вас таким образом, и посмотреть, есть ли общая функция или группа функций, которые они используют, чтобы определить, какой кадр отображать их выход, а затем намеревался изменить это поведение.
Я бы, вероятно, использовал параметр кадра (frame-parameter
и modify-frame-parameters
), чтобы сохранить, был ли данный кадр нерушимым. Это может быть установлено вами вручную или, возможно, в конце функции, которая заполняет фрейм какими-либо данными (с помощью функции-оболочки или (более вероятно) defadvice). Затем найдите функцию, которая изменяет одну из них, и посмотрите на ее источник. Какие функции он вызвал, чтобы определить, какой кадр использовать? Измените и / или посоветуйте эти функции (или, может быть, то, что вызывается этими функциями), чтобы не рассматривать кадры с этим определенным набором параметров. В качестве особого случая, если нет других доступных кадров, создайте новый кадр и верните его.
Вы также можете иметь несколько классов фреймов (например, исходный фрейм, фрейм компиляции / ошибок) и разрешить повторное использование некоторых из них некоторыми функциями, но не другими. Насколько сложным вы это сделаете, действительно зависит от вас и вашего воображения.
Во всяком случае, это выглядит на первый взгляд очень выполнимо, но нетривиально.
Теперь, после всего сказанного, есть пакет, который может помочь вам приблизиться к тому, что вы хотите: Emacs один на один. Однако он не знает, защищает ли он фреймы так, как вы хотите. И из описания кажется, что он переопределяет множество основных функций, а не советует им, что может сделать его чрезвычайно специфичным для версии (это просто ощущение, что я получил чтение его описания; я не смотрел на код, чтобы посмотрим, так ли это на самом деле происходит).
Удачи!
Одним из вариантов может быть рассмотрение того, как работает gdb-many-windows - этот режим очень агрессивен в отношении сохранения определенной компоновки окна.
Кроме того, можно сохранить конфигурацию фрейма / окна в регистр и позднее извлечь эту конфигурацию из регистра.
Третий вариант: вот решение в elisp (вы можете просто оценить его в чистом буфере, чтобы попробовать, и добавить его в свой .emacs, если вам это нравится)
Установите все размеры и положения рамки и окна так, как вам нравится, и введите Control-c s, и ваш макет будет сохранен. Затем введите Control-c f, чтобы восстановить его, если макет изменился. Это включает в себя все размеры окон, количество оконных расщеплений, и какой буфер находится в каждом окне, и где каждое окно находится на вашем рабочем столе.(define-key global-map "\C-cs"
(lambda ()
(interactive)
(message "saving current frame and window layout")
(setq my-favorite-frame-setup (current-frame-configuration))))
(define-key global-map "\C-cf"
(lambda ()
(interactive)
(message "restoring frame and window layout")
(set-frame-configuration my-favorite-frame-setup))))
Я сделал эти привязки клавиш только для того, чтобы ответить на этот вопрос только сейчас, но они мне нравятся достаточно, я на самом деле собираюсь держать их в своих .emacs сейчас, спасибо за отличный вопрос.