#lang racket/base (require racket/format racket/path racket/string rackedit) (provide coreutils-edit current-coreutils-editor) (define current-coreutils-editor (make-parameter rkdt (λ (editor) (unless (procedure? editor) (raise-argument-error 'current-coreutils-editor "procedure?" editor)) editor))) (define (arg->path arg) (cond [(path? arg) arg] [(string? arg) (string->path arg)] [(symbol? arg) (string->path (symbol->string arg))] [else (raise-argument-error 'edit "path, string, or symbol" arg)])) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; goal : Open one file in the editor configured for rash-coreutils. ; pre : args contains exactly one filename and optionally --wait. ; post : The configured editor has been invoked once. With --wait, the ; command does not return until the editor procedure returns. ; result : (void). ; internals: ; current-coreutils-editor defaults to rackedit's rkdt procedure. ; The --wait flag is translated to rkdt's #:wait? keyword. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define (coreutils-edit . args) (define wait? #f) (define reversed-paths '()) (for ([arg (in-list args)]) (define text (~a arg)) (cond [(string=? text "--wait") (set! wait? #t)] [(string-prefix? text "-") (raise-arguments-error 'edit "unsupported option" "option" text)] [else (set! reversed-paths (cons (arg->path arg) reversed-paths))])) (define paths (reverse reversed-paths)) (unless (or (= (length paths) 1) (= (length paths) 0)) (raise-arguments-error 'edit "expected exactly zero or one file" "arguments" args)) (if (null? paths) ((current-coreutils-editor) #:wait? wait?) ((current-coreutils-editor) (car paths) #:wait? wait?)) (void))