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)

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)

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)))

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.