Immediately expand common prefix of completions
Let ls respect its arguments
This commit is contained in:
parent
f07e7fc932
commit
186cebc46a
|
@ -132,15 +132,39 @@
|
||||||
(destructure (((type cmd to-complete) completion-info))
|
(destructure (((type cmd to-complete) completion-info))
|
||||||
(let ((completions ((find-completer type cmd) cmd to-complete)))
|
(let ((completions ((find-completer type cmd) cmd to-complete)))
|
||||||
(debug-message "Possible completions " completions)
|
(debug-message "Possible completions " completions)
|
||||||
(cond
|
(case (length completions)
|
||||||
((= (length completions) 1)
|
((0) #f)
|
||||||
|
((1)
|
||||||
(call-with-values
|
(call-with-values
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(unparse-command-line
|
(unparse-command-line
|
||||||
parsed (lambda (to-complete)
|
parsed (lambda (to-complete)
|
||||||
(display (car completions)))))
|
(display (car completions)))))
|
||||||
(lambda (completed-line cursor-index)
|
(lambda (completed-line cursor-index)
|
||||||
(list completed-line cursor-index to-complete parsed))))
|
(list completed-line '() cursor-index to-complete parsed))))
|
||||||
(else
|
(else
|
||||||
(list completions cursor-index to-complete parsed))))))))
|
(let ((common-prefix (strings-common-prefix completions)))
|
||||||
|
(call-with-values
|
||||||
|
(lambda ()
|
||||||
|
(unparse-command-line
|
||||||
|
parsed (lambda (to-complete)
|
||||||
|
(display common-prefix))))
|
||||||
|
(lambda (completed-line cursor-index)
|
||||||
|
(list completed-line completions cursor-index to-complete parsed)))))))))))
|
||||||
|
|
||||||
|
|
||||||
|
(define (strings-common-prefix strs)
|
||||||
|
(let lp ((strs (cdr strs))
|
||||||
|
(len (string-length (car strs)))
|
||||||
|
(common (car strs)))
|
||||||
|
(if (null? strs)
|
||||||
|
common
|
||||||
|
(let ((new (string-prefix-length (car strs)
|
||||||
|
common)))
|
||||||
|
(if (< new len)
|
||||||
|
(lp (cdr strs)
|
||||||
|
new
|
||||||
|
(string-take common new))
|
||||||
|
(lp (cdr strs)
|
||||||
|
len
|
||||||
|
common))))))
|
||||||
|
|
|
@ -362,11 +362,11 @@
|
||||||
(loop (wait-for-input) #f maybe-selector)))
|
(loop (wait-for-input) #f maybe-selector)))
|
||||||
|
|
||||||
;; F7 toggle scheme-mode / command-mode (FIXME: find a better key)
|
;; F7 toggle scheme-mode / command-mode (FIXME: find a better key)
|
||||||
((= ch key-f7)
|
((= ch key-home)
|
||||||
(toggle-command/scheme-mode)
|
(toggle-command/scheme-mode)
|
||||||
(loop (wait-for-input) #f #f))
|
(loop (wait-for-input) #f #f))
|
||||||
|
|
||||||
((= ch key-f8)
|
((= ch key-end)
|
||||||
(show-shell-screen)
|
(show-shell-screen)
|
||||||
(paint)
|
(paint)
|
||||||
(loop (wait-for-input) #f #f))
|
(loop (wait-for-input) #f #f))
|
||||||
|
@ -738,13 +738,14 @@
|
||||||
;; #### beep or so
|
;; #### beep or so
|
||||||
#f)
|
#f)
|
||||||
(destructure
|
(destructure
|
||||||
(((completions cursor-index to-complete cmdln) completion-info))
|
(((completed-line completions cursor-index to-complete cmdln) completion-info))
|
||||||
(cond
|
(cond
|
||||||
((string? completions)
|
((null? completions)
|
||||||
;; #### don't ask
|
;; #### don't ask
|
||||||
(display-completed-line completions (+ 2 cursor-index))
|
(display-completed-line completed-line (+ 2 cursor-index))
|
||||||
#f)
|
#f)
|
||||||
((list? completions)
|
((list? completions)
|
||||||
|
(display-completed-line completed-line (+ 2 cursor-index))
|
||||||
(let* ((select-list
|
(let* ((select-list
|
||||||
(completions->select-list
|
(completions->select-list
|
||||||
completions
|
completions
|
||||||
|
|
|
@ -121,8 +121,10 @@
|
||||||
;; We don't care for options that format the output.
|
;; We don't care for options that format the output.
|
||||||
|
|
||||||
(define defaults-ls-options
|
(define defaults-ls-options
|
||||||
'((long . #t) (dot-files? . #t)
|
'((long . #t)
|
||||||
(sort-by-mtime . #f) (reverse-sort . #f)))
|
(dot-files? . #t)
|
||||||
|
(sort-by-mtime . #f)
|
||||||
|
(reverse-sort . #f)))
|
||||||
|
|
||||||
(define (parse-ls-arguments args)
|
(define (parse-ls-arguments args)
|
||||||
(let* ((on/off-option-processor
|
(let* ((on/off-option-processor
|
||||||
|
@ -149,37 +151,47 @@
|
||||||
(lambda (option name args operands)
|
(lambda (option name args operands)
|
||||||
(error "Unknown ls option" name))
|
(error "Unknown ls option" name))
|
||||||
cons '())))
|
cons '())))
|
||||||
(map (lambda (p)
|
(receive (options rest) (partition pair? given-args)
|
||||||
(or (assoc (car p) given-args) p))
|
(values
|
||||||
defaults-ls-options))))
|
(map (lambda (p)
|
||||||
|
(or (assoc (car p) options) p))
|
||||||
|
defaults-ls-options)
|
||||||
|
rest)))))
|
||||||
|
|
||||||
(register-plugin!
|
(register-plugin!
|
||||||
(make-command-plugin
|
(make-command-plugin
|
||||||
"ls"
|
"ls"
|
||||||
no-completer
|
no-completer
|
||||||
(lambda (command args)
|
(lambda (command args)
|
||||||
(let* ((options (parse-ls-arguments args))
|
(debug-message "running ls plugin" command args)
|
||||||
(set? (lambda (opt) (cdr (assoc opt options))))
|
(receive (options paths) (parse-ls-arguments args)
|
||||||
(sort
|
(let* ((set? (lambda (opt) (cdr (assoc opt options))))
|
||||||
(if (set? 'sort-by-mtime)
|
(sort
|
||||||
(lambda (lst)
|
(if (set? 'sort-by-mtime)
|
||||||
(list-sort
|
(lambda (lst)
|
||||||
(lambda (f g)
|
(list-sort
|
||||||
(< (file-info:mtime (fs-object-info f))
|
(lambda (f g)
|
||||||
(file-info:mtime (fs-object-info g))))
|
(< (file-info:mtime (fs-object-info f))
|
||||||
lst))
|
(file-info:mtime (fs-object-info g))))
|
||||||
(lambda (lst)
|
lst))
|
||||||
(list-sort
|
(lambda (lst)
|
||||||
(lambda (f g)
|
(list-sort
|
||||||
(string<? (fs-object-name f) (fs-object-name g)))
|
(lambda (f g)
|
||||||
lst))))
|
(string<? (fs-object-name f) (fs-object-name g)))
|
||||||
(reverse
|
lst))))
|
||||||
(if (set? 'reverse-sort)
|
(reverse
|
||||||
reverse
|
(if (set? 'reverse-sort)
|
||||||
(lambda (l) l))))
|
reverse
|
||||||
(reverse
|
(lambda (l) l))))
|
||||||
(sort
|
(reverse
|
||||||
(directory-files (cwd) (set? 'dot-files?))))))))
|
(sort
|
||||||
|
(apply
|
||||||
|
append
|
||||||
|
(map (lambda (path)
|
||||||
|
(if (file-directory? path)
|
||||||
|
(directory-files path (set? 'dot-files?))
|
||||||
|
(list (file-name->fs-object path))))
|
||||||
|
paths)))))))))
|
||||||
|
|
||||||
(register-plugin!
|
(register-plugin!
|
||||||
(make-command-plugin "ps"
|
(make-command-plugin "ps"
|
||||||
|
|
Loading…
Reference in New Issue