¿Cómo puedo evitar que el modo flycheck verifique ciertos archivos?

9

He configurado Emacs para abrir archivos nombrados *.cfgen modo shell-script. Estos son archivos de configuración, por supuesto, en lugar de scripts de shell, pero el 90% del tiempo hace lo que quiero (principalmente, buenas suposiciones sobre caras para comentarios y asignación de variables). Uso el modo flycheck , y me gusta lo suficiente como para global-flycheck-modehabilitarlo. El problema es que, en el caso de los *.cfgarchivos, el modo flycheck sugiere muchos errores que no son relevantes.

¿Hay alguna manera de deshabilitar el modo flycheck automáticamente según el nombre del archivo o la ruta del archivo? Lo más cercano que he visto es flycheck-before-syntax-check-hook ... Me imagino pegando un cheque por ruta o nombre de archivo, pero se ejecuta antes de cada verificación de sintaxis (en lugar de desactivar las verificaciones por completo).

San Aardvark el Alfombrado
fuente

Respuestas:

10

El buen camino

Simplemente no use el modo Sh para buffers que no contienen scripts de shell. Escribe tu propio modo en su lugar. Esta es la forma canónica de manejar tales situaciones en Emacs.

Escribir un modo mayor personalizado es fácil. Simplemente puede heredar del modo Sh para obtener todas sus funciones y comandos, sin dejar de tener un modo independiente. Simplemente agregue lo siguiente a su init.elpara un comienzo simple:

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

Dado que este nuevo modo es independiente del modo Sh, Flycheck no intentará usar verificadores de sintaxis para el modo Sh en este nuevo modo.

El uso de un modo separado también tiene otras ventajas: puede configurar sus propias combinaciones de teclas, independientemente del modo Sh, o extender el resaltado de sintaxis específicamente para este estilo de archivos de configuración.

El mal camino

Como truco rápido, también puede deshabilitar Flycheck nuevamente en dichos archivos:

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

Tenga en cuenta, sin embargo, que hablando como el mantenedor de Flycheck, recomendaría contra esta solución. Sé un buen ciudadano de Emacs y escribe tu propio modo, de verdad.

Lunaryorn
fuente
7

Puede deshabilitar fácilmente las fichas usando

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

La documentación de Flycheck agrega más información aquí .

También puede deshabilitar las fichas en una lambda para auto-mode-alistque solo se deshabilite en los .cfgarchivos.

(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
fuente
1
Es posible que desee tener el setqtrabajo fuera del valor existente de flycheck-disabled-checkers, como en (setq flycheck-disabled-checkers (append '(sh-shellscript sh-bash sh-zsh) flycheck-disabled-checkers)). De esa manera, si la variable se modifica en otro lugar, aún tendrá las otras cosas en ella.
zck
@zck No hay un valor "existente" para esta variable. Está destinado a establecerse localmente, ya sea setqdesde un gancho o con variables locales.
Lunaryorn