54 lines
2.0 KiB
Racket
54 lines
2.0 KiB
Racket
#lang racket/base
|
|
|
|
(provide read-from-minibuffer
|
|
recursive-edit-field-start
|
|
recursive-edit-mode
|
|
recursive-edit-accept-hook
|
|
recursive-edit-cancel-hook)
|
|
|
|
(require "buffer.rkt")
|
|
(require "editor.rkt")
|
|
(require "mode.rkt")
|
|
(require "keys.rkt")
|
|
(require "rope.rkt")
|
|
|
|
(define (read-from-minibuffer editor
|
|
prompt
|
|
#:on-accept k-accept
|
|
#:on-cancel [k-cancel void])
|
|
(define buf (make-buffer #f "*minibuf*"))
|
|
(configure-fresh-buffer! editor buf)
|
|
(buffer-add-mode! buf recursive-edit-mode)
|
|
(buffer-replace-contents! buf (string->rope prompt))
|
|
(buffer-mark! buf recursive-edit-field-start (buffer-size buf))
|
|
(recursive-edit-selected-window buf (editor-active-window editor))
|
|
(recursive-edit-accept-hook buf k-accept)
|
|
(recursive-edit-cancel-hook buf k-cancel)
|
|
(start-recursive-edit editor buf)
|
|
buf)
|
|
|
|
(define recursive-edit-field-start (mark-type (buffer-mark-type 'recursive-edit-field-start
|
|
'*minibuf*
|
|
#t)
|
|
'left))
|
|
|
|
(define recursive-edit-mode (make-mode "recursive-edit"))
|
|
|
|
(define-buffer-local recursive-edit-selected-window)
|
|
(define-buffer-local recursive-edit-accept-hook (lambda (content) (void)))
|
|
(define-buffer-local recursive-edit-cancel-hook (lambda () (void)))
|
|
|
|
(define-command recursive-edit-mode (abort-recursive-edit buf #:editor ed)
|
|
#:bind-key "C-g"
|
|
(abandon-recursive-edit ed)
|
|
(select-window ed (recursive-edit-selected-window buf))
|
|
((recursive-edit-cancel-hook buf)))
|
|
|
|
(define-command recursive-edit-mode (exit-minibuffer buf #:editor ed)
|
|
#:bind-key "C-m"
|
|
#:bind-key "C-j"
|
|
(abandon-recursive-edit ed)
|
|
(select-window ed (recursive-edit-selected-window buf))
|
|
((recursive-edit-accept-hook buf)
|
|
(rope->string (buffer-region buf recursive-edit-field-start (buffer-size buf)))))
|