src/fish.lisp @ 4bc03604aa39 default tip

Add experimental fish completions, add hidden options
author Steve Losh <steve@stevelosh.com>
date Fri, 20 Mar 2026 12:59:41 -0400
parents (none)
children (none)
(in-package :adopt)

(defun escape/shell (string)
  (if (zerop (length string))
    ""
    (with-output-to-string (s)
      (loop :for char :across string :do
            (when (find char "'")
              (write-char #\\ s))
            (write-char char s)))))

(defun print-fish-completions (interface &key
                               (stream *standard-output*)
                               (program-name (name interface)))
  (labels ((f (&rest args)
             (write-string " " stream)
             (apply #'format stream args)))
    (dolist (o (options interface))
      (format stream "complete -c ~A" program-name)
      (let ((long (long o))
            (short (short o))
            (param (parameter o))
            (help (or (terse o) (help o))))
        (when long (f "-l ~A" long))
        (when short (f "-s ~A" short))
        (when param (f "-ra ~A" param))
        (when help (f "-d '~A'" (escape/shell help)))
        (terpri stream)))))