Uruchom polecenie podczas otwierania pliku określonego typu pliku

14

Usiłuję uzyskać skrypt lisp do uruchamiania niektórych poleceń dla mnie, gdy otwieram plik określonego typu pliku. Wiem, że pracuję w poprawnym pliku init, ponieważ jeśli usunę z niego motyw, emacs nie będzie miał motywu podczas uruchamiania.

To jest skrypt, którego używam, który nie działa (bez błędów lub czegokolwiek):

(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
źródło
W tym kontekście „ładuj” oznacza „ładuj jako kod lisp”. Myślę, że zamiast tego chcesz znaleźć hook-file-find (zauważ, że nie są one wywoływane z argumentem! Zamiast tego użyj pliku-bufora-nazwa-pliku). Możesz także chcieć użyć auto-mode-alist i zdefiniować własny tryb główny.
YoungFrog
3
W rzeczywistości wygląda na to, że potrzebujesz haka trybu.
Dan
Problem jeszcze nie dotarł, ponieważ twoja funkcja nie działa, ale gdy się dowie, wiesz, że powyższe nie jest poprawne. Treść twojego whenpołączenia jest zniekształcona. Dwa wywołania funkcji nie mogą być otoczone nawiasami, tak jak są. Zwróć uwagę na różnicę między kodem a @ sds's
Jordon Biondo

Odpowiedzi:

16

W terminologii Emacsa są to dwa różne kroki:

  • Skojarz pliki z .tsrozszerzeniem z trybem głównym typescript-mode .
  • Uruchom funkcję tss-setup-current-bufferpo uruchomieniu trybu maszynopisu.

Aby wybrać tryb główny, którego należy użyć dla niektórych nazw plików, dodaj wpis do zmiennej auto-mode-alist. Umieść następujący wiersz w pliku inicjującym:

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

\.ts\'to wyrażenie regularne, które pasuje do nazw plików z .tsrozszerzeniem.

Aby uruchomić tę funkcję przy tss-setup-current-bufferkażdym uruchomieniu trybu Typescript (zakładam, że chcesz go uruchomić nawet dla plików trybu Typescript, które nie mają .tsrozszerzenia), dodaj go do haka uruchamiania trybu Typescript .

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

W zależności od sposobu instalacji typescript.eli tss.elmoże być konieczne zadeklarowanie, że funkcje typescript-modei tss-setup-current-buffermuszą zostać załadowane z tych plików. Pozwala to uniknąć konieczności ładowania typescript.eli tss.elzaraz po uruchomieniu Emacsa: zostaną one załadowane na żądanie, gdy po raz pierwszy otworzysz .tsplik lub uruchomisz typescript-modejawnie.

(autoload 'typescript-mode "Major mode for typescript files" t)
(autoload 'tss-setup-current-buffer "Set up the current file for TSS" t)
Gilles „SO- przestań być zły”
źródło
9

To czego szukasz to 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
źródło
4
Chociaż to zadziała, należy zauważyć, że nie jest to właściwy sposób uruchamiania głównych trybów podczas znajdowania pliku lub konfigurowania dostosowań dla głównego trybu. auto-mode-alistPowinny być wykorzystane do określenia, kiedy uruchomieniem maszynopis-mode, i typescript-mode-hookpowinny być wykorzystane do uruchomienia tss-setup-current-buffer.
Jordon Biondo
Używanie (add-to-list 'auto-mode-alist '("\\.ts\\'" . typescript-mode))i (add-hook 'typescript-mode-hook 'tss-setup-current-buffer)byłoby normalnym sposobem na zrobienie tego.
Jordon Biondo