📄 mlint.el
字号:
(defclass mlint-lm-entry-isstr (mlint-lm-replace-focus) ((new-text :initform "ischar")) "Replace isstr with ischar.")(defclass mlint-lm-entry-setstr (mlint-lm-replace-focus) ((new-text :initform "char")) "Replace setstr with char.")(defclass mlint-lm-entry-logicals (mlint-lm-entry) ((fixable-p :initform t) (fix-description :initform "perform a replacement.") ) "Specialized logical and/or class.")(defmethod mlint-fix-entry ((ent mlint-lm-entry-logicals)) "Replace the single logical with double logical." (save-excursion (goto-line (oref ent line)) (let* ((s (progn (move-to-column (1- (oref ent column))) (point))) (e (progn (move-to-column (oref ent column-end)) (point))) (txt (buffer-substring-no-properties s e))) (goto-char s) ;; All of these are replacing single logicals with double. (insert txt))) )(defclass mlint-lm-entry-unused-argument (mlint-lm-entry) ((fixable-p :initform t) (fix-description :initform "remove this argument.") ) "Specialized logical and/or class.")(defmethod mlint-fix-entry ((ent mlint-lm-entry-unused-argument)) "Remove the arguments." (save-excursion (goto-line (oref ent line)) (let* ((s (progn (move-to-column (1- (oref ent column))) (point))) (e (progn (move-to-column (oref ent column-end)) (point))) ) (goto-char s) (if (not (looking-at "(\\|,")) (forward-char -1)) (delete-region (point) e) )) )(defclass mlint-lm-quiet (mlint-lm-entry) ((fixable-p :initform t) (fix-description :initform "Make sure this line prints no values.") ) "Specialized logical and/or class.")(defmethod mlint-fix-entry ((ent mlint-lm-quiet)) "Add semi-colon to end of this line." (save-excursion (matlab-end-of-command) (insert ";")) )(defclass mlint-lm-eval->trycatch (mlint-lm-entry) ((fixable-p :initform t) (fix-description :initform "Replace EVAL call with TRY/CATCH.") ) "EVAL 2 arg form. Transform into try/catch.")(defun mlint-destringafy () "Move forward over one string, removing string notations." (unless (looking-at "'") (error "Not looking at a string")) (forward-char -1) (let ((s (1+ (point))) (e (save-excursion (matlab-font-lock-string-match-normal (point-at-eol)) (point)))) (goto-char e) (delete-char -1) (save-excursion (goto-char s) (delete-char 1)) (save-excursion (save-restriction (narrow-to-region s (point)) (goto-char (point-min)) (while (re-search-forward "''" nil t) (replace-match "'"))))))(defmethod mlint-fix-entry ((ent mlint-lm-eval->trycatch)) "Add semi-colon to end of this line." (save-excursion (goto-line (oref ent line)) (move-to-column (1- (oref ent column))) ;; (forward-word -1) (delete-region (point) (save-excursion (forward-word 1) (point))) (delete-horizontal-space) (delete-char 1) (insert "try") (matlab-indent-line) (matlab-return) (mlint-destringafy) (looking-at "\\s-*,\\s-*") (delete-region (match-beginning 0) (match-end 0)) (matlab-return) (insert "catch") (matlab-return) (mlint-destringafy) (kill-line 1) (matlab-return) (insert "end ") (matlab-return) (forward-line -1) (end-of-line) (delete-horizontal-space) ) );;; User functions;;(defun mlint-highlight (err) "Setup ERR, an mlint message to be marked." (linemark-add-entry mlint-mark-group :line (nth 0 err) :column (car (nth 1 err)) :column-end (cdr (nth 1 err)) :warning (nth 2 err) :warningcode (cdr (assoc (nth 3 err) mlint-warningcode-alist)) :warningid (intern (nth 4 err)) ))(defun mlint-unhighlight-all () "Unhighlight all existing mlint messages." (interactive) (mapcar (lambda (e) (if (string= (oref e filename) (buffer-file-name)) (linemark-delete e))) (oref mlint-mark-group marks)))(defun mlint-buffer () "Run mlint on the current buffer, and highlight problems." (interactive) (when (buffer-file-name) (let ((errs (mlint-run)) ) (mlint-unhighlight-all) (while errs (mlint-highlight (car errs)) (setq errs (cdr errs))))))(defun mlint-next-buffer () "Move to the next warning in this buffer." (interactive) (let ((n (linemark-next-in-buffer mlint-mark-group 1 t))) (if n (progn (goto-line (oref n line)) (message (oref n warning))) (ding))))(defun mlint-prev-buffer () "Move to the prev warning in this buffer." (interactive) (let ((n (linemark-next-in-buffer mlint-mark-group -1 t))) (if n (progn (goto-line (oref n line)) (message (oref n warning))) (ding))))(defun mlint-next-buffer-new () "Move to the next new warning in this buffer." (interactive) (let ((p (linemark-at-point (point) mlint-mark-group)) (n (linemark-next-in-buffer mlint-mark-group 1 t))) ;; Skip over messages that are the same as the one under point. (save-excursion (while (and n p (not (eq n p)) (string= (oref p warning) (oref n warning))) (goto-line (oref n line)) (setq n (linemark-next-in-buffer mlint-mark-group 1 t)))) (if n (progn (goto-line (oref n line)) (message (oref n warning))) (ding))))(defun mlint-prev-buffer-new () "Move to the prev new warning in this buffer." (interactive) (let ((p (linemark-at-point (point) mlint-mark-group)) (n (linemark-next-in-buffer mlint-mark-group -1 t))) ;; Skip over messages that are the same as the one under point. (save-excursion (while (and n p (not (eq n p)) (string= (oref p warning) (oref n warning))) (goto-line (oref n line)) (setq n (linemark-next-in-buffer mlint-mark-group -1 t)))) (if n (progn (goto-line (oref n line)) (message (oref n warning))) (ding))))(defun mlint-show-warning () "Show the warning for the current mark." (interactive) (let ((n (linemark-at-point (point) mlint-mark-group))) (if (not n) (message "No warning at point.") (message (oref n warning)))))(defun mlint-fix-warning () "Show the warning for the current mark." (interactive) (let ((n (linemark-at-point (point) mlint-mark-group))) (if (not n) (message "No warning at point.") (if (not (mlint-is-fixable n)) (message "No method for fixing this warning.") (mlint-fix-entry n)))))(defun mlint-mark-ok () "Mark this line as MLint Ok." (interactive) (let ((n (linemark-at-point (point) mlint-mark-group))) (if (not n) (message "No warning at point.") (end-of-line) (insert " %#ok"))) );;; Define an mlinting minor mode;;(defvar mlint-minor-mode-map (let ((map (make-sparse-keymap))) (define-key map "\C-c,n" 'mlint-next-buffer) (define-key map "\C-c,p" 'mlint-prev-buffer) (define-key map "\C-c,N" 'mlint-next-buffer-new) (define-key map "\C-c,P" 'mlint-prev-buffer-new) (define-key map "\C-c,g" 'mlint-buffer) (define-key map "\C-c,c" 'mlint-unhighlight-all) (define-key map "\C-c, " 'mlint-show-warning) (define-key map "\C-c,f" 'mlint-fix-warning) (define-key map "\C-c,o" 'mlint-mark-ok) map) "Minor mode keymap used when mlinting a buffer.")(easy-menu-define mlint-minor-menu mlint-minor-mode-map "Mlint Minor Mode Menu" '("Mlint" ["Get MLint Warnings" mlint-buffer t] ["Clear MLint Warnings" mlint-unhighlight-all t] ["Show Warning" mlint-show-warning (linemark-at-point (point) mlint-mark-group)] ["Auto Fix Warning" mlint-fix-warning (let ((w (linemark-at-point (point) mlint-mark-group))) (and mlint-scan-for-fixes-flag w (mlint-is-fixable w))) ] ["Enable Auto-fix scanning" (setq mlint-scan-for-fixes-flag (not mlint-scan-for-fixes-flag)) :style toggle :selected mlint-scan-for-fixes-flag ] ["This is Ok" mlint-mark-ok (linemark-at-point (point) mlint-mark-group) ] "--" ["Next Warning" mlint-next-buffer t] ["Previous Warning" mlint-prev-buffer t] ["Next New Warning" mlint-next-buffer-new t] ["Previous New Warning" mlint-prev-buffer-new t] ))(defvar mlint-overlay-map (let ((map (make-sparse-keymap ))) (define-key map [down-mouse-3] 'mlint-emacs-popup-kludge) (define-key map [(meta n)] 'mlint-next-buffer) (define-key map [(meta p)] 'mlint-prev-buffer) (define-key map [(control meta n)] 'mlint-next-buffer-new) (define-key map [(control meta p)] 'mlint-prev-buffer-new) (set-keymap-parent map matlab-mode-map) map) "Map used in overlays marking mlint warnings.")(defun mlint-emacs-popup-kludge (e) "Pop up a menu related to the clicked on item.Must be bound to event E." (interactive "e") (let ((repos nil) (ipos nil) (startpos (point)) ) (save-excursion (mouse-set-point e) (setq ipos (point)) (popup-menu mlint-minor-menu) (if (/= (point) ipos) (setq repos (point))) ) (when repos (goto-char repos))))(easy-mmode-define-minor-mode mlint-minor-mode "Toggle mlint minor mode, a mode for showing mlint errors.With prefix ARG, turn mlint minor mode on iff ARG is positive.\\{mlint-minor-mode-map\\}" nil " lint" mlint-minor-mode-map (if (and mlint-minor-mode (not (eq major-mode 'matlab-mode))) (progn (mlint-minor-mode -1) (error "Mlint minor mode is only for MATLAB Major mode."))) (if (not mlint-minor-mode) (progn ;; We are linting, so don't verify on save. (make-variable-buffer-local 'matlab-verify-on-save-flag) (setq matlab-verify-on-save-flag nil) (mlint-unhighlight-all) (remove-hook 'after-save-hook 'mlint-buffer t) ) (add-hook 'after-save-hook 'mlint-buffer nil t) (mlint-buffer)) )(defvar mlint-minor-mode-was-enabled-before nil "Non nil if mlint is off, and it was auto-disabled.")(make-variable-buffer-local 'mlint-minor-mode-was-enabled-before)(defun mlint-ediff-metabuffer-setup-hook () "Hook run when EDiff is about to do stuff to a buffer.That buffer will be current." (when (and (eq major-mode 'matlab-mode) mlint-minor-mode) (setq mlint-minor-mode-was-enabled-before mlint-minor-mode) (mlint-minor-mode -1) ))(add-hook 'ediff-prepare-buffer-hook 'mlint-ediff-metabuffer-setup-hook)(defun mlint-ediff-cleanup-hook () "Re-enable mlint for buffers being ediffed." (mapcar (lambda (b) (when (save-excursion (set-buffer b) (and (eq major-mode 'matlab-mode) mlint-minor-mode-was-enabled-before)) (save-excursion (set-buffer b) (mlint-minor-mode 1)))) (buffer-list)))(add-hook 'ediff-cleanup-hook 'mlint-ediff-cleanup-hook)(provide 'mlint);;; mlint.el ends
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -