Como posso impedir que o modo flycheck verifique certos arquivos?

9

Eu configurei o Emacs para abrir arquivos nomeados *.cfgno modo de script de shell. Esses são arquivos de configuração, é claro, em vez de scripts de shell, mas 90% do tempo ele faz o que eu quero (principalmente, boas suposições sobre rostos para comentários e atribuição de variáveis). Eu uso o modo flycheck e gosto o suficiente para ter global-flycheck-modeativado. O problema é que, no caso de *.cfgarquivos, o modo flycheck sugere muitos erros que não são relevantes.

Existe uma maneira de desativar o modo de verificação automática automaticamente, com base no nome do arquivo ou no caminho para o arquivo? O mais próximo que eu vi é flycheck-before-syntax-check-hook ... Eu poderia imaginar fazer uma verificação de caminho ou nome de arquivo, mas é executado antes de cada verificação de sintaxe (em vez de desabilitar as verificações completamente).

Saint Aardvark, o Carpete
fonte

Respostas:

10

O bom caminho

Simplesmente não use o Sh Mode para buffers que não contêm scripts de shell. Escreva seu próprio modo. Esta é a maneira canônica de lidar com essas situações no Emacs.

Escrever um modo principal personalizado é fácil. Você pode simplesmente herdar do Modo Sh para obter todos os seus recursos e comandos, mantendo um modo independente. Basta adicionar o seguinte ao seu init.elpara um começo simples:

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

Como esse novo modo é independente do Modo Sh, o Flycheck não tentará usar os verificadores de sintaxe para o Modo Sh nesse novo modo.

O uso de um modo separado também possui outras vantagens: Você pode configurar suas próprias combinações de teclas, independentemente do Modo Sh, ou estender o realce da sintaxe especificamente para esse estilo de arquivos de configuração.

O mau caminho

Como um hack rápido, você também pode simplesmente desativar o Flycheck novamente nesses arquivos:

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

Observe, porém, que falando como mantenedor do Flycheck, eu recomendaria contra essa solução. Seja um bom cidadão do Emacs e escreva seu próprio modo, realmente.

lunaryorn
fonte
7

Você pode desativar facilmente as damas usando

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

A documentação do Flycheck adiciona mais informações aqui .

Você também pode desativar os verificadores em um lambda para auto-mode-alistdesativá-lo apenas nos .cfgarquivos.

(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
fonte
1
Você pode querer ter o setqtrabalho fora do valor existente de flycheck-disabled-checkers, como em (setq flycheck-disabled-checkers (append '(sh-shellscript sh-bash sh-zsh) flycheck-disabled-checkers)). Dessa forma, se a variável for modificada em outro lugar, você ainda terá as outras coisas.
Zck
@zck Não existe um valor "existente" para esta variável. Ele deve ser definido localmente, com setqum gancho ou com variáveis ​​locais.
Lunardorn 24/10/2014