débogage de certains elisp - "fin de fichier lors d'une erreur d'analyse" dans init.el

9

Après un long débogage de mon fichier init.el, il ressemble à la première ligne du code elisp suivant, c'est-à-dire (custom-set-variablesprovoque une erreur «Fin de fichier pendant l'analyse» que je ne comprends absolument pas. Si je commente cette ligne, tout va bien. Je n'ai même pas entré ce code moi-même, car il a été automatiquement ajouté dans init.el à partir du customizemenu.

(custom-set-variables
'(global-hl-line-mode t)
'(ido-mode (quote buffer) nil (ido))
'(menu-bar-mode nil)
 (when (display-graphic-p)
 (tool-bar-mode -1)
 (scroll-bar-mode -1))

Voici le message d'erreur complet:

Avertissement (initialisation): Une erreur s'est produite lors du chargement de `/Users/me/.emacs.d/init.el ':

Fin du fichier pendant l'analyse: /Users/me/.emacs.d/init.el

Toute aide serait appréciée ! Merci

loukios
la source
Si le fichier est volumineux, vous pouvez utiliser M-x check-parenspour passer à la section incriminée. Si le fichier est court ou si vous regardez une courte section de code, il existe des méthodes pour mettre en évidence les parenthèses correspondantes pour voir visuellement où une parenthèse est mal placée ou manquante. Voici un lien vers ma propre variante de highlight-parentheses-mode: stackoverflow.com/a/23998965/2112489
lawlist
Veuillez ne pas utiliser custom-set-variablesdans votre propre code Elisp. Ceci est destiné à être généré automatiquement uniquement . Ne le copiez pas et ne le collez pas. Recherchez un code équivalent en utilisant setqou quelque chose comme ça.
Stefan

Réponses:

20

L'erreur «fin de fichier pendant l'analyse» signifie que vous n'avez pas fermé de paren.

Pour déboguer cela, vous devez

  1. Faites M-x check-parens RETpour localiser l'emplacement de l'erreur actuelle.
  2. Activez show-paren-modepour voir quel paren correspond à votre actuel - cela vous aidera avec la maintenance continue du code.
  3. Utilisez C-M-f/C-M-b pour naviguer par des parens équilibrés; si vous obtenez une erreur, c'est là que se trouve votre parent ouvert qui n'a pas été fermé.
  4. Utilisez TABpour indenter chaque ligne et voir si la nouvelle indentation est conforme à vos attentes.

L'autre réponse explique correctement quelle est l'erreur réelle dans votre cas.

sds
la source
5

Une parenthèse fermante est manquante dans l'exemple ci-dessus. La whendéclaration ne fait pas partie de la custom-set-variables. Le code corrigé est le suivant:

(custom-set-variables
  '(global-hl-line-mode t)
  '(ido-mode (quote buffer) nil (ido))
  '(menu-bar-mode nil))

(when (display-graphic-p)
  (tool-bar-mode -1)
  (scroll-bar-mode -1))
liste des lois
la source