[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Flycheck reports are never satisfying!?

From: Sebastian Wiesner
Subject: Re: Flycheck reports are never satisfying!?
Date: Mon, 1 Sep 2014 12:23:21 +0200

Am 01.09.2014 um 12:00 schrieb Sebastien Vauban <address@hidden>:

> Hallo Sebastian,
> Sebastien Vauban wrote:
>> Sebastian Wiesner wrote:
>>> Am 28.08.2014 um 17:39 schrieb Sebastien Vauban <address@hidden>:
>>>> Sebastian Wiesner wrote:
>>>>> However, as far as "init.el" is concerned, Flycheck should
>>>>> automatically enable package.el for syntax checking.  This doesn't
>>>>> seem to work in your case, and indicates that there is something
>>>>> unusual about your setup.
>>>> In my case, in fact, my init.el is just a stub with my really really
>>>> personal settings. It calls another file with more general settings,
>>>> which I share with colleagues. All my problems are in this last file.
>>>> This particularity can explain that package is not enabled, right?
>>> I presume that this “shared” file is not in "~/.emacs.d/", is it?
> Right.
>>> In that case, Flycheck can't know that it's part of your Emacs
>>> configuration, and treats it as if it were any random Emacs Lisp
>>> file, which means that packages aren't enabled.
>>> Add "flycheck-emacs-lisp-initialize-packages" to the file-local
>>> variables of that file, with a value of t.  This forces Flycheck to
>>> enable packages when checking the file.
>> I just tested this, on another MWE:
>> ;;; .emacs-minimal.el --- Test file
>> ;;; Commentary:
>> ;;; Code:
>> (defun try-require (feature)
>>  "Attempt to load a FEATURE (or library).
>> Return true if the library given as argument is successfully loaded.  If
>> not, just print a message."
>>  (condition-case err
>>      (progn (if (stringp feature)
>>                 (load-library feature)
>>               (require feature)) t)
>>    (file-error (message "Requiring `%s'... missing" feature) nil)))
>> (when (require 'idle-require nil t)
>>  (setq idle-require-idle-delay 5)
>>  (setq idle-require-load-break 2))
>> (when (try-require 'idle-require)
>>  (setq idle-require-idle-delay 5)
>>  (setq idle-require-load-break 2))
>> (provide '.emacs-minimal)
>> ;; This is for the sake of Emacs.
>> ;; Local Variables:
>> ;; flycheck-emacs-lisp-initialize-packages: t
>> ;; flyspell-mode: nil
>> ;; End:
>> ;;; .emacs-minimal.el ends here
>> See the results on
>> - I still have the variables from the package `idle-require' reported as
>>  unknown...
>> - while that's a package which is under ELPA (right now in
>>  ~/.emacs.d/elpa/idle-require-20090716.3/) and I do have
>>  `flycheck-emacs-lisp-initialize-packages' set to `t'.
> Any idea why the local var `flycheck-emacs-lisp-initialize-packages'
> seems to have no effect?

The variable does have the intended effect:  The package system is initialized 
and the package is placed in `load-path'. 

But it's still not loaded, because neither `require' nor `try-require' are ever 
called during compilation.

As said before, only *top-level* `require' forms are evaluated by the byte 
compiler.   Your `try-require' is a `require' form, obviously, and your 
`require' call isn't top-level, since it's wrapped in `when'. The byte compiler 
just treats these like any other expression, and compiles them to byte code 
without evaluating them first.

You'll either have to `require' the package at *top-level*, or use 
`eval-when-compile'/`eval-and-compile' at the appropriate places to force the 
byte compiler to load your package during byte compilation.

For customization purposes specifically, you may use the following macro:

(defmacro lunaryorn-after (feature &rest forms)
  (declare (indent 1) (debug t))
  (when (bound-and-true-p byte-compile-current-file)
    (message "LOADING")
    (if (stringp feature)
        (load feature nil 'no-error)
      (require feature nil 'no-error)))
  `(with-eval-after-load ',feature ,@forms))

It's lazy like `with-eval-after-load', that is, delays the body until after the 
feature is loaded, but requires the feature during compilation to make variable 
definitions available.  Use it like this:

(lunaryorn-after idle-require
  (setq idle-require-idle-delay 5
        idle-require-load-break 2))

You'll need Emacs 24.4 for `with-eval-after-load`, or copy the definition of 
`with-eval-after-load' for earlier Emacsen.  See

reply via email to

[Prev in Thread] Current Thread [Next in Thread]