ask about normalizing pastes only after pasting has finished (in case there are multiple calls to insert)
closes PR 11449
This commit is contained in:
parent
4f56618c6d
commit
c94ad960ac
|
@ -1,4 +1,5 @@
|
||||||
#lang racket/base
|
#lang racket/base
|
||||||
|
|
||||||
#|
|
#|
|
||||||
|
|
||||||
closing:
|
closing:
|
||||||
|
|
|
@ -777,7 +777,13 @@
|
||||||
(inherit begin-edit-sequence end-edit-sequence
|
(inherit begin-edit-sequence end-edit-sequence
|
||||||
delete insert split-snip find-snip
|
delete insert split-snip find-snip
|
||||||
get-snip-position get-top-level-window find-string)
|
get-snip-position get-top-level-window find-string)
|
||||||
(define pasting? #f)
|
|
||||||
|
;; pasting-info : (or/c #f (listof (list number number)))
|
||||||
|
;; when #f, we are not in a paste
|
||||||
|
;; when a list, we are in a paste and the
|
||||||
|
;; list contains the regions that have
|
||||||
|
;; been changed by the paste
|
||||||
|
(define paste-info #f)
|
||||||
(define rewriting? #f)
|
(define rewriting? #f)
|
||||||
|
|
||||||
(define/public (ask-normalize?)
|
(define/public (ask-normalize?)
|
||||||
|
@ -805,24 +811,28 @@
|
||||||
(preferences:get 'framework:do-paste-normalization)]))
|
(preferences:get 'framework:do-paste-normalization)]))
|
||||||
(define/public (string-normalize s) (string-normalize-nfkc s))
|
(define/public (string-normalize s) (string-normalize-nfkc s))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(define/override (do-paste start time)
|
(define/override (do-paste start time)
|
||||||
(dynamic-wind
|
(dynamic-wind
|
||||||
(λ () (set! pasting? #t))
|
(λ () (set! paste-info '()))
|
||||||
(λ () (super do-paste start time))
|
(λ () (super do-paste start time)
|
||||||
(λ () (set! pasting? #f))))
|
(let ([local-paste-info paste-info])
|
||||||
|
(set! paste-info #f)
|
||||||
(define/augment (on-insert start len)
|
(deal-with-paste local-paste-info)))
|
||||||
(inner (void) on-insert start len)
|
;; use the dynamic wind to be sure that the paste-info is set back to #f
|
||||||
(begin-edit-sequence))
|
;; in the case that the middle thunk raises an exception
|
||||||
|
(λ () (set! paste-info #f))))
|
||||||
|
|
||||||
(define/augment (after-insert start len)
|
(define/augment (after-insert start len)
|
||||||
(when pasting?
|
(when paste-info
|
||||||
(unless rewriting?
|
(set! paste-info (cons (list start len) paste-info)))
|
||||||
(set! rewriting? #t)
|
(inner (void) after-insert start len))
|
||||||
|
|
||||||
|
(define/private (deal-with-paste local-paste-info)
|
||||||
(let/ec abort
|
(let/ec abort
|
||||||
(define ask? #t)
|
(define ask? #t)
|
||||||
|
(for ([insertion (in-list local-paste-info)])
|
||||||
|
(define start (list-ref insertion 0))
|
||||||
|
(define len (list-ref insertion 1))
|
||||||
(split-snip start)
|
(split-snip start)
|
||||||
(split-snip (+ start len))
|
(split-snip (+ start len))
|
||||||
(let loop ([snip (find-snip start 'after-or-none)])
|
(let loop ([snip (find-snip start 'after-or-none)])
|
||||||
|
@ -839,10 +849,7 @@
|
||||||
(let ([snip-pos (get-snip-position snip)])
|
(let ([snip-pos (get-snip-position snip)])
|
||||||
(delete snip-pos (+ snip-pos (string-length old)))
|
(delete snip-pos (+ snip-pos (string-length old)))
|
||||||
(insert new snip-pos snip-pos #f)))))
|
(insert new snip-pos snip-pos #f)))))
|
||||||
(loop (send snip next)))))))
|
(loop (send snip next)))))))))
|
||||||
(set! rewriting? #f)))
|
|
||||||
(end-edit-sequence)
|
|
||||||
(inner (void) after-insert start len))
|
|
||||||
|
|
||||||
(super-new)))
|
(super-new)))
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user