chicken-belt / chicken-select.scm

#!/usr/bin/csi -s

(use srfi-1 posix)
(include "chicken-env")

(define (available-chickens)
  (filter (lambda (p) (not (equal? chicken-link p)))
          (directory chicken-coop)))

(define (current-chicken path link)
  (let ((p (make-pathname path link)))
    (and (symbolic-link? p)
         (read-symbolic-link p))))

(define (set-current-chicken chicken link)
  (let ((symlink (make-pathname chicken-coop link)))
    (when (file-exists? symlink)
      (delete-file symlink))
    (create-symbolic-link chicken symlink)))

(let* ((all-chicks (available-chickens))
       (current (list-index (cut equal? (current-chicken chicken-coop chicken-link) <>) all-chicks)))
  (let select ((abort #f))
    (if (equal? abort #\q)
          (print "Aborted.")
          (exit 0))
          (print "Select a new Chicken, press 'q' to abort:")
          (for-each (lambda (c n)
                      (printf "~a ~a: ~a~%"
                              (if (equal? n current) "*" " ")
                              n c))
                    (iota (length all-chicks)))
          (let* ((choice-raw (read-char))
                 (num (string->number (string choice-raw))))
            (if (and 
                 (<= 0 num)
                 (< num (length all-chicks)))
                  (print "Setting current Chicken to " (list-ref all-chicks num))
                  (set-current-chicken (list-ref all-chicks
                (select choice-raw)))))))
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.