В Emacs, каков канонический способ защиты жизненно важных буферов, таких как * scratch * и * Messages *, от уничтожения? - PullRequest
3 голосов
/ 17 сентября 2011

Я читал этот вопрос , и ответы были запутанными беспорядок (функция таймера действительно?)

В любом случае, яне волнует воссоздание этих буферов, поскольку это тривиально.Но эти буферы содержат информацию, которую никогда не следует удалять, и, поскольку у них нет связанных имен файлов, они обычно уничтожаются без подтверждения.

У меня есть решение, но я хочу посмотреть, есть ли у кого-тоболее «канонический».



jtahlborn предоставил наиболее каноническое решение, за исключением того, что пакет keep-buffers показывает, что его возраст имеет некоторые проблемы:

  1. Вы должны были указать, должны ли все защищенные буферы быть похоронены и стерты (стертые буферы могут быть восстановлены с помощью «отмены»), когда убиты, или просто похоронены, когда убиты.

  2. member переопределено как find-in-list менее эффективно.

  3. Вспомогательные функции, которые действительно не помогли.

Я сделал protected-list списком, который связывает регулярное выражение с действием стирания, и удалил бесполезный (IMO) код.По умолчанию " scratch " стирается при уничтожении, " Messages " никогда не стирается и не уничтожается.

См. github

Ответы [ 3 ]

8 голосов
/ 17 сентября 2011

Вы можете попробовать добавить функцию в переменную kill-buffer-query-functions, которая проверяет текущий буфер, если он равен scratch или Messages , а затем возвращает nil. Я никогда не пробовал этого раньше, но это должно предотвратить их убийство.

Редактировать: Вот пример использования kill-buffer-query-functions, который позволяет защищать определенные буферы: http://www.emacswiki.org/emacs/protbuf-by-name.el

3 голосов
/ 18 сентября 2011

я использую утилиту keep-buffers .

1 голос
/ 21 сентября 2011

В дополнение к тому, что было сказано другими -

*scratch* никоим образом не является "жизненно важным" буфером.И по умолчанию ничего и никто автоматически ничего не записывает в *scratch* или что-то там изменяет.

(FWIW, я склонен использовать обычный файловый буфер режима Emacs-Lisp вместо *scratch*. Одна из причин заключается в том, чтоОбычно я хочу сохранить его в какой-то момент. (Другая причина: я предпочитаю, чтобы Cj делал то, что он делает в режиме Emacs-Lisp. Да, я мог бы изменить только эту привязку ключа, но вместо этого я оставляю *scratch* для некоторых видов взаимодействия, но обычно не для песочницы для кодирования.)

*Messages* - это отдельная история.

Но как вы случайно удалили *Messages*? За десятилетияиспользуя Emacs, я не думаю, что когда-либо случайно убил *Messages*. Каков сценарий возникновения проблемы, решение которой вы ищете?

...