Wie kann ich verhindern, dass der Flycheck-Modus bestimmte Dateien überprüft?

9

Ich habe Emacs so konfiguriert, dass Dateien mit dem Namen *.cfgim Shell-Script-Modus geöffnet werden . Dies sind natürlich eher Konfigurationsdateien als Shell-Skripte, aber in 90% der Fälle macht es das, was ich will (hauptsächlich gute Vermutungen über Gesichter für Kommentare und Variablenzuweisungen). Ich benutze den Flycheck-Modus und es gefällt mir genug, um ihn global-flycheck-modeaktiviert zu haben . Das Problem ist, dass im Fall von *.cfgDateien der Flycheck-Modus viele Fehler vorschlägt, die nicht relevant sind.

Gibt es eine Möglichkeit, den Flycheck-Modus automatisch basierend auf dem Dateinamen oder dem Pfad zur Datei zu deaktivieren? Das nächste, was ich gesehen habe, ist flycheck-before-syntax-check-hook ... Ich könnte mir vorstellen, eine Prüfung auf Pfad oder Dateinamen durchzuführen, aber sie wird vor jeder Syntaxprüfung ausgeführt (anstatt die Prüfungen vollständig zu deaktivieren).

Heiliger Erdferkel der Teppich
quelle

Antworten:

10

Der gute Weg

Verwenden Sie den Sh-Modus einfach nicht für Puffer, die keine Shell-Skripte enthalten. Schreiben Sie stattdessen Ihren eigenen Modus. Dies ist die kanonische Methode , um mit solchen Situationen in Emacs umzugehen.

Das Schreiben eines benutzerdefinierten Hauptmodus ist einfach. Sie können einfach vom Sh-Modus erben, um alle Funktionen und Befehle abzurufen, während Sie dennoch über einen unabhängigen Modus verfügen. Fügen Sie init.elfür einen einfachen Start einfach Folgendes hinzu :

(define-derived-mode my-cfg-mode sh-mode "My CFg Mode"
  "A mode for my CFg files."
  (sh-set-shell "bash"))

(add-to-list 'auto-mode-alist '("\\.cfg\\'" . my-cfg-mode))

Da dieser neue Modus unabhängig vom Sh-Modus ist, versucht Flycheck in diesem neuen Modus nicht, Syntaxprüfer für den Sh-Modus zu verwenden.

Die Verwendung eines separaten Modus bietet noch weitere Vorteile: Sie können unabhängig vom Sh-Modus eigene Tastenkombinationen einrichten oder die Syntaxhervorhebung speziell für diesen Stil von Konfigurationsdateien erweitern.

Der schlechte Weg

Als schnellen Hack können Sie Flycheck in solchen Dateien auch einfach wieder deaktivieren:

(add-hook 'flycheck-mode-hook #'my-keep-flycheck-off)

(defun my-keep-flycheck-off ()
  (when (and (eq major-mode 'sh-mode)
             (buffer-file-name)
             (string= (file-name-extension (buffer-file-name)) "cfg"))
    (flycheck-mode -1)))

Beachten Sie jedoch, dass ich als Flycheck-Betreuer von dieser Lösung abraten würde. Sei ein guter Emacs-Bürger und schreibe wirklich deinen eigenen Modus.

Mondhorn
quelle
7

Sie können Prüfer einfach mit deaktivieren

(setq flycheck-disabled-checkers '(sh-shellscript sh-bash sh-zsh))

In der Flycheck-Dokumentation finden Sie hier weitere Informationen .

Sie können Checker in einem Lambda auch deaktivieren auto-mode-alist, damit es nur für .cfgDateien deaktiviert wird .

(add-to-list 'auto-mode-alist
             '("\\.cfg\\'" . (lambda ()
                               (setq flycheck-disabled-checkers  (append '(sh-shellscript sh-bash sh-zsh) flycheck-disabled-checkers))
                               (shell-script-mode))))
Gambo
quelle
1
Möglicherweise möchten Sie, dass die setqArbeit vom vorhandenen Wert von flycheck-disabled-checkerswie in abweicht (setq flycheck-disabled-checkers (append '(sh-shellscript sh-bash sh-zsh) flycheck-disabled-checkers)). Auf diese Weise haben Sie, wenn die Variable an anderer Stelle geändert wird, immer noch die anderen Dinge darin.
Zck
@zck Für diese Variable gibt es keinen "vorhandenen" Wert. Es soll lokal festgelegt werden, entweder mit setqeinem Hook oder mit lokalen Variablen.
Mondhorn