From 016fc53d49abf188bb0d91947176d4a6dc0d5770 Mon Sep 17 00:00:00 2001 From: squarebat Date: Mon, 17 Jan 2022 11:36:01 +0530 Subject: [PATCH 1/6] feat: reopen closed tab --- drracket/drracket/private/unit.rkt | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/drracket/drracket/private/unit.rkt b/drracket/drracket/private/unit.rkt index e088ca64c..5fd850568 100644 --- a/drracket/drracket/private/unit.rkt +++ b/drracket/drracket/private/unit.rkt @@ -3268,6 +3268,21 @@ (define/public (open-in-new-tab filename) (create-new-tab filename)) + ;; reopen-closed-tab : -> void + ;; opens previously closed tab if the file still exists + (define/public reopen-closed-tab + (lambda () + ; Get the list of recently opened files + (define recently-opened-files (preferences:get 'framework:recently-opened-files/pos)) + (define file-to-open + (for/or ([file (in-list recently-opened-files)]) + (define filename (first file)) + (and (not (find-matching-tab filename)) + (file-exists? filename) + filename))) + (open-in-new-tab file-to-open) + #f)) + (define/public (get-tab-count) (length tabs)) (define/public (change-to-nth-tab n) (unless (< n (length tabs)) @@ -3932,6 +3947,13 @@ (let-values ([(base name dir?) (split-path editing-path)]) base)))) (when pth (handler:edit-file pth)))]) + (new menu:can-restore-menu-item% + (label (string-constant reopen-closed-tab)) + (shortcut #\*) + (parent file-menu) + (callback + (λ (x y) + (reopen-closed-tab)))) (super file-menu:between-open-and-revert file-menu) (make-object separator-menu-item% file-menu))] (define close-tab-menu-item #f) From 862310dfdc7937fe9bdf352a56e4819b46a9d49f Mon Sep 17 00:00:00 2001 From: squarebat Date: Mon, 17 Jan 2022 11:49:49 +0530 Subject: [PATCH 2/6] add: documentation for reopen closed tab --- drracket/drracket/private/unit.rkt | 3 ++- drracket/scribblings/drracket/menus.scrbl | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/drracket/drracket/private/unit.rkt b/drracket/drracket/private/unit.rkt index 5fd850568..2ac667077 100644 --- a/drracket/drracket/private/unit.rkt +++ b/drracket/drracket/private/unit.rkt @@ -3269,7 +3269,8 @@ (create-new-tab filename)) ;; reopen-closed-tab : -> void - ;; opens previously closed tab if the file still exists + ;; Opens previously closed tabs. If no tabs were closed in current session, files from + ;; previous sessions are opened. (define/public reopen-closed-tab (lambda () ; Get the list of recently opened files diff --git a/drracket/scribblings/drracket/menus.scrbl b/drracket/scribblings/drracket/menus.scrbl index 61abaa694..262080996 100644 --- a/drracket/scribblings/drracket/menus.scrbl +++ b/drracket/scribblings/drracket/menus.scrbl @@ -30,6 +30,10 @@ or @litchar{"x.rkt"}) and edit the corresponding files in the @tech{definitions window}.} + @item{@defmenuitem{Reopen Closed Tab} Opens previously closed tabs. + If no tabs were closed in current session, files from + previous sessions are opened.} + @item{@defmenuitem{Install PLT File...} Opens a dialog asking for the location of the @filepath{.plt} file (either on the local disk or on the web) and installs the contents of the file.} From 81c3bc8d2ab1267ef4da1d36ea62b8709ffda026 Mon Sep 17 00:00:00 2001 From: squarebat Date: Fri, 21 Jan 2022 23:22:42 +0530 Subject: [PATCH 3/6] modify: reopen-closed-tabs to use recently-closed-tabs preference --- drracket/drracket/private/unit.rkt | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/drracket/drracket/private/unit.rkt b/drracket/drracket/private/unit.rkt index 2ac667077..d37f6daca 100644 --- a/drracket/drracket/private/unit.rkt +++ b/drracket/drracket/private/unit.rkt @@ -3248,6 +3248,7 @@ (send tab set-i (- (send tab get-i) 1))) (set! tabs (remq tab-to-close tabs)) (send tabs-panel delete (send tab-to-close get-i)) + (update-closed-tabs tab) (update-menu-bindings) (cond [(eq? tab-to-close current-tab) @@ -3273,15 +3274,16 @@ ;; previous sessions are opened. (define/public reopen-closed-tab (lambda () - ; Get the list of recently opened files - (define recently-opened-files (preferences:get 'framework:recently-opened-files/pos)) + (define closed-tabs (preferences:get 'framework:recently-closed-tabs)) (define file-to-open - (for/or ([file (in-list recently-opened-files)]) + (for/or ([file (in-list closed-tabs)]) (define filename (first file)) (and (not (find-matching-tab filename)) (file-exists? filename) + (set! closed-tabs (cdr closed-tabs)) filename))) (open-in-new-tab file-to-open) + (preferences:set 'framework:recently-closed-tabs closed-tabs) #f)) (define/public (get-tab-count) (length tabs)) @@ -3413,6 +3415,12 @@ (update-close-tab-menu-item-shortcut close-tab-menu-item)) (update-close-menu-item-shortcut (file-menu:get-close-item))) + (define/private (update-closed-tabs tab) + (define tab-filename (send (send tab get-defs) get-filename)) + (when tab-filename + (define closed-tabs (preferences:get 'framework:recently-closed-tabs)) + (preferences:set 'framework:recently-closed-tabs (cons (list tab-filename 0 0) closed-tabs)))) + (define/private (update-close-tab-menu-item-shortcut item) (define just-one? (and (pair? tabs) (null? (cdr tabs)))) (send item set-label (if just-one? @@ -3950,7 +3958,8 @@ (when pth (handler:edit-file pth)))]) (new menu:can-restore-menu-item% (label (string-constant reopen-closed-tab)) - (shortcut #\*) + (shortcut #\t) + (shortcut-prefix (cons 'shift (get-default-shortcut-prefix))) (parent file-menu) (callback (λ (x y) From b180a90a6064fc017886aedc3fdfc27eb1aa2963 Mon Sep 17 00:00:00 2001 From: squarebat Date: Wed, 26 Jan 2022 13:32:07 +0530 Subject: [PATCH 4/6] modify: preference location, docs --- drracket/drracket/private/main.rkt | 35 +++++++++++++++++++++++++ drracket/drracket/private/unit.rkt | 37 ++++++++++++++++++++++----- drracket/scribblings/tools/unit.scrbl | 4 +++ 3 files changed, 69 insertions(+), 7 deletions(-) diff --git a/drracket/drracket/private/main.rkt b/drracket/drracket/private/main.rkt index e1b7b9aa7..178659033 100644 --- a/drracket/drracket/private/main.rkt +++ b/drracket/drracket/private/main.rkt @@ -617,6 +617,41 @@ (preferences:set-default 'drracket:show-killed-dialog #t boolean?) + (preferences:set-default + 'drracket:recently-closed-tabs + null + (λ (x) (and (list? x) + (andmap + (λ (x) + (and (list? x) + (= 3 (length x)) + (path? (car x)) + (number? (cadr x)) + (number? (caddr x)))) + x)))) + + (preferences:set-un/marshall + 'drracket:recently-closed-tabs + (λ (l) (map (λ (ele) (cons (path->bytes (car ele)) (cdr ele))) l)) + (λ (l) + (let/ec k + (unless (list? l) + (k '())) + (map (λ (x) + (unless (and (list? x) + (= 3 (length x)) + (bytes? (car x)) + (number? (cadr x)) + (number? (caddr x))) + (k '())) + (cons (bytes->path (car x)) (cdr x))) + l)))) + + (preferences:set-default 'drracket:recently-closed-tabs-max-count + 50 + (λ (x) (and (number? x) + (x . > . 0) + (integer? x)))) (drr:set-default 'drracket:large-letters-font #f (or/c #f diff --git a/drracket/drracket/private/unit.rkt b/drracket/drracket/private/unit.rkt index d37f6daca..c3158b126 100644 --- a/drracket/drracket/private/unit.rkt +++ b/drracket/drracket/private/unit.rkt @@ -3274,16 +3274,19 @@ ;; previous sessions are opened. (define/public reopen-closed-tab (lambda () - (define closed-tabs (preferences:get 'framework:recently-closed-tabs)) + (define closed-tabs (preferences:get 'drracket:recently-closed-tabs)) (define file-to-open (for/or ([file (in-list closed-tabs)]) (define filename (first file)) - (and (not (find-matching-tab filename)) - (file-exists? filename) + (and (file-exists? filename) (set! closed-tabs (cdr closed-tabs)) filename))) - (open-in-new-tab file-to-open) - (preferences:set 'framework:recently-closed-tabs closed-tabs) + (when file-to-open + (let ((tab (find-matching-tab file-to-open))) + (if tab + (change-to-tab tab) + (open-in-new-tab file-to-open)))) + (preferences:set 'drracket:recently-closed-tabs closed-tabs) #f)) (define/public (get-tab-count) (length tabs)) @@ -3415,11 +3418,31 @@ (update-close-tab-menu-item-shortcut close-tab-menu-item)) (update-close-menu-item-shortcut (file-menu:get-close-item))) + ;; truncate-list : (listof X) -> (listof X)[< new-len] + ;; takes a list and returns the + ;; front of the list, up to 'new-len' number of items + (define (truncate-list l new-len) + (define len (length l)) + (cond + [(<= len new-len) l] + [else (drop-right l (- len new-len))])) + (define/private (update-closed-tabs tab) (define tab-filename (send (send tab get-defs) get-filename)) (when tab-filename - (define closed-tabs (preferences:get 'framework:recently-closed-tabs)) - (preferences:set 'framework:recently-closed-tabs (cons (list tab-filename 0 0) closed-tabs)))) + (let* ([old-closed-tabs (preferences:get 'drracket:recently-closed-tabs)] + [max-list-len (preferences:get 'drracket:recently-closed-tabs-max-count)] + [defs (send tab get-defs)] + [start-pos (send defs get-start-position)] + [end-pos (send defs get-end-position)] + [new-ent (list tab-filename start-pos end-pos)]) + (define new-closed-tabs (cons new-ent + (remove* (list new-ent) + old-closed-tabs + (λ (l1 l2) + (pathname-equal? (car l1) (car l2)))))) + (set! new-closed-tabs (truncate-list new-closed-tabs max-list-len)) + (preferences:set 'drracket:recently-closed-tabs new-closed-tabs)))) (define/private (update-close-tab-menu-item-shortcut item) (define just-one? (and (pair? tabs) (null? (cdr tabs)))) diff --git a/drracket/scribblings/tools/unit.scrbl b/drracket/scribblings/tools/unit.scrbl index 38c123876..ffbf94ca7 100644 --- a/drracket/scribblings/tools/unit.scrbl +++ b/drracket/scribblings/tools/unit.scrbl @@ -628,6 +628,10 @@ Returns the currently active tab. Creates a new tab. } +@defmethod[(reopen-closed-tab) void?]{ + Opens the most recently closed tabs. +} + @defmethod[(next-tab) void?]{ Switches to the next tab. } From 6d47e7be9d93659a4eae28de7fc56abe36d4be18 Mon Sep 17 00:00:00 2001 From: squarebat Date: Wed, 26 Jan 2022 21:58:40 +0530 Subject: [PATCH 5/6] modify: tab upper limit, docs, method args --- drracket/drracket/HISTORY.txt | 9 +++++++++ drracket/drracket/private/main.rkt | 2 +- drracket/drracket/private/unit.rkt | 11 ++++++----- drracket/scribblings/tools/unit.scrbl | 8 ++++++-- 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/drracket/drracket/HISTORY.txt b/drracket/drracket/HISTORY.txt index bf76f95e1..0a52a8508 100644 --- a/drracket/drracket/HISTORY.txt +++ b/drracket/drracket/HISTORY.txt @@ -1,3 +1,12 @@ +------------------------------ + Version 8.5 +------------------------------ + + . added new file menu item 'Reopen Closed Tab' to open previously + closed tabs. + . Removed keyboard shortcut for 'Spell Check test' in edit menu due + to conflict with 'Reopen Closed Tab'. + ------------------------------ Version 8.4 ------------------------------ diff --git a/drracket/drracket/private/main.rkt b/drracket/drracket/private/main.rkt index 178659033..0699a73ce 100644 --- a/drracket/drracket/private/main.rkt +++ b/drracket/drracket/private/main.rkt @@ -648,7 +648,7 @@ l)))) (preferences:set-default 'drracket:recently-closed-tabs-max-count - 50 + 1000 (λ (x) (and (number? x) (x . > . 0) (integer? x)))) diff --git a/drracket/drracket/private/unit.rkt b/drracket/drracket/private/unit.rkt index c3158b126..4c69d3036 100644 --- a/drracket/drracket/private/unit.rkt +++ b/drracket/drracket/private/unit.rkt @@ -3075,7 +3075,7 @@ ;; create-new-tab : -> void ;; creates a new tab and updates the GUI for that new tab (define/public create-new-tab - (lambda ([filename #f]) + (lambda ([filename #f] [start-pos 0] [end-pos 'same]) (let* ([defs (new (drracket:get/extend:get-definitions-text))] [tab-count (length tabs)] [new-tab (new (drracket:get/extend:get-tab) @@ -3086,6 +3086,7 @@ (ints-shown? (not filename)))] [ints (make-object (drracket:get/extend:get-interactions-text) new-tab)]) (send new-tab set-ints ints) + (send (send new-tab get-defs) set-position start-pos end-pos) (set! tabs (append tabs (list new-tab))) (send tabs-panel append (gui-utils:trim-string @@ -3266,8 +3267,8 @@ #t] [else #f])) - (define/public (open-in-new-tab filename) - (create-new-tab filename)) + (define/public (open-in-new-tab filename [start-pos 0] [end-pos 0]) + (create-new-tab filename start-pos end-pos)) ;; reopen-closed-tab : -> void ;; Opens previously closed tabs. If no tabs were closed in current session, files from @@ -3421,7 +3422,7 @@ ;; truncate-list : (listof X) -> (listof X)[< new-len] ;; takes a list and returns the ;; front of the list, up to 'new-len' number of items - (define (truncate-list l new-len) + (define/private (truncate-list l new-len) (define len (length l)) (cond [(<= len new-len) l] @@ -4110,7 +4111,7 @@ (mk-menu-item (λ (ed) (send ed get-spell-check-text)) (λ (ed new-val) (send ed set-spell-check-text new-val)) 'framework:spell-check-text? - #\t + #f (string-constant spell-check-scribble-text)) (new menu:can-restore-menu-item% diff --git a/drracket/scribblings/tools/unit.scrbl b/drracket/scribblings/tools/unit.scrbl index ffbf94ca7..aed2d347b 100644 --- a/drracket/scribblings/tools/unit.scrbl +++ b/drracket/scribblings/tools/unit.scrbl @@ -619,9 +619,13 @@ Returns the currently active tab. Returns the number of open tabs in the frame. } -@defmethod[(open-in-new-tab [filename (or/c path-string? #f)]) void?]{ +@defmethod[(open-in-new-tab [filename (or/c path-string? #f)] + [start exact-nonnegative-integer? 0] + [end (or/c exact-nonnegative-integer? 'same) 'same]) + void?]{ Opens a new tab in this frame. If @racket[filename] is a @racket[path-string?], - It loads that file in the definitions window of the new tab. + It loads that file in the definitions window of the new tab. If @racket[start] and + @racket[end] are provided, it updates the tab's corresponding insertion positions. } @defmethod[(create-new-tab) void?]{ From cfad8a79d7381b6cc58e4233e97923e51d98788a Mon Sep 17 00:00:00 2001 From: squarebat Date: Wed, 26 Jan 2022 22:29:17 +0530 Subject: [PATCH 6/6] modify: pos args to kwargs --- drracket/drracket/private/unit.rkt | 14 ++++++++------ drracket/scribblings/tools/unit.scrbl | 8 ++++---- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/drracket/drracket/private/unit.rkt b/drracket/drracket/private/unit.rkt index 4c69d3036..010dd4deb 100644 --- a/drracket/drracket/private/unit.rkt +++ b/drracket/drracket/private/unit.rkt @@ -3075,7 +3075,7 @@ ;; create-new-tab : -> void ;; creates a new tab and updates the GUI for that new tab (define/public create-new-tab - (lambda ([filename #f] [start-pos 0] [end-pos 'same]) + (lambda ([filename #f] #:start-pos [start-pos 0] #:end-pos [end-pos 'same]) (let* ([defs (new (drracket:get/extend:get-definitions-text))] [tab-count (length tabs)] [new-tab (new (drracket:get/extend:get-tab) @@ -3267,8 +3267,8 @@ #t] [else #f])) - (define/public (open-in-new-tab filename [start-pos 0] [end-pos 0]) - (create-new-tab filename start-pos end-pos)) + (define/public (open-in-new-tab filename #:start-pos [start-pos 0] #:end-pos [end-pos 'same]) + (create-new-tab filename #:start-pos start-pos #:end-pos end-pos)) ;; reopen-closed-tab : -> void ;; Opens previously closed tabs. If no tabs were closed in current session, files from @@ -3281,12 +3281,14 @@ (define filename (first file)) (and (file-exists? filename) (set! closed-tabs (cdr closed-tabs)) - filename))) + file))) (when file-to-open - (let ((tab (find-matching-tab file-to-open))) + (let ([tab (find-matching-tab (car file-to-open))] + [start-pos (cadr file-to-open)] + [end-pos (caddr file-to-open)]) (if tab (change-to-tab tab) - (open-in-new-tab file-to-open)))) + (open-in-new-tab (car file-to-open) #:start-pos start-pos #:end-pos end-pos)))) (preferences:set 'drracket:recently-closed-tabs closed-tabs) #f)) diff --git a/drracket/scribblings/tools/unit.scrbl b/drracket/scribblings/tools/unit.scrbl index aed2d347b..ca92fb741 100644 --- a/drracket/scribblings/tools/unit.scrbl +++ b/drracket/scribblings/tools/unit.scrbl @@ -620,12 +620,12 @@ Returns the currently active tab. } @defmethod[(open-in-new-tab [filename (or/c path-string? #f)] - [start exact-nonnegative-integer? 0] - [end (or/c exact-nonnegative-integer? 'same) 'same]) + [#:start-pos start-pos exact-nonnegative-integer? 0] + [#:end-pos end-pos (or/c exact-nonnegative-integer? 'same) 'same]) void?]{ Opens a new tab in this frame. If @racket[filename] is a @racket[path-string?], - It loads that file in the definitions window of the new tab. If @racket[start] and - @racket[end] are provided, it updates the tab's corresponding insertion positions. + It loads that file in the definitions window of the new tab. If @racket[start-pos] and + @racket[end-pos] are provided, it updates the tab's corresponding insertion positions. } @defmethod[(create-new-tab) void?]{