Function: dtrt-indent-diagnosis

dtrt-indent-diagnosis is an autoloaded, interactive and natively compiled function defined in dtrt-indent-diag.el.

Signature

(dtrt-indent-diagnosis)

Documentation

Guess indentation for the current buffer and output diagnostics.

Key Bindings

This command is not in any keymaps.

Source Code

;; Defined in /nix/store/xl774j723v677bsfsybzln3vi6w0fpm3-emacs-packages-deps/share/emacs/site-lisp/elpa/dtrt-indent-20260709.2011/dtrt-indent-diag.el
(defun dtrt-indent-diagnosis ()
  "Guess indentation for the current buffer and output diagnostics."
  (interactive)
  (let ((language-and-variable
         (cdr (dtrt-indent--search-hook-mapping major-mode))))

    (with-output-to-temp-buffer "*dtrt-indent-debug*"
    (if (null language-and-variable)
        (princ (format "Major mode %s not supported by dtrt-indent" major-mode))
      (let* ((language-and-variable
              (cdr (dtrt-indent--search-hook-mapping major-mode)))
             result
             (time-for-analysis
              (benchmark-elapse
                (setq result
                      (dtrt-indent--analyze
                       (dtrt-indent--calc-histogram
                        (car language-and-variable))))))
             (histogram
              (cdr (assoc :histogram result)))
             (total-lines
              (cdr (assoc :total-lines result)))
             (hard-tab-lines
              (cdr (assoc :hard-tab-lines result)))
             (hard-tab-percentage
              (cdr (assoc :hard-tab-percentage result)))
             (soft-tab-lines
              (cdr (assoc :soft-tab-lines result)))
             (soft-tab-percentage
              (cdr (assoc :soft-tab-percentage result)))
             (change-indent-tabs-mode
              (cdr (assoc :change-indent-tabs-mode result)))
             (indent-tabs-mode-setting
              (cdr (assoc :indent-tabs-mode-setting result)))
             (analysis
              (cdr (assoc :analysis result)))
             (best-guess
              (cdr (assoc :best-guess result)))
             (rejected
              (cdr (assoc :rejected result)))
             (confidence
              (cdr (assoc :confidence result))))

        (princ (format "\nGuessing offset for %s\n\n"
                       (or (buffer-file-name) (buffer-name))))
        (princ (format "Elapsed time for analysis: %.3f seconds\n\n"
                       time-for-analysis))
        (princ (format "Total relevant lines: %d out of %d (limit: %d)\n"
                       total-lines
                       (line-number-at-pos (point-max))
                       dtrt-indent-max-lines))
        (if (< total-lines
               dtrt-indent-min-relevant-lines)
            (princ
             (format "\
\n\
Analysis cancelled: not enough relevant lines (%d required) - not \
modifying offset or indent-tabs-mode\n\n"
                     dtrt-indent-min-relevant-lines))
          (princ "\nHistogram:\n\n")
          (princ
           (eval
            (append '(concat)
                    (mapcar (lambda (x)
                              (format "  %4dx %3d spaces\n"
                                      (nth 1 x)
                                      (nth 0 x)))
                            (sort
                             histogram
                             (lambda (x y)
                               (or (not y)
                                   (and x (< (car x) (car y))))))))))
          (princ "\nAnalysis:\n\n")
          (princ
           (eval
            (append '(concat)
                    (mapcar
                     (lambda (analysis-entry)
                       (format "\
  offset %d works for %6.2f%% of relevant lines, matching %d \
distinct offsets - %s\n"
                               (nth 0 analysis-entry)
                               (* 100.0 (nth 1 analysis-entry))
                               (nth 2 analysis-entry)
                               (or (nth 3 analysis-entry) "CONSIDERED")))
                     analysis))))
          (princ "\nSummary:\n\n")

          (princ
           (format "\
  Best guess is offset %d with %.2f%% matching lines \(%.2f%% \
required)\n"
                   (nth 0 best-guess)
                   (* 100.0 (nth 1 best-guess))
                   dtrt-indent-min-quality))

          (princ (format "  Hard tab percentage: %.2f%% (%d lines), \
%.2f%% superior to soft tabs (threshold %.2f%%)\n"
                         (* 100.0 hard-tab-percentage)
                         hard-tab-lines
                         (- (* 100.0 (/ hard-tab-percentage
                                        soft-tab-percentage))
                            100.0)
                         dtrt-indent-min-hard-tab-superiority
                         ))
          (princ (format "  Soft tab percentage: %.2f%% (%d lines), \
%.2f%% superior to hard tabs (threshold %.2f%%)\n"
                         (* 100.0 soft-tab-percentage)
                         soft-tab-lines
                         (- (* 100.0 (/ soft-tab-percentage
                                        hard-tab-percentage))
                            100.0)
                         dtrt-indent-min-soft-tab-superiority))

          (princ "\nConclusion:\n\n")

          (princ (format "\
  Guessed offset %s with %.0f%% confidence.\n"
                         (nth 0 best-guess)
                         (* 100.0 confidence)))
          (if rejected (princ (format "  Rejected: %s\n" rejected)))
          (princ (format "  Change indent-tab-setting: %s\n"
                         (if change-indent-tabs-mode
                             (format "yes, to %s" indent-tabs-mode-setting)
                           "no")))))))))