Bagaimana saya bisa mencegah mode flycheck memeriksa file tertentu?

9

Saya telah mengkonfigurasi Emacs untuk membuka file dengan nama *.cfgshell-script-mode. Ini adalah file konfigurasi, tentu saja, bukan skrip shell, tetapi 90% dari waktu melakukan apa yang saya inginkan (terutama, tebakan bagus tentang wajah untuk komentar dan tugas variabel). Saya menggunakan flycheck-mode , dan saya cukup menyukainya untuk global-flycheck-modemengaktifkannya. Masalahnya adalah, dalam kasus *.cfgfile, mode flycheck menunjukkan banyak kesalahan yang tidak relevan.

Apakah ada cara untuk menonaktifkan flycheck-mode secara otomatis berdasarkan nama file atau jalur ke file? Yang paling dekat yang pernah saya lihat adalah flycheck-before-syntax-check-hook ... Saya bisa membayangkan menempel pada tanda centang untuk path atau nama file, tetapi ia berjalan sebelum setiap sintaks memeriksa (daripada menonaktifkan pemeriksaan sepenuhnya).

Saint Aardvark the Carpeted
sumber

Jawaban:

10

Cara yang bagus

Cukup jangan gunakan Mode Sh untuk buffer yang tidak mengandung skrip shell. Tuliskan mode Anda sendiri sebagai gantinya. Ini adalah cara kanonik untuk menangani situasi seperti itu di Emacs.

Menulis mode utama khusus mudah. Anda cukup mewarisi dari Sh Mode untuk mendapatkan semua fitur dan perintahnya, sambil tetap memiliki mode independen. Cukup tambahkan yang berikut ke awal Anda init.elyang sederhana:

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

Karena mode baru ini independen dari Mode Sh, Flycheck tidak akan mencoba menggunakan checker sintaks untuk Mode Sh dalam mode baru ini.

Menggunakan mode terpisah juga memiliki kelebihan lain: Anda dapat mengatur ikatan kunci Anda sendiri, terlepas dari Mode Sh, atau memperluas penyorotan sintaksis secara khusus untuk gaya file konfigurasi ini.

Cara yang buruk

Sebagai peretasan cepat, Anda juga dapat menonaktifkan Flycheck lagi di file-file tersebut:

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

Namun, perhatikan bahwa berbicara sebagai pengelola Flycheck, saya akan merekomendasikan solusi ini. Menjadi warga negara Emacs yang baik, dan menulis mode Anda sendiri, sungguh.

lunaryorn
sumber
7

Anda dapat dengan mudah menonaktifkan checker menggunakan

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

Dokumentasi Flycheck menambahkan informasi lebih lanjut di sini .

Anda juga dapat menonaktifkan checker di lambda karena auto-mode-alisthanya menonaktifkannya di .cfgfile.

(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
sumber
1
Anda mungkin ingin setqpekerjaan dari nilai yang ada flycheck-disabled-checkers, seperti pada (setq flycheck-disabled-checkers (append '(sh-shellscript sh-bash sh-zsh) flycheck-disabled-checkers)). Dengan begitu, jika variabel diubah di tempat lain, Anda masih memiliki hal-hal lain di dalamnya.
zck
@zck Tidak ada nilai "ada" untuk variabel ini. Ini dimaksudkan untuk diatur secara lokal, baik setqdari hook, atau dengan variabel lokal.
lunaryorn