Ejecute el comando al abrir un archivo de un tipo de archivo específico

14

Estoy tratando de obtener un script lisp para ejecutar algunos comandos para mí cuando abro un archivo de un tipo de archivo específico. Sé que estoy trabajando en el archivo de inicio correcto porque si elimino el tema, emacs no tendrá ningún tema cuando lo inicie.

Este es el script que estoy usando que no funciona (sin errores ni nada):

(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
fuente
En este contexto, "cargar" significa "cargar como código lisp". Creo que en su lugar desea find-file-hook (tenga en cuenta que estos no se llaman con un argumento! Use buffer-file-name en su lugar). También puede utilizar la lista automática de modos y definir su propio modo principal.
YoungFrog
3
En realidad, parece que quieres un gancho de modo.
Dan
Todavía no ha llegado al problema porque su función no se ejecuta, pero cuando lo hace, sabe que lo anterior no es válido lisp. El cuerpo de su whenllamada está malformado. Las dos llamadas a funciones no pueden estar entre paréntesis como lo son. Tenga en cuenta la diferencia entre su código y @ sds's
Jordon Biondo

Respuestas:

16

En la terminología de Emacs, estos son dos pasos diferentes:

  • Asociar archivos con la .tsextensión con el modo principal typescript-mode .
  • Ejecute la función tss-setup-current-buffercuando se inicie el modo mecanografiado.

Para elegir qué modo principal usar para ciertos nombres de archivo, agregue una entrada a la variable auto-mode-alist. Pon la siguiente línea en tu archivo init:

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

\.ts\'es una expresión regular que coincide con los nombres de archivo con la .tsextensión.

Para ejecutar la función tss-setup-current-buffercada vez que se inicia el modo de Letra de imprenta (supongo que desea ejecutarlo incluso para los archivos de modo Letra de imprenta que no tienen la .tsextensión), añadirlo a la modalidad de imprenta inicio de gancho .

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

Dependiendo de cómo lo instaló typescript.ely tss.el, es posible que también deba declarar que las funciones typescript-modey tss-setup-current-bufferque deben cargarse desde esos archivos. Esto evita tener que cargar typescript.ely tss.eltan pronto como se inicie Emacs: se cargarán a pedido, cuando abra un .tsarchivo por primera vez o lo ejecute typescript-modeexplícitamente.

(autoload 'typescript-mode "Major mode for typescript files" t)
(autoload 'tss-setup-current-buffer "Set up the current file for TSS" t)
Gilles 'SO- deja de ser malvado'
fuente
9

Lo que estás buscando es 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
fuente
44
Si bien eso funcionará, debe señalarse que esta no es la forma correcta de iniciar los modos principales al encontrar un archivo o configurar personalizaciones para el modo principal. El auto-mode-alistdebe usarse para determinar cuándo la puesta en marcha en modo texto mecanografiado, y typescript-mode-hookse debe utilizar para ejecutar tss-setup-current-buffer.
Jordon Biondo
Usar (add-to-list 'auto-mode-alist '("\\.ts\\'" . typescript-mode))y (add-hook 'typescript-mode-hook 'tss-setup-current-buffer)sería la forma normal de hacerlo.
Jordon Biondo