flycheckの「次/前のエラーにジャンプ」して循環する


7

少なくともflycheckで使用している場合は、Mg nとMg pを循環させてください。この機能はサポートされていないので(https://github.com/flycheck/flycheck/issues/64で言及され、チャットで確認されているように)カスタム関数を書く必要がありますが、私はElisp noobです。

他の理由(https://github.com/commercialhaskell/intero/issues/268flycheck-modeを回避する)のために、バイパスnext-errorしてflycheck-next-error直接呼び出します。私はめったに使用しないので、サイクリングではなく通常のコンパイルモードで生活できます(ただし、コンパイルモードの使用を開始した場合、これはおそらく迷惑になります)。

回答:


2

flycheckの内部情報condition-case、アドバイス、universal-argumentおよび内部について学んだ後、これが(noobとして)思いついたものです。私は通常、自分がやっていることの手掛かりがほとんどないコードを記述しないので、より良い答えを歓迎します。

コメントアウトされたロギングは、これが完了したとは思わないため、このコードの実行をトレースしたい人のために残されています。

最後に、これはrawに対しては何も行いませんnext-error。flycheckが呼び出されたときにのみ呼び出されます。

;; Optional: ensure flycheck cycles, both when going backward and forward.
;; Tries to handle arguments correctly.
;; Since flycheck-previous-error is written in terms of flycheck-next-error,
;; advising the latter is enough.
(defun flycheck-next-error-loop-advice (orig-fun &optional n reset)
  ; (message "flycheck-next-error called with args %S %S" n reset)
  (condition-case err
      (apply orig-fun (list n reset))
    ((user-error)
     (let ((error-count (length flycheck-current-errors)))
       (if (and
            (> error-count 0)                   ; There are errors so we can cycle.
            (equal (error-message-string err) "No more Flycheck errors"))
           ;; We need to cycle.
           (let* ((req-n (if (numberp n) n 1)) ; Requested displacement.
                  ; An universal argument is taken as reset, so shouldn't fail.
                  (curr-pos (if (> req-n 0) (- error-count 1) 0)) ; 0-indexed.
                  (next-pos (mod (+ curr-pos req-n) error-count))) ; next-pos must be 1-indexed
             ; (message "error-count %S; req-n %S; curr-pos %S; next-pos %S" error-count req-n curr-pos next-pos)
             ; orig-fun is flycheck-next-error (but without advise)
             ; Argument to flycheck-next-error must be 1-based.
             (apply orig-fun (list (+ 1 next-pos) 'reset)))
         (signal (car err) (cdr err)))))))

(advice-add 'flycheck-next-error :around #'flycheck-next-error-loop-advice)

これはhttps://gist.github.com/Blaisorblade/c7349438b06e7b1e034db775408ac4cbのスナップショットであり、更新されたバージョンを配置します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.