Subject: [PATCH v3 3/3] ui: Add hint for command typo.

From: zimoun <[email-masked]>
Date: Tue, 19 Jan 2021 22:28:10 +0100

* guix/ui.scm (command-hint): New variable
* guix/ui.scm (run-guix-command): Use it.
---
 guix/ui.scm | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/guix/ui.scm b/guix/ui.scm
index bd504c68da..895c3a721f 100644
--- a/guix/ui.scm
+++ b/guix/ui.scm
@@ -2123,6 +2123,14 @@ Run COMMAND with ARGS.\n"))
 (define (run-guix-command command . args)
   "Run COMMAND with the given ARGS.  Report an error when COMMAND is not
 found."
+  (define (command-hint guess commands)
+    (define command-names
+      (map (lambda (command)
+             (match (command-name command)
+               ((head tail ...) head)))
+           commands))
+    (string-closest (symbol->string guess) command-names #:threshold 3))
+
   (define module
     (catch 'misc-error
       (lambda ()
@@ -2139,9 +2147,12 @@ found."
                 (load file)
                 (resolve-interface `(guix extensions ,command)))))
           (lambda _
-            (format (current-error-port)
-                    (G_ "guix: ~a: command not found~%") command)
-            (show-guix-usage))))))
+            (let ((hint (command-hint command (commands))))
+              (when hint
+                (display-hint (format #f (G_ "Do you mean @code{~a}?") hint)))
+              (format (current-error-port)
+                      (G_ "guix: ~a: command not found~%") command)
+              (show-guix-usage)))))))
 
   (let ((command-main (module-ref module
                                   (symbol-append 'guix- command))))
-- 
2.29.2