对 Flymake 和 Flyspell 使用一键

发布于 2024-08-14 06:18:21 字数 122 浏览 5 评论 0原文

我使用 Flymake 和 pyflakes 来检查我的 Python 代码,并使用 Flyspell 来检查我的字符串和注释。我想要有一个函数可以转到下一个错误,或者如果当前出现错误,则显示有关错误的信息。我该如何写这个函数呢?

I am using flymake with pyflakes to check my python code and flyspell to check my strings and comments. I want to have one function which will go to the next error, or will display information about the error if currently at an error. How would I write this function?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

黯然#的苍凉 2024-08-21 06:18:21

此代码提供的功能可将您跳转到下一个错误,如果是 Flymake 错误,则显示其信息,如果是 Flyspell 错误,它会为您纠正它。如果您不希望自动更正,请取消注释调用 'my-flyspell-message 的行,并删除调用 'flyspell-auto- Correct-word 的行之前的行 - 您只会收到一条有关单词拼写错误的消息。

第一行将其绑定到键绑定 Cc n。有关绑定键的更多信息,请参阅信息页 Key绑定

(global-set-key (kbd "C-c n") 'my-display-error-or-next-error)
(defun my-display-error-or-next-error ()
  "display information for current error, or go to next one"
  (interactive)
  (when (or (not (my-at-flymake-error))
            (not (my-at-flyspell-error)))
    ;; jump to error if not at one
    (my-goto-next-error))

  (cond ((my-at-flymake-error)
         ;; if at flymake error, display menu
         (flymake-display-err-menu-for-current-line))
        ((my-at-flyspell-error)
         ;; if at flyspell error, fix it
         (call-interactively 'flyspell-auto-correct-word)
         ;; or, uncomment the next line to just get a message
         ;; (my-flyspell-message)
         )))

(defun my-at-flyspell-error ()
  "return non-nill if at flyspell error"
  (some 'flyspell-overlay-p (overlays-at (point))))

(defun my-at-flymake-error ()
  "return non-nil if at flymake error"
  (let* ((line-no             (flymake-current-line-no))
         (line-err-info-list  (nth 0 (flymake-find-err-info flymake-err-info line-no))))
    line-err-info-list))

(defun my-goto-next-error ()
  "jump to next flyspell or flymake error"
  (interactive)
  (let* ((p (point))
         (spell-next-error-function '(lambda ()
                                 (forward-word) (forward-char)
                                 (flyspell-goto-next-error)))
         (spell-pos (save-excursion
                      (funcall spell-next-error-function)
                      (point)))
         (make-pos (save-excursion
                     (flymake-goto-next-error)
                     (point))))
    (cond ((or (and (< p make-pos) (< p spell-pos))
               (and (> p make-pos) (> p spell-pos)))
           (funcall (if (< make-pos spell-pos)
                        'flymake-goto-next-error
                      spell-next-error-function)))
          ((< p make-pos)
           (flymake-goto-next-error))

          ((< p spell-pos)
           (funcall spell-next-error-function)))))

(defun my-flyspell-message ()
  (interactive)
  (let ((word (thing-at-point 'word)))
    (set-text-properties 0 (length word) nil word)
    (message "Missspelled word: %s" word)))

This code provides functionality which jumps you to the next error, and if it's a flymake error, displays information for it, if it's a flyspell error, it corrects it for you. If you don't want the auto-correction, un-comment the line that calls 'my-flyspell-message and remove the line before that which calls 'flyspell-auto-correct-word - and you'll just get a message about the word being misspelled.

The first line binds this to the keybinding C-c n. For more information on binding keys, see the info page Key Bindings.

(global-set-key (kbd "C-c n") 'my-display-error-or-next-error)
(defun my-display-error-or-next-error ()
  "display information for current error, or go to next one"
  (interactive)
  (when (or (not (my-at-flymake-error))
            (not (my-at-flyspell-error)))
    ;; jump to error if not at one
    (my-goto-next-error))

  (cond ((my-at-flymake-error)
         ;; if at flymake error, display menu
         (flymake-display-err-menu-for-current-line))
        ((my-at-flyspell-error)
         ;; if at flyspell error, fix it
         (call-interactively 'flyspell-auto-correct-word)
         ;; or, uncomment the next line to just get a message
         ;; (my-flyspell-message)
         )))

(defun my-at-flyspell-error ()
  "return non-nill if at flyspell error"
  (some 'flyspell-overlay-p (overlays-at (point))))

(defun my-at-flymake-error ()
  "return non-nil if at flymake error"
  (let* ((line-no             (flymake-current-line-no))
         (line-err-info-list  (nth 0 (flymake-find-err-info flymake-err-info line-no))))
    line-err-info-list))

(defun my-goto-next-error ()
  "jump to next flyspell or flymake error"
  (interactive)
  (let* ((p (point))
         (spell-next-error-function '(lambda ()
                                 (forward-word) (forward-char)
                                 (flyspell-goto-next-error)))
         (spell-pos (save-excursion
                      (funcall spell-next-error-function)
                      (point)))
         (make-pos (save-excursion
                     (flymake-goto-next-error)
                     (point))))
    (cond ((or (and (< p make-pos) (< p spell-pos))
               (and (> p make-pos) (> p spell-pos)))
           (funcall (if (< make-pos spell-pos)
                        'flymake-goto-next-error
                      spell-next-error-function)))
          ((< p make-pos)
           (flymake-goto-next-error))

          ((< p spell-pos)
           (funcall spell-next-error-function)))))

(defun my-flyspell-message ()
  (interactive)
  (let ((word (thing-at-point 'word)))
    (set-text-properties 0 (length word) nil word)
    (message "Missspelled word: %s" word)))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文