| @@ -860,6 +860,12 @@ found, otherwise returns nil." | |||||
| (when (derived-mode-p 'makefile-mode) | (when (derived-mode-p 'makefile-mode) | ||||
| (puthash 'indent_style "tab" props)))) | (puthash 'indent_style "tab" props)))) | ||||
| (when (fboundp 'editorconfig-auto-apply-enable) | |||||
| (add-hook 'editorconfig-conf-mode-hook | |||||
| 'editorconfig-auto-apply-enable)) | |||||
| ;; (when (fboundp 'editorconfig-charset-extras) | ;; (when (fboundp 'editorconfig-charset-extras) | ||||
| ;; (add-hook 'editorconfig-custom-hooks | ;; (add-hook 'editorconfig-custom-hooks | ||||
| ;; 'editorconfig-charset-extras)) | ;; 'editorconfig-charset-extras)) | ||||
| @@ -1132,6 +1138,13 @@ found, otherwise returns nil." | |||||
| (when (safe-require-or-eval 'flycheck) | (when (safe-require-or-eval 'flycheck) | ||||
| (call-after-init (global-flycheck-mode))) | (call-after-init (global-flycheck-mode))) | ||||
| (with-eval-after-load 'flycheck | |||||
| (when (fboundp 'flycheck-black-check-setup) | |||||
| (flycheck-black-check-setup))) | |||||
| (set-variable 'flycheck-python-mypy-ini | |||||
| ".mypy.ini") | |||||
| (when (autoload-eval-lazily 'ilookup) | (when (autoload-eval-lazily 'ilookup) | ||||
| (define-key ctl-x-map "d" 'ilookup-open-word)) | (define-key ctl-x-map "d" 'ilookup-open-word)) | ||||
| @@ -2005,149 +2018,7 @@ and search from projectile root (if projectile is available)." | |||||
| (define-key ctl-x-map "T" 'git-worktree) | (define-key ctl-x-map "T" 'git-worktree) | ||||
| (define-key ctl-x-map "W" 'git-walktree) | (define-key ctl-x-map "W" 'git-walktree) | ||||
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |||||
| ;; editorconfig-auto-apply | |||||
| (define-minor-mode editorconfig-auto-apply-mode | |||||
| "When saving .editorconfig file update buffer configs." | |||||
| :lighter " ECAA" | |||||
| (if editorconfig-auto-apply-mode | |||||
| (add-hook 'after-save-hook | |||||
| 'editorconfig-auto-apply-mode--run nil t) | |||||
| (remove-hook 'after-save-hook | |||||
| 'editorconfig-auto-apply-mode--run t))) | |||||
| (defun editorconfig-auto-apply-enable () | |||||
| "Turn on `editorconfig-auto-apply-mode'." | |||||
| (unless editorconfig-auto-apply-mode | |||||
| (editorconfig-auto-apply-mode 1))) | |||||
| (defun editorconfig-auto-apply-disable () | |||||
| "Turn off `editorconfig-auto-apply-mode'." | |||||
| (when editorconfig-auto-apply-mode | |||||
| (editorconfig-auto-apply-mode -1))) | |||||
| (defun editorconfig-auto-apply-mode--run () | |||||
| "When saving .editorconfig file walk all buffers and update configs." | |||||
| (when (eq major-mode | |||||
| 'editorconfig-conf-mode) | |||||
| (let ((dir (file-name-directory buffer-file-name))) | |||||
| (cl-dolist (buf (buffer-list)) | |||||
| (when (and (buffer-file-name buf) | |||||
| (file-in-directory-p (buffer-file-name buf) | |||||
| dir)) | |||||
| (with-current-buffer buf | |||||
| (editorconfig-mode-apply))))))) | |||||
| (add-hook 'editorconfig-conf-mode-hook | |||||
| 'editorconfig-auto-apply-enable) | |||||
| ;;;;;;;;;;;;;;;; | |||||
| ;; flychcek-black | |||||
| ;; TODO: Move to https://github.com/10sr/flycheck-black-check | |||||
| (require 'flycheck nil t) | |||||
| (flycheck-define-checker python-black-check | |||||
| "A Python style checker." | |||||
| :command ("python3" "-m" "black" | |||||
| "--check" | |||||
| (config-file "--config" flycheck-black) | |||||
| source) | |||||
| :error-parser flycheck-parse-black-check | |||||
| ;; :error-patterns | |||||
| ;; ( | |||||
| ;; (error line-start "error: cannot format " (file-name) ": " (message) ": " line ":" column ": " (one-or-more any) line-end) | |||||
| ;; (error line-start (message) " " (file-name) line-end) | |||||
| ;; ) | |||||
| :enabled (lambda () | |||||
| (or (not (flycheck-python-needs-module-p 'python-black-check)) | |||||
| (flycheck-python-find-module 'python-black-check "black"))) | |||||
| :verify (lambda (_) (flycheck-python-verify-module 'python-black-check "black")) | |||||
| :modes python-mode) | |||||
| ;; (flycheck-define-checker python-black-diff | |||||
| ;; "A Python style checker." | |||||
| ;; :command ("python3" | |||||
| ;; "-m" "black" | |||||
| ;; (config-file "--config" flycheck-black) | |||||
| ;; "--diff" source) | |||||
| ;; :error-parser my-flycheck-parse-unified-diff | |||||
| ;; :enabled (lambda () | |||||
| ;; (or (not (flycheck-python-needs-module-p 'python-black)) | |||||
| ;; (flycheck-python-find-module 'python-black "black"))) | |||||
| ;; :verify (lambda (_) (flycheck-python-verify-module 'python-black "black")) | |||||
| ;; :modes python-mode) | |||||
| (flycheck-def-config-file-var flycheck-black python-black-check "pyproject.toml" | |||||
| :safe #'stringp) | |||||
| (add-to-list 'flycheck-checkers | |||||
| 'python-black-check) | |||||
| (defun flycheck-parse-black-check (output checker buffer) | |||||
| "Flycheck parser to check if reformat is required." | |||||
| (let ((result nil)) | |||||
| (with-temp-buffer | |||||
| (insert output) | |||||
| (save-match-data | |||||
| (goto-char (point-min)) | |||||
| (when (re-search-forward "^would reformat .*$" nil t) | |||||
| (add-to-list 'result (flycheck-error-new-at | |||||
| (point-min) | |||||
| nil | |||||
| 'error | |||||
| ;;(format "Black: %s" (match-string 0)) | |||||
| "Black: would reformat" | |||||
| :buffer buffer | |||||
| :checker checker))) | |||||
| (goto-char (point-min)) | |||||
| (when (re-search-forward "^error: .*$" nil t) | |||||
| (add-to-list 'result (flycheck-error-new-at | |||||
| (point-min) | |||||
| nil | |||||
| 'error | |||||
| ;; Fix not to include absolute file path | |||||
| (format "Black: %s" (match-string 0)) | |||||
| :buffer buffer | |||||
| :checker checker))))) | |||||
| result)) | |||||
| (defun my-flycheck-parse-unified-diff (output checker buffer) | |||||
| "Flycheck parser to parse diff output." | |||||
| (let ((source-line 0) | |||||
| (result ()) | |||||
| (hunk "HUNK")) | |||||
| (with-temp-buffer | |||||
| (insert output) | |||||
| (goto-char (point-min)) | |||||
| (while (not (eq (point) (point-max))) | |||||
| ;; FIXME: Do not stop when no result | |||||
| (while (not (re-search-forward "^@@ -\\([0-9]+\\),\\([0-9]+\\) \\+\\([0-9]+\\),\\([0-9]+\\) @@.*$" (point-at-eol) t)) | |||||
| (forward-line 1) | |||||
| (goto-char (point-at-bol))) | |||||
| (setq source-line | |||||
| (string-to-number (match-string 1))) | |||||
| ;; TODO: Add filename support | |||||
| (setq hunk | |||||
| (match-string 0)) | |||||
| ;;(while (not (rearch-forward "^\\(-\\|\\+\\)"))) | |||||
| ) | |||||
| (add-to-list 'result | |||||
| (flycheck-error-new-at | |||||
| 0 | |||||
| nil | |||||
| 'error | |||||
| "MESSAGE" | |||||
| :buffer buffer | |||||
| :checker checker | |||||
| :group hunk))) | |||||
| result)) | |||||
| (set-variable 'flycheck-python-mypy-ini | |||||
| ".mypy.ini") | |||||
| ;;;;;;;;;;;;;;;;;;; | ;;;;;;;;;;;;;;;;;;; | ||||