EDIT: В этом случае в вашем коде нет ошибки, просто байтовый компилятор не знает, где определена функция.Он не знает, что whitespace-mode
определено в whitespace.el
, так как ему нечего сказать.(Не) к счастью, это не так умно, как вы еще.: -)
Вместо использования require
часто предпочтительнее использовать autoload
.Тогда вы можете забыть все о require
ing, так как emacs (и байтовый компилятор) будут знать, как загрузить функцию при первом вызове.
(autoload 'whitespace-mode "whitespace" nil t)
Если вы знаете, что функция уже будет загруженаВы можете использовать declare-function
, чтобы сообщить байтовому компилятору, что функция определена в определенном файле.Синтаксис (declare-function FUNCTION FILE ARGLIST)
.Для вашего случая это будет
(declare-function whitespace-mode "whitespace" (&optional ARG))
Я обычно помещаю их прямо перед defun, который их использует, но это только для организационных целей.
Конечно, любой из них может маскировать ошибку, еслито, что вы указали, на самом деле не соответствует действительности (файл не определяет функцию), но я полагаю, что нет никакого способа обойти это, поскольку whitespace.el
может быть удален или изменен, и загрузка не удастся.Я не думаю, что в большинстве случаев стоит защититься от случайности.