Запустить команду при открытии файла определенного типа


14

Я пытаюсь заставить скрипт lisp запускать некоторые команды для меня, когда я открываю файл определенного типа файла. Я знаю, что работаю в правильном файле инициализации, потому что, если я удаляю тему из него, у emacs не будет темы при запуске.

Это скрипт, который я использую, который не работает (без ошибок или чего-либо еще):

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

В этом контексте «загрузка» означает «загрузить как код lisp». Я думаю, что вы хотите вместо этого найти find-file-hook (обратите внимание, что они не вызываются с аргументом! Используйте вместо этого buffer-file-name). Вы также можете использовать auto-mode-alist и определить свой основной режим.
YoungFrog

3
На самом деле, похоже, что вы хотите мод-хук.
Дан

Вы еще не столкнулись с проблемой, потому что ваша функция не работает, но когда это происходит, вы знаете, что вышеприведенный код недействителен. Тело вашего whenзвонка искажено. Два вызова функций не могут быть заключены в круглые скобки, как они есть. Обратите внимание на разницу между вашим кодом и @ sds's
Джордон Биондо

Ответы:


16

В терминологии Emacs это два разных шага:

  • Связать файлы с .tsрасширением с основным режимом typescript-mode .
  • Запустите функцию tss-setup-current-bufferпри запуске режима Typescript.

Чтобы выбрать, какой основной режим использовать для определенных имен файлов, добавьте запись в переменную auto-mode-alist. Поместите следующую строку в ваш файл инициализации:

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

\.ts\'является регулярным выражением, которое сопоставляет имена файлов с .tsрасширением.

Чтобы запустить функцию tss-setup-current-bufferпри каждом запуске режима Typescript (я предполагаю, что вы хотите запустить ее даже для файлов режима Typescript, которые не имеют .tsрасширения), добавьте ее в хук запуска режима Typescript .

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

В зависимости от того, как вы установили typescript.elи tss.el, вам также может потребоваться объявить, что функции typescript-modeи tss-setup-current-bufferдолжны быть загружены из этих файлов. Это позволяет избежать необходимости загрузки typescript.elи tss.elсразу после запуска Emacs: они будут загружаться по требованию, когда вы впервые открываете .tsфайл или запускаете его typescript-modeявно.

(autoload 'typescript-mode "Major mode for typescript files" t)
(autoload 'tss-setup-current-buffer "Set up the current file for TSS" t)

9

То, что вы ищете, это 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
Хотя это будет работать, следует отметить, что это неправильный способ запуска основных режимов при поиске файла или настройки параметров для основного режима. auto-mode-alistСледует использовать , чтобы определить , когда для запуска машинопись-режим, и typescript-mode-hookдолжны быть использованы для запуска tss-setup-current-buffer.
Джордон Биондо

Использование (add-to-list 'auto-mode-alist '("\\.ts\\'" . typescript-mode))и (add-hook 'typescript-mode-hook 'tss-setup-current-buffer)будет нормальным способом сделать это.
Джордон Биондо
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.