Führen Sie den Befehl aus, wenn Sie eine Datei eines bestimmten Dateityps öffnen

14

Ich versuche, ein LISP-Skript zum Ausführen einiger Befehle für mich zu erstellen, wenn ich eine Datei eines bestimmten Dateityps öffne. Ich weiß, dass ich in der richtigen Init-Datei arbeite, denn wenn ich das Theme von ihr entferne, hat Emacs beim Start kein Theme.

Dies ist das Skript, das ich verwende und das nicht funktioniert (keine Fehler oder irgendetwas):

(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
quelle
In diesem Zusammenhang bedeutet "Laden" "Laden als Lisp-Code". Ich denke, Sie möchten stattdessen den Dateisuch-Hook (beachten Sie, dass diese nicht mit einem Argument aufgerufen werden! Verwenden Sie stattdessen den Namen der Pufferdatei). Sie können auch gerne die Auto-Modus-Liste verwenden und Ihren eigenen Hauptmodus definieren.
YoungFrog
3
Eigentlich sieht es so aus, als ob Sie einen Modus-Hook möchten.
Dan
Sie haben das Problem noch nicht behoben, da Ihre Funktion nicht ausgeführt wird. Wenn Sie jedoch wissen, dass die oben genannten Informationen ungültig sind, ist lisp ungültig. Der Text Ihres whenAnrufs ist fehlerhaft. Die beiden Funktionsaufrufe können nicht in Klammern eingeschlossen werden. Beachten Sie den Unterschied zwischen Ihrem Code und @ sds
Jordon Biondo

Antworten:

16

In der Emacs-Terminologie sind dies zwei verschiedene Schritte:

  • Ordnen Sie Dateien mit der .tsErweiterung dem Hauptmodus zu typescript-mode .
  • Führen Sie die Funktion aus, tss-setup-current-bufferwenn der Typescript-Modus gestartet wird.

So wählen Sie die wichtigsten Modus verwenden für bestimmte Dateinamen, fügen Sie einen Eintrag in die Variable auto-mode-alist. Fügen Sie die folgende Zeile in Ihre Init-Datei ein:

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

\.ts\'ist ein regulärer Ausdruck, der Dateinamen mit der .tsErweiterung übereinstimmt .

Um die Funktion tss-setup-current-bufferimmer dann auszuführen, wenn der Typescript-Modus gestartet wird (ich gehe davon aus, dass Sie sie auch für Dateien im Typescript-Modus ausführen möchten, die nicht die .tsErweiterung haben), fügen Sie sie dem Start- Hook des Typescript-Modus hinzu .

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

Abhängig davon, wie Sie typescript.elund installiert haben tss.el, müssen Sie möglicherweise auch deklarieren, dass die Funktionen typescript-modeund tss-setup-current-bufferaus diesen Dateien geladen werden müssen. Dies vermeidet das Laden typescript.elund tss.elsobald Emacs startet: Sie werden bei Bedarf geladen, wenn Sie eine .tsDatei zum ersten Mal öffnen oder typescript-modeexplizit ausführen .

(autoload 'typescript-mode "Major mode for typescript files" t)
(autoload 'tss-setup-current-buffer "Set up the current file for TSS" t)
Gilles 'SO - hör auf böse zu sein'
quelle
9

Was Sie suchen, ist 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
quelle
4
Während dies funktioniert, sollte darauf hingewiesen werden, dass dies nicht der richtige Weg ist, um Hauptmodi beim Suchen einer Datei zu starten oder Anpassungen für den Hauptmodus einzurichten. Das auto-mode-alistsollte verwendet werden, um zu bestimmen, wann der Typenskript-Modus gestartet werden soll, und a typescript-mode-hooksollte zum Ausführen verwendet werden tss-setup-current-buffer.
Jordon Biondo
Verwenden (add-to-list 'auto-mode-alist '("\\.ts\\'" . typescript-mode))und (add-hook 'typescript-mode-hook 'tss-setup-current-buffer)wäre der normale Weg, dies zu tun.
Jordon Biondo