2012-01-17 3 views
4

Pour une raison quelconque, mes hooks de mode de script shell ne sont pas exécutés. Exemple dans mon .emacs:Crochet de mode de script shell Emacs

(add-hook 'shell-script-mode-hook (lambda() (rainbow-delimiters-mode 1)))

provoque les variables à définir, mais le mode n'est pas chargé pour les fichiers de script ouvert. Quelle est la bonne façon d'accrocher ici?

J'utilise le mode de script de shell par défaut (modeline dit par exemple Shell-script[bash]). Dois-je hooker pour chaque type de shell individuellement (sh, bash, zsh)? Si oui pouvez-vous s'il vous plaît dites-moi comment?

Merci beaucoup!

EDIT3:

Il est avéré être en raison d'un conflit d'TextMate mode avec le squelette paire insertion en mode sh (j'ai essayé d'éviter le conflit en désactivant TextMate en mode sh, qui a ensuite J'ai enlevé complètement le mode textmate et j'ai utilisé le mode textmate-hook complètement et j'utilise maintenant la paire de squelette standard approche globalement

J'accepte la réponse de phils - sans lui je ne pourrais probablement pas pour déboguer cela par moi-même

EDIT2:

Merci à phils, je pense que son commentaire nous rapproche de la solution. Cependant, ce n'est pas un problème avec les délimiteurs arc-en-ciel. J'ai enlevé tous les sh-mode-hook excepté votre salut un message et redémarrer Emacs. Lorsque j'ouvre un fichier .sh, j'obtiens ceci:

Configurer le retrait pour le type de shell bash mettre en place la substance indentée Les variables d'indentation sont maintenant locales. Configuration de la mise en retrait pour la bash du type de shell Erreur de spécification de mode de fichier: (fonction vide nulle)

Remarquez le message "hello". La valeur de sh-mode-hook est: (nil (lambda nil (message "hello")))

Je pense que le problème est cette première valeur nulle - bien que je ne vois pas qu'elle serait définie n'importe où.

Si j'Eval ceci:

(setq sh-mode-hook t) (add-hook 'sh-mode-hook (lambda() (message "hello")))

Je vois le message bonjour, mais après le redémarrage (je l'ai mis ces lignes dans emacs), il est parti à nouveau (le zéro est à nouveau au-dessus de le crochet).

Une idée de ce qu'il faut faire pour avoir un crochet actif lors de l'installation?

EDIT1: J'ai essayé aussi:

(add-hook 'sh-mode-hook (lambda() (rainbow-delimiters-mode 1)))

avec le même résultat négatif - pas sûr si cela est pertinent si ...

Répondre

9

shell-script-mode est un alias pour sh-mode.Je n'ai pas vérifié, mais je suppose que seule la variable hook pour le nom de la fonction 'real' est évaluée, donc je pense que sh-mode-hook serait celui à utiliser.

De toute façon, il n'y a rien de cassé au sujet de votre syntaxe, donc il peut y avoir quelque chose qui ne va pas avec l'utilisation de (rainbow-delimiters-mode 1). Par exemple, vous devriez être en mesure d'observer que les correctement œuvres suivantes:

(add-hook 'sh-mode-hook (lambda() (message "hello")))

FWIW, pour crochets je vous recommande de ne pas utiliser les fonctions anonymes du tout, simplement parce qu'il est beaucoup plus facile à mettre à jour votre fonction crochet si il est nommé (enlever l'ancienne expression lambda de la variable avant d'en ajouter une mise à jour est juste ennuyeux dans mes livres).

+0

Merci, cela a aidé à affiner le problème. Si vous avez le temps, jetez un coup d'œil à EDIT2 de la question originale, car elle est longue. Je vais essayer de nettoyer les choses pour la postérité si nous arrivons à trouver une solution. – user673592

+0

Peut-être que vous pourriez 'M-x rgrep' vos fichiers' .el' pour 'sh-mode-hook' pour voir si quelque chose d'autre le dérange. Il semble que, à la suite de votre 'add-hook', quelque chose d'autre fasse quelque chose comme' (add-hook 'sh-mode-hook nil) '. – phils

+0

Incidemment, je suis confus par votre '(setq sh-mode-hook t)' au lieu de '(setq sh-mode-hook nil)'. Cela ne semble pas causer de problèmes, mais que fait-il? – phils

0

Essayez de supprimer « :

(add-hook 'shell-script-mode-hook (lambda() (rainbow-delimiters-mode 1))) 
+0

Malheureusement cela n'aide pas ... la même construction fonctionne par ex. pour python-mode-hook etc. – user673592

+1

Les deux formes fonctionneront. La seule différence est que les expressions ''(lambda)' ne seront pas compilées. '(lambda)' est en fait auto-quotant et (de nos jours) équivalent à '(fonction (lambda))', donc en général il vaut mieux laisser les expressions lambdas non-citées. – phils