Exécuter la commande lors de l'ouverture d'un fichier d'un type de fichier spécifique

14

J'essaie d'obtenir un script lisp pour exécuter certaines commandes pour moi lorsque j'ouvre un fichier d'un type de fichier spécifique. Je sais que je travaille dans le bon fichier d'initialisation car si j'en supprime le thème, emacs n'a pas de thème au démarrage.

Voici le script que j'utilise qui ne fonctionne pas (pas d'erreurs ou quoi que ce soit):

(defun my-project-hook (filename)
  (when (string= (file-name-extension filename) "ts")
    ((typescript-mode)
     (tss-setup-current-buffer))
  ) 
)

(add-hook 'after-load-functions 'my-project-hook)
SiXoS
la source
Dans ce contexte, "charger" signifie "charger en code lisp". Je pense que vous voulez plutôt trouver-file-hook (notez que ceux-ci ne sont pas appelés avec un argument! Utilisez plutôt buffer-file-name). Vous pouvez également utiliser la liste des modes automatiques et définir votre propre mode principal.
YoungFrog
3
En fait, il semble que vous souhaitiez un mode hook.
Dan
Vous n'avez pas encore rencontré le problème car votre fonction ne s'exécute pas, mais quand elle le fait, vous savez que ce qui précède n'est pas valide. Le corps de votre whenappel est mal formé. Les deux appels de fonction ne peuvent pas être entourés de parenthèses comme ils le sont. Notez la différence entre votre code et @ sds
Jordon Biondo

Réponses:

16

Dans la terminologie Emacs, ce sont deux étapes différentes:

  • Associez les fichiers avec l' .tsextension au mode principal typescript-mode .
  • Exécutez la fonction tss-setup-current-bufferlorsque le mode Typescript démarre.

Pour choisir le mode principal à utiliser pour certains noms de fichiers, ajoutez une entrée à la variable auto-mode-alist. Mettez la ligne suivante dans votre fichier init:

(add-to-list 'auto-mode-alist '("\\.ts\\'" . typescript-mode))

\.ts\'est une expression régulière qui correspond aux noms de fichiers avec l' .tsextension.

Pour exécuter la fonction tss-setup-current-bufferchaque fois que le mode Typescript démarre (je suppose que vous souhaitez l'exécuter même pour les fichiers en mode Typescript qui n'ont pas l' .tsextension), ajoutez-la au crochet de démarrage du mode Typescript .

(add-hook 'typescript-mode-hook 'tss-setup-current-buffer)

Selon la façon dont vous avez installé typescript.elet tss.el, vous devrez peut-être également déclarer que les fonctions typescript-modeet tss-setup-current-bufferdoivent être chargées à partir de ces fichiers. Cela évite d'avoir à charger typescript.elet tss.eldès le démarrage d'Emacs: ils seront chargés à la demande, lors de la première ouverture d'un .tsfichier ou de son exécution typescript-modeexplicite.

(autoload 'typescript-mode "Major mode for typescript files" t)
(autoload 'tss-setup-current-buffer "Set up the current file for TSS" t)
Gilles 'SO- arrête d'être méchant'
la source
9

Ce que vous recherchez, c'est find-file-hook:

(add-hook 'find-file-hook 'my-project-hook)
(defun my-project-hook ()
  (when (string= (file-name-extension buffer-file-name) "ts")
    (typescript-mode)
    (tss-setup-current-buffer)))
sds
la source
4
Bien que cela fonctionne, il convient de souligner que ce n'est pas la bonne façon de démarrer des modes principaux lors de la recherche d'un fichier ou de configurer des personnalisations pour le mode principal. Le auto-mode-alistdoit être utilisé pour déterminer quand démarrer le mode typographique et a typescript-mode-hookdoit être utilisé pour s'exécuter tss-setup-current-buffer.
Jordon Biondo
Utiliser (add-to-list 'auto-mode-alist '("\\.ts\\'" . typescript-mode))et (add-hook 'typescript-mode-hook 'tss-setup-current-buffer)serait la manière normale de le faire.
Jordon Biondo