При использовании сжатых файлов *.elc (как gzip, так и bzip2) после загрузки этих файлов становится невозможным доступ к документации для определённых в этих файлах функций. Пример: C-h f life RET (описание отображается нормально) M-x life RET (вызывает загрузку life.elc.gz) C-h f life RET (вместо описания отображается мусор) Кроме того, в определённых ситуациях emacs падает: M-: (setq load-force-doc-strings t) RET M-x life RET Fatal error (11).Segmentation fault Проблема в том, что в .elc строки с документацией хранятся в виде смещений от начала файла, а загрузка самого текста обычно происходит по требованию; для сжатых файлов это не проходит (функция doc.c:get_doc_string() работает непосредственно с файлом). После (setq load-force-doc-strings t) строки документации должны загружаться немедленно - это тоже не работает, так как в функцию doc.c:get_doc_string() передаётся имя сжатого файла, а распакованное содержимое находится во временном буфере Emacs и недоступно для этой функции. --- ---
У меня не падает (во втором примере). Впрочем, это не так важно. Первое уже плохо.
in 21.3-alt2 Некоторые подробности: `jka-compr-load\' заботится об этой проблеме (временно меняя знчение `load-force-doc-strings\' при загрузке распакованного файла). Всё должно было быть хорошо, но оказалось, что `jka-compr-load\' использовался не всегда при загрузке. Это ошибка в lread.c -- там на самом деле две ошибки в одном месте, поэтому и патча два. * Tue Apr 01 2003 Ivan Zakharyaschev <<a href="mailto:imz@altlinux.ru>" target="_new">imz@altlinux.ru></a>; 21.3-alt2 - built-in `load\': always use the load-handler if it is present (e.g. for compressed .elc\'s; fixes No. 0002355; patches 11 and 12); <...> Ещё более подробные объяснения и тесты: I have just tried the currently checked-out from Savannah Emacs sources. My conclusion is like this: in the current sources, another problem at the same place has been fixed, and the problem in focus remains there. (I\'ve made a patch.) (Meanwhile I discovered that the fix I suggested for Emacs 21.3 is not enough for it to work correctly -- it should be combined with the fix from the current sources to fight the problem completely.) Here are the details: the handler for load is not always used when it should. Here is a sequence of commands that demonstrates it on the newest Emacs, too. (Remember, /usr/share/emacs/21.3/lisp/play/life.elc.gz is compressed at the standard location; \"/usr/share/emacs/21.3/lisp\" and \"/usr/share/emacs/21.3/lisp/play\" are in the `load-path\'): (require \'jka-compr) (auto-compression-mode t) (debug-on-entry \'jka-compr-load) ;;;;;;;;; 1 ;;;;;;;;; (load \"/usr/share/emacs/21.3/lisp/play/life\") ; no entry into `jka-compr-load\' (load \"/usr/share/emacs/21.3/lisp/play/life.elc.gz\") ; `jka-compr-load\' entered ;;;;;;;;; 2 ;;;;;;;;; (load \"play/life\") ; no entry into `jka-compr-load\' (load \"play/life.elc.gz\") ; `jka-compr-load\' entered ;;;;;;;;; 3 ;;;;;;;;; (load \"life\") ; no entry into `jka-compr-load\' (load \"life.elc.gz\") ; `jka-compr-load\' entered This inconsistency is not good. It might cause errors. (E.g., in Emacs 21.3, it was the problems with docstrings.) In Emacs 21.3, there are even less entries (no entry in one of the cases 1--3.)