mirror of
https://github.com/jimeh/.emacs.d.git
synced 2026-02-19 13:46:41 +00:00
feat(language/dockerfile): use dockerfile-ts-mode if available
Otherwise fall back to dockerfile-mode. This also acts as an experiment of how to go about using the new Emacs 29.x treesit backed modes if available. This is currently not that clean, but will do for now, and I'll keep experimenting with it.
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -30,6 +30,7 @@ sessions/*
|
||||
smex-items
|
||||
srecode-map.el
|
||||
tramp
|
||||
tree-sitter/*
|
||||
url/*
|
||||
var/*
|
||||
|
||||
|
||||
@@ -6,46 +6,65 @@
|
||||
|
||||
;;; Code:
|
||||
|
||||
(use-package dockerfile-mode
|
||||
:hook
|
||||
(dockerfile-mode . siren-dockerfile-mode-setup)
|
||||
(require 'siren-lsp)
|
||||
|
||||
:preface
|
||||
(defun siren-dockerfile-mode-setup ()
|
||||
(with-eval-after-load 'flycheck
|
||||
(flycheck-select-checker 'hadolint))
|
||||
(lsp-deferred)
|
||||
(lsp-format-buffer-on-save-mode +1))
|
||||
(if (fboundp 'dockerfile-ts-mode)
|
||||
;; Use built-in treesit support if available.
|
||||
(use-package dockerfile-ts-mode
|
||||
:straight (:type built-in)
|
||||
:mode
|
||||
"[/\\]\\(?:Containerfile\\|Dockerfile\\)\\(?:\\.[^/\\]*\\)?\\'"
|
||||
"\\.dockerfile\\'"
|
||||
:hook
|
||||
(dockerfile-ts-mode . siren-dockerfile-mode-setup)
|
||||
|
||||
:init
|
||||
(with-eval-after-load 'flycheck
|
||||
;; Define fixed Hadolint checker, built-in checker expects lines to start
|
||||
;; with "<filename>:", but when input is provided via STDIN, the each line
|
||||
;; starts with "-:".
|
||||
(flycheck-define-checker hadolint
|
||||
"A Dockerfile syntax checker using the hadolint.
|
||||
:init
|
||||
(require 'siren-treesit)
|
||||
(siren-treesit-prepare
|
||||
'dockerfile-ts-mode
|
||||
'(dockerfile "https://github.com/camdencheek/tree-sitter-dockerfile")))
|
||||
|
||||
;; Otherwise, fallback to regular dockerfile-mode.
|
||||
(use-package dockerfile-mode
|
||||
:hook
|
||||
(dockerfile-mode . siren-dockerfile-mode-setup)))
|
||||
|
||||
(defun siren-dockerfile-mode-setup ()
|
||||
"Shared setup for both `dockerfile-mode' and `dockerfile-ts-mode'."
|
||||
(lsp)
|
||||
(lsp-format-buffer-on-save-mode +1)
|
||||
(when (fboundp 'flycheck-select-checker)
|
||||
(flycheck-select-checker 'hadolint)
|
||||
(flycheck-add-next-checker 'hadolint 'lsp)))
|
||||
|
||||
;; Define fixed Hadolint checker, built-in checker expects lines to start
|
||||
;; with "<filename>:", but when input is provided via STDIN, the each line
|
||||
;; starts with "-:".
|
||||
(with-eval-after-load 'flycheck
|
||||
(flycheck-define-checker hadolint
|
||||
"A Dockerfile syntax checker using the hadolint.
|
||||
|
||||
See URL `http://github.com/hadolint/hadolint/'."
|
||||
:command ("hadolint" "--no-color" "-")
|
||||
:standard-input t
|
||||
:error-patterns
|
||||
((error line-start
|
||||
"-:" line " " (id (one-or-more alnum)) " error: " (message)
|
||||
line-end)
|
||||
(warning line-start
|
||||
"-:" line " " (id (one-or-more alnum))
|
||||
" warning: " (message) line-end)
|
||||
(info line-start
|
||||
"-:" line " " (id (one-or-more alnum)) " info: " (message)
|
||||
line-end)
|
||||
(error line-start
|
||||
"-:" line ":" column " " (message)
|
||||
line-end))
|
||||
:error-filter
|
||||
(lambda (errors)
|
||||
(flycheck-sanitize-errors
|
||||
(flycheck-remove-error-file-names "/dev/stdin" errors)))
|
||||
:modes dockerfile-mode)))
|
||||
:command ("hadolint" "--no-color" "-")
|
||||
:standard-input t
|
||||
:error-patterns
|
||||
((error line-start
|
||||
"-:" line " " (id (one-or-more alnum)) " error: " (message)
|
||||
line-end)
|
||||
(warning line-start
|
||||
"-:" line " " (id (one-or-more alnum))
|
||||
" warning: " (message) line-end)
|
||||
(info line-start
|
||||
"-:" line " " (id (one-or-more alnum)) " info: " (message)
|
||||
line-end)
|
||||
(error line-start
|
||||
"-:" line ":" column " " (message)
|
||||
line-end))
|
||||
:error-filter
|
||||
(lambda (errors)
|
||||
(flycheck-sanitize-errors
|
||||
(flycheck-remove-error-file-names "/dev/stdin" errors)))
|
||||
:modes (dockerfile-mode dockerfile-ts-mode)))
|
||||
|
||||
(provide 'siren-dockerfile)
|
||||
;;; siren-dockerfile.el ends here
|
||||
|
||||
Reference in New Issue
Block a user