*** empty log message ***

original commit: 9a223953a518850337b1330798b7b7f217382bd5
This commit is contained in:
Scott Owens 2003-12-14 07:58:00 +00:00
parent 1a28cda103
commit d8d7528981
5 changed files with 135 additions and 343 deletions

View File

@ -1240,65 +1240,6 @@
"That is, \\var{keymap} must be chained to some keymap attached"
"to the editor.")
(scheme-paren:backward-containing-sexp
(opt->
((is-a?/c text%)
(and/c integer? exact?)
(and/c integer? exact?))
((union false? (is-a?/c match-cache:%)))
(union false? (and/c integer? exact?)))
((text start end)
((cache #f)))
"Returns the beginning of the interior of the (non-atomic) S-expression"
"containing \\var{start}.")
(scheme-paren:backward-match
(opt->
((is-a?/c text%)
(and/c integer? exact?)
(and/c integer? exact?))
((union false? (is-a?/c match-cache:%)))
(union false? (and/c integer? exact?)))
((text start end)
((cache #f)))
"Specializes "
"@flink paren:backward-match"
"to Scheme.")
(scheme-paren:balanced?
((is-a?/c text%) (and/c integer? exact?) (and/c integer? exact?) . -> . boolean?)
(text start end)
"Specializes "
"@flink paren:balanced?"
"to Scheme.")
(scheme-paren:forward-match
(opt->
((is-a?/c text%)
(and/c integer? exact?)
(and/c integer? exact?))
((union false? (is-a?/c match-cache:%)))
(union false? (and/c integer? exact?)))
((text start end)
((cache #f)))
"Specializes"
"@flink paren:forward-match"
"to Scheme.")
(scheme-paren:get-comments
(-> (listof string?))
()
"Returns the comment characters for Scheme.")
(scheme-paren:get-paren-pairs
(-> (listof (cons/p string? string?)))
()
"Returns the paren pairs for Scheme.")
(scheme-paren:get-quote-pairs
(-> (listof (cons/p string? string?)))
()
"Returns the quote pairs for Scheme.")
(scheme:add-preferences-panel
(-> void?)
@ -1389,126 +1330,6 @@
(keymap)
"Initializes \\var{keymap} with Scheme-mode keybindings.")
(paren:backward-match
(opt->
((is-a?/c text%)
(and/c integer? exact?)
(and/c integer? exact?)
(listof (cons/p string? string?))
(listof (cons/p string? string?))
(listof string?))
(boolean?
(union false? (is-a?/c match-cache:%)))
(union false? (and/c integer? exact?)))
((text start end parens quotes comments)
((containing? #f) (cache #f)))
"Returns the position in \\var{text} that ``opens'' the text ending at "
"\\var{start}, or \\rawscm{\\#f} if no opening position is found (either because a "
"parenthesis mis-match is discovered or the \\var{end} boundary was"
"reached). The match must occur before \\var{end} (inclusive). Note that"
"\\var{start} $>$ \\var{end}, since \\var{start} specifies the starting position"
"of the search, not the earliest buffer position to be considered."
""
"Spaces immediately preceding \\var{start} are skipped. If the text at"
"\\var{start} is a close parenthesis or close quote, then the matching"
"position is the opening parenthesis or quote. If a comment immediately"
"precedes \\var{start}, then the comment is skipped as whitespace. If an"
"opening parenthesis immediately precedes \\var{start}, then the"
"matching position is \\var{start} - 1. Otherwise, the matching position"
"is the first whitespace or parenthesis character before"
"\\var{start}."
""
"If \\var{containing?} is not \\rawscm{\\#f}, then the matching procedure"
"is modified as follows:"
"\\begin{itemize}"
"\\item Searching iterates backwards until some search fails. Then, the"
" location of the last successful search is returned."
"\\item If a mis-match is detected, then \\rawscm{\\#f} is returned."
"\\item If there are no matches (and no mis-matches) before \\var{start},"
" \\var{start} itself is returned. "
"\\end{itemize}"
""
"If \\var{cache} is not \\rawscm{\\#f}, it must be an instance of "
"\\iscmclass{match-cache:}. A cache"
"object can be used to speed up successive calls to "
"\\iscmprocedure{paren:backward-match}. However, a buffer using a cache"
"must call the cache's"
"@link match-cache: invalidate"
"method when the buffer is"
"modified. Different caches should be used for forward and backward"
"matching. See"
"\\hyperref{the match cache section}{section~}{}{fw:matchcache}"
"for more information.")
(paren:balanced?
((is-a?/c text%)
(and/c integer? exact?)
(and/c integer? exact?)
(listof (cons/p string? string?))
(listof (cons/p string? string?))
(listof string?)
. -> .
boolean?)
(text start end parens quotes comments)
"Returns \\rawscm{\\#t} if the text in \\var{text} between positions"
"\\var{start} and \\var{end} is \\defterm{balanced}. The text is balanced"
"if there are no unclosed parenthses or quotes, there are no closing"
"parentheses that do not match an open parenthesis, and there are no"
"mis-matched parentheses."
""
"This uses "
"@flink paren:forward-match %"
".")
(paren:forward-match
(opt->
((is-a?/c text%)
(and/c integer? exact?)
(and/c integer? exact?)
(listof (cons/p string? string?))
(listof (cons/p string? string?))
(listof string?))
((union false? (is-a?/c match-cache:%)))
(union false? (and/c integer? exact?)))
((text start end parens quotes comments)
((cache #f)))
"This function returns the position in \\var{text} that ``closes'' the"
"text at \\var{start}, or \\rawscm{\\#f} if no closing position is found"
"(either because a parenthesis mis-match is discovered or the \\var{end}"
"boundary was reached). The match must occur before \\var{end}"
"(inclusive)."
""
"Spaces immediately following \\var{start} are skipped. If the text at"
"\\var{start} is an open parenthesis or open quote, then the matching"
"position is the closing parenthesis or quote. If a comment immediately"
"follows \\var{start}, it is skipped over as whitespace. If a closing"
"parenthesis immediately follows \\var{start} (after skipping"
"whitespace), then \\rawscm{\\#f} is returned. Otherwise, the matching"
"position is the position before the first whitespace, parenthesis,"
"quote, or comment character after \\var{start}."
""
"If \\var{cache} is not \\rawscm{\\#f}, it must be an instance of "
"\\iscmclass{match-cache:}. "
"\\scmclassindex{match-cache:} A cache"
"object can be used to speed up successive calls to "
"\\rawscm{paren:forwardward-match}. However, a buffer using a cache"
"must call the cache's \\rawscm{forward-invalidate} method when the buffer is"
"modified. Different caches should be used for forward and backward"
"matching. See "
"\\hyperref{the match cache section}{section~}{}{fw:matchcache}"
"for more information."
"")
(paren:skip-whitespace
((is-a?/c text%) (and/c integer? exact?) (symbols 'forward 'backward)
. -> .
(and/c integer? exact?))
(text pos dir)
"If \\var{dir} is \\rawscm{'forward}, this returns the position of the first"
"non-whitespace character in \\var{text} after \\var{pos}. If \\var{dir}"
"is \\rawscm{'backward}, it returns the first non-whitespace character before"
"\\var{pos}.")
(color-model:rgb->xyz
(number? number? number? . -> . color-model:xyz?)
(r g b)

View File

@ -35,7 +35,14 @@
thaw-colorer
reset-region
update-region-end))
update-region-end
skip-whitespace
backward-match
backward-containing-sexp
forward-match
balanced?
in-single-line-comment?))
(define text-mixin
(mixin (text:basic<%>) (-text<%>)
@ -491,9 +498,14 @@
(end-edit-sequence)
(set! in-match-parens? #f))))
;; forward-match: natural-number? natural-number? -> (union natural-number? false?)
;; Skip all consecutive white-space and comments immediately following position.
;; If the token at the new position is an open,
;; return the position of the matching close, or #f if there is none.
;; For any other token, return the start of the next token.
(define/public (forward-match position cutoff)
(do-forward-match position cutoff #f))
(do-forward-match position cutoff #t))
(define (do-forward-match position cutoff skip-whitespace?)
(let ((position
@ -511,21 +523,72 @@
(cond
((<= match-pos cutoff) match-pos)
(else #f))))
(else #f)))))
((and start end error) #f)
(else
(let-values (((tok-start tok-end)
(begin
(tokenize-to-pos position)
(send tokens search! (- position start-pos))
(values (send tokens get-root-start-position)
(send tokens get-root-end-position)))))
(cond
((or (send parens is-close-pos? tok-start)
(= (+ start-pos tok-end) position))
#f)
(else
(+ start-pos tok-end)))))))))
;; backward-match: natural-number? natural-number? -> (union natural-number? false?)
;; Skip all consecutive white-space and comments immediately preceeding position.
;; If the token at the new position is a close,
;; return the position of the matching open, or #f if there is none.
;; For any other token, return the start of that token.
(define/public (backward-match position cutoff)
(let ((x (internal-backward-match position cutoff)))
(cond
((eq? x 'open) #f)
(else x))))
(define (internal-backward-match position cutoff)
(when stopped?
(error 'backward-match "called on a color:text<%> whose colorer is stopped."))
(let ((position (skip-whitespace position 'backward #t)))
(let-values (((start end error)
(send parens match-backward (- position start-pos))))
(cond
((and start end (not error))
(let ((match-pos (+ start-pos end)))
(let ((match-pos (+ start-pos start)))
(cond
((>= match-pos cutoff) match-pos)
(else #f))))
(else #f)))))
((and start end error) #f)
(else
(let-values (((tok-start tok-end)
(begin
(send tokens search!
(if (> position start-pos)
(- position start-pos 1)
0))
(values (send tokens get-root-start-position)
(send tokens get-root-end-position)))))
(cond
((or (send parens is-open-pos? tok-start)
(= (+ start-pos tok-start) position))
'open)
(else
(+ start-pos tok-start)))))))))
(define/public (backward-containing-sexp position cutoff)
(when stopped?
(error 'backward-containing-sexp "called on a color:text<%> whose colorer is stopped."))
(let loop ((cur-pos position))
(let ((p (internal-backward-match cur-pos cutoff)))
(cond
((eq? 'open p) cur-pos)
((not p) #f)
(else (loop p))))))
(define (tokenize-to-pos position)
(when (and (not up-to-date?) (<= current-pos position))
(colorer-driver)
@ -533,7 +596,14 @@
(inherit last-position)
;; skip-whitespace: natural-number? (symbols 'forward 'backward) boolean -> natural-number?
;; If dir is 'forward, this returns the position of the first non-whitespace character
;; after pos. If dir is 'backward, it returns the first non-whitespace character before pos.
;; Must only be called while the tokenizer is started.
(define/public (skip-whitespace position direction comments?)
(when stopped?
(error 'skip-whitespace "called on a color:text<%> whose colorer is stopped."))
(cond
((and (eq? direction 'forward)
(>= position (if (eq? 'end end-pos) (last-position) end-pos)))
@ -541,9 +611,9 @@
((and (eq? direction 'backward) (<= position start-pos))
position)
(else
(let ((p (if (eq? direction 'backward) (sub1 position) position)))
(tokenize-to-pos p)
(send tokens search! (- p start-pos))
(tokenize-to-pos position)
(send tokens search! (- (if (eq? direction 'backward) (sub1 position) position)
start-pos))
(cond
((or (eq? 'white-space (send tokens get-root-data))
(and comments? (eq? 'comment (send tokens get-root-data))))
@ -551,10 +621,30 @@
(if (eq? direction 'forward)
(send tokens get-root-end-position)
(send tokens get-root-start-position)))
direction))
(else p))))))
direction
comments?))
(else position)))))
;; Lifted from scheme-paren.ss
(define/public (balanced? region-start region-end)
(if (or (> region-end (if (eq? end-pos 'end) (last-position) end-pos))
(<= region-end region-start))
#f
(let* ([balance-point (forward-match region-start region-end)]
[end-point
(and balance-point
(skip-whitespace balance-point 'forward #t))])
(and balance-point
(or (and (<= balance-point region-end) (>= end-point region-end))
(balanced? end-point region-end))))))
(define/public (in-single-line-comment? pos)
(send tokens search! (sub1 pos))
(eq? 'comment (send tokens get-root-data)))
;; ------------------------- Callbacks to Override ----------------------
(rename (super-lock lock))

View File

@ -16,7 +16,6 @@
[preferences : framework:preferences^]
[finder : framework:finder^]
[handler : framework:handler^]
[scheme-paren : framework:scheme-paren^]
[frame : framework:frame^]
[editor : framework:editor^])
@ -291,10 +290,7 @@
[flash-paren-match
(lambda (edit event)
(send edit on-default-char event)
(let ([pos (scheme-paren:backward-match
edit
(send edit get-start-position)
0)])
(let ([pos (send edit backward-match (send edit get-start-position) 0)])
(when pos
(send edit flash-on pos (+ 1 pos))))
#t)]
@ -982,7 +978,6 @@
(map ")" "flash-paren-match")
(map "]" "flash-paren-match")
(map "}" "flash-paren-match")
(map "\"" "flash-paren-match")
(map-meta "(" "insert-()-pair")
(map-meta "[" "insert-[]-pair")

View File

@ -18,13 +18,16 @@
(provide scheme@)
(define (scheme-paren:get-paren-pairs)
'(("(" . ")")
("[" . "]")
("{" . "}")))
(define scheme@
(unit/sig framework:scheme^
(import mred^
[preferences : framework:preferences^]
[match-cache : framework:match-cache^]
[paren : framework:paren^]
[scheme-paren : framework:scheme-paren^]
[icon : framework:icon^]
[keymap : framework:keymap^]
[text : framework:text^]
@ -291,7 +294,6 @@
(define -text<%>
(interface ()
get-limit
balance-quotes
balance-parens
tabify-on-return?
tabify
@ -375,33 +377,13 @@
set-style-list
set-styles-fixed
change-style
get-snip-position)
get-snip-position
backward-match
backward-containing-sexp
forward-match
skip-whitespace
in-single-line-comment?)
(define (in-single-line-comment? position)
(let ([para (position-paragraph position)])
(ormap
(lambda (comment-start)
(let loop ([f (find-string comment-start 'backward position)])
(cond
[(not f)
#f]
[(= (position-paragraph f) para)
(let ([f-1 (- f 2)]) ;; -1 to go back one, -1 to be before char
(cond
[(< f-1 0)
#t]
[(not (= (position-paragraph f-1) para))
#t]
[(not (char=? (get-character f-1) #\\ ))
#t]
[else
(loop (find-string comment-start 'backward f-1))]))]
[else
#f])))
(scheme-paren:get-comments))))
[define backward-cache (make-object match-cache:%)]
[define forward-cache (make-object match-cache:%)]
(inherit get-styles-fixed)
(inherit has-focus? find-snip split-snip)
@ -431,7 +413,7 @@
[else (loop (- semi-pos 1))]))]))))
(public get-limit balance-quotes balance-parens tabify-on-return? tabify tabify-selection
(public get-limit balance-parens tabify-on-return? tabify tabify-selection
tabify-all insert-return calc-last-para
box-comment-out-selection comment-out-selection uncomment-selection
get-forward-sexp remove-sexp forward-sexp flash-forward-sexp get-backward-sexp
@ -439,24 +421,7 @@
remove-parens-forward)
(define (get-limit pos) 0)
(inherit get-visible-position-range)
(define (balance-quotes key)
(void)
#;(let* ([char (send key get-key-code)]) ;; must be a character because of the mapping setup
;; this function is only bound to ascii-returning keys
(insert char)
(let* ([start-pos (get-start-position)]
[limit (get-limit start-pos)]
[match (scheme-paren:backward-match
this start-pos limit backward-cache)])
(when match
(let ([start-b (box 0)]
[end-b (box 0)]
[to-flash-point (add1 match)])
(get-visible-position-range start-b end-b #f)
(when (<= (unbox start-b) to-flash-point (unbox end-b))
(flash-on match (add1 match))))))))
(define (balance-parens key-event)
(letrec ([char (send key-event get-key-code)] ;; must be a character. See above.
[here (get-start-position)]
@ -481,9 +446,7 @@
(char=? (string-ref (get-text (- here 1) here) 0) #\\))
(insert char)]
[(or paren-match? fixup-parens?)
(let* ([end-pos (scheme-paren:backward-containing-sexp
this here limit
backward-cache)])
(let* ([end-pos (backward-containing-sexp here limit)])
(cond
[end-pos
(let* ([left-paren-pos (find-enclosing-paren end-pos)]
@ -512,14 +475,13 @@
[limit (get-limit pos)]
[contains
(if okay
(scheme-paren:backward-containing-sexp
this end limit backward-cache)
(backward-containing-sexp end limit)
#f)]
[contain-para (and contains
(position-paragraph contains))]
[last
(if contains
(scheme-paren:backward-match this end limit backward-cache)
(backward-match end limit)
#f)]
[last-para (and last
(position-paragraph last))])
@ -649,8 +611,7 @@
(dynamic-enable-break (lambda () (break-enabled)))
(loop (add1 para))))
(when (and (>= (position-paragraph start-pos) end-para)
(<= (paren:skip-whitespace
this (get-start-position) 'backward)
(<= (skip-whitespace (get-start-position) 'backward #f)
(paragraph-start-position first-para)))
(set-position
(let loop ([new-pos (get-start-position)])
@ -787,10 +748,9 @@
(let para-loop ([curr-para first-para])
(when (<= curr-para last-para)
(let ([first-on-para
(paren:skip-whitespace
this
(paragraph-start-position curr-para)
'forward)])
(skip-whitespace (paragraph-start-position curr-para)
'forward
#f)])
(split-snip first-on-para)
(when (and (< first-on-para last-pos)
(char=? #\; (get-character first-on-para))
@ -817,10 +777,7 @@
[define get-forward-sexp
(lambda (start-pos)
(scheme-paren:forward-match
this start-pos
(last-position)
forward-cache))]
(forward-match start-pos (last-position)))]
[define remove-sexp
(lambda (start-pos)
(let ([end-pos (get-forward-sexp start-pos)])
@ -846,11 +803,9 @@
(lambda (start-pos)
(let* ([limit (get-limit start-pos)]
[end-pos
(scheme-paren:backward-match
this start-pos limit backward-cache)]
(backward-match start-pos limit)]
[min-pos
(scheme-paren:backward-containing-sexp
this start-pos limit backward-cache)]
(backward-containing-sexp start-pos limit)]
[ans
(if (and end-pos
(or (not min-pos)
@ -875,10 +830,7 @@
[define find-up-sexp
(lambda (start-pos)
(let* ([exp-pos
(scheme-paren:backward-containing-sexp
this start-pos
(get-limit start-pos)
backward-cache)]
(backward-containing-sexp start-pos (get-limit start-pos))]
[paren-pos ;; find the closest open paren from this pair, behind exp-pos
(lambda (paren-pair)
(find-string
@ -910,13 +862,10 @@
(lambda (start-pos)
(let ([last (last-position)])
(let loop ([pos start-pos])
(let ([next-pos (scheme-paren:forward-match
this pos last
forward-cache)])
(let ([next-pos (forward-match pos last)])
(if (and next-pos (> next-pos pos))
(let ([back-pos
(scheme-paren:backward-containing-sexp
this (sub1 next-pos) pos backward-cache)])
(backward-containing-sexp (sub1 next-pos) pos)])
(if (and back-pos
(> back-pos pos))
back-pos
@ -931,14 +880,12 @@
#t))]
[define remove-parens-forward
(lambda (start-pos)
(let* ([pos (paren:skip-whitespace this start-pos 'forward)]
(let* ([pos (skip-whitespace start-pos 'forward #f)]
[first-char (get-character pos)]
[paren? (or (char=? first-char #\( )
(char=? first-char #\[ ))]
[closer (if paren?
(scheme-paren:forward-match
this pos (last-position)
forward-cache))])
(forward-match pos (last-position)))])
(if (and paren? closer)
(begin (begin-edit-sequence)
(delete pos (add1 pos))
@ -1014,20 +961,7 @@
(public get-tab-size set-tab-size)
[define get-tab-size (lambda () tab-size)]
[define set-tab-size (lambda (s) (set! tab-size s))]
(rename [super-after-delete after-delete])
(define/override (after-delete start size)
(send backward-cache invalidate start)
(send forward-cache forward-invalidate (+ start size) (- size))
;; must call super after invalidating cache -- super calls surrogate object
(super-after-delete start size))
(rename [super-after-insert after-insert])
(define/override (after-insert start size)
(send backward-cache invalidate start)
(send forward-cache forward-invalidate start size)
;; must call super after invalidating cache -- super calls surrogate object
(super-after-insert start size))
(super-instantiate ())))
(define -text-mode<%>
@ -1065,7 +999,6 @@
(super-new (get-token scheme-lexer-wrapper)
(token-sym->style short-sym->style-name)
(matches '((|(| |)|)
(#\| \|#)
(|[| |]|)
(|{| |}|))))))
@ -1155,9 +1088,6 @@
(send keymap add-function "balance-parens"
(lambda (edit event)
(send edit balance-parens event)))
#;(send keymap add-function "balance-quotes"
(lambda (edit event)
(send edit balance-quotes event)))
(send keymap map-function "TAB" "tabify-at-caret")
@ -1174,8 +1104,6 @@
(send keymap map-function ")" "balance-parens")
(send keymap map-function "]" "balance-parens")
(send keymap map-function "}" "balance-parens")
#;(send keymap map-function "\"" "balance-quotes")
#;(send keymap map-function "|" "balance-quotes")
(let ([map-meta
(lambda (key func)

View File

@ -59,12 +59,6 @@
framework:keymap^
framework:keymap-class^
framework:keymap-fun^
framework:match-cache^
framework:match-cache-class^
framework:match-cache-fun^
framework:scheme-paren^
framework:scheme-paren-class^
framework:scheme-paren-fun^
framework:color^
framework:color-class^
framework:color-fun^
@ -74,9 +68,6 @@
framework:scheme^
framework:scheme-class^
framework:scheme-fun^
framework:paren^
framework:paren-class^
framework:paren-fun^
framework:main^
framework:main-class^
framework:main-fun^
@ -482,28 +473,6 @@
((open framework:keymap-class^)
(open framework:keymap-fun^)))
(define-signature framework:match-cache-class^
(%))
(define-signature framework:match-cache-fun^
())
(define-signature framework:match-cache^
((open framework:match-cache-class^)
(open framework:match-cache-fun^)))
(define-signature framework:scheme-paren-class^
())
(define-signature framework:scheme-paren-fun^
(get-comments
get-paren-pairs
get-quote-pairs
forward-match
backward-match
balanced?
backward-containing-sexp))
(define-signature framework:scheme-paren^
((open framework:scheme-paren-class^)
(open framework:scheme-paren-fun^)))
(define-signature framework:color-class^
(text<%>
text-mixin
@ -558,17 +527,6 @@
((open framework:scheme-class^)
(open framework:scheme-fun^)))
(define-signature framework:paren-class^
())
(define-signature framework:paren-fun^
(balanced?
forward-match
backward-match
skip-whitespace))
(define-signature framework:paren^
((open framework:paren-class^)
(open framework:paren-fun^)))
(define-signature framework:main-class^ ())
(define-signature framework:main-fun^ ())
(define-signature framework:main^