summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJose Antonio Ortega Ruiz <jao@gnu.org>2015-01-19 02:46:00 +0100
committerJose Antonio Ortega Ruiz <jao@gnu.org>2015-01-19 02:46:00 +0100
commit7b9383db986ee9ed9ab5287af64440ae1f94dfd7 (patch)
treec3604329d6482a30d013d77503f3df452732ee18
parent27b7eacc9c062328d189337e02c2229b4be3e3c7 (diff)
downloadgeiser-guile-7b9383db986ee9ed9ab5287af64440ae1f94dfd7.tar.gz
geiser-guile-7b9383db986ee9ed9ab5287af64440ae1f94dfd7.tar.bz2
Not cleaning the image cache before displaying images
Image cache cleaning was being performed during comint output filtering and, since that can happen in batches, if the total output had more images than the maximum cache size, some of them would be gone (in fact it was even worse: we were cleaning the cache after each image display). Now we just perform cache maintenance before sending the input, and avoid paying a price for non-rackets by making the cache dir setting implementation-specific.
-rw-r--r--elisp/geiser-image.el38
-rw-r--r--elisp/geiser-racket.el10
-rw-r--r--elisp/geiser-repl.el3
3 files changed, 29 insertions, 22 deletions
diff --git a/elisp/geiser-image.el b/elisp/geiser-image.el
index 1d8a03a..3e2a666 100644
--- a/elisp/geiser-image.el
+++ b/elisp/geiser-image.el
@@ -1,6 +1,6 @@
;; geiser-image.el -- support for image display
-;; Copyright (c) 2012 Jose Antonio Ortega Ruiz
+;; Copyright (c) 2012, 2015 Jose Antonio Ortega Ruiz
;; This program is free software; you can redistribute it and/or
;; modify it under the terms of the Modified BSD License. You should
@@ -14,6 +14,7 @@
(require 'geiser-custom)
(require 'geiser-base)
+(require 'geiser-impl)
;;; Customization:
@@ -34,34 +35,35 @@
:group 'geiser-image)
(geiser-custom--defcustom geiser-image-cache-dir nil
- ;; Currently, this variable is updated, if needed, by racket during
- ;; initialization. If/when we add image support for other
- ;; implementations, we'll have to work with implementation-specific
- ;; caches.
- "Directory where generated images are stored. If nil, the
-system wide tmp dir will be used."
+ "Default directory where generated images are stored.
+
+If nil,the system wide tmp dir will be used."
:type 'path
:group 'geiser-image)
(geiser-custom--defface image-button
'button geiser-image "image buttons in terminal buffers")
+(geiser-impl--define-caller geiser-image--cache-dir image-cache-dir ()
+ "Directory where generated images are stored. If this function
+returns nil, no images are generated.")
+
(defun geiser-image--list-cache ()
"List all the images in the image cache."
- (and geiser-image-cache-dir
- (file-directory-p geiser-image-cache-dir)
- (let ((files (directory-files-and-attributes
- geiser-image-cache-dir t "geiser-img-[0-9]*.png")))
- (mapcar 'car
- (sort files (lambda (a b)
- (< (float-time (nth 6 a))
- (float-time (nth 6 b)))))))))
+ (let ((cdir (geiser-image--cache-dir nil)))
+ (and cdir
+ (file-directory-p cdir)
+ (let ((files (directory-files-and-attributes cdir t
+ "geiser-img-[0-9]*.png")))
+ (mapcar 'car (sort files (lambda (a b)
+ (< (float-time (nth 6 a))
+ (float-time (nth 6 b))))))))))
(defun geiser-image--clean-cache ()
"Clean all except for the last `geiser-image-cache-keep-last'
-images in `geiser-image-cache-dir'."
+images in `geiser-image--cache-dir'."
(interactive)
(dolist (f (butlast (geiser-image--list-cache) geiser-image-cache-keep-last))
(delete-file f)))
@@ -101,9 +103,7 @@ images in `geiser-image-cache-dir'."
(if (and inline-images-p (display-images-p))
(insert-image (create-image file) "[image]")
(geiser-image--insert-button file)
- (when auto-p (geiser-image--display file)))
- (setq geiser-image-cache-dir (file-name-directory file))
- (geiser-image--clean-cache)))))
+ (when auto-p (geiser-image--display file)))))))
seen))
(defun geiser-view-last-image (n)
diff --git a/elisp/geiser-racket.el b/elisp/geiser-racket.el
index 8a0d46d..6a849e3 100644
--- a/elisp/geiser-racket.el
+++ b/elisp/geiser-racket.el
@@ -1,6 +1,6 @@
;; geiser-racket.el -- geiser support for Racket scheme
-;; Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014 Jose Antonio Ortega Ruiz
+;; Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015 Jose Antonio Ortega Ruiz
;; This program is free software; you can redistribute it and/or
;; modify it under the terms of the Modified BSD License. You should
@@ -366,6 +366,8 @@ using start-geiser, a procedure in the geiser/server module."
(defun geiser-racket--version (binary)
(shell-command-to-string (format "%s -e '(display (version))'" binary)))
+(defvar geiser-racket--image-cache-dir nil)
+
(defun geiser-racket--startup (remote)
(set (make-local-variable 'compilation-error-regexp-alist)
`(("^ *\\([^:(\t\n]+\\):\\([0-9]+\\):\\([0-9]+\\):" 1 2 3)))
@@ -373,9 +375,12 @@ using start-geiser, a procedure in the geiser/server module."
(if geiser-image-cache-dir
(geiser-eval--send/wait
`(:eval (image-cache ,geiser-image-cache-dir) geiser/user))
- (setq geiser-image-cache-dir
+ (setq geiser-racket--image-cache-dir
(geiser-eval--send/result '(:eval (image-cache) geiser/user)))))
+(defun geiser-racket--image-cache-dir ()
+ (or geiser-image-cache-dir geiser-racket--image-cache-dir))
+
;;; Additional commands
@@ -434,6 +439,7 @@ Use a prefix to be asked for a submodule name."
(external-help geiser-racket--external-help)
(check-buffer geiser-racket--guess)
(keywords geiser-racket--keywords)
+ (image-cache-dir geiser-racket--image-cache-dir)
(case-sensitive geiser-racket-case-sensitive-p)
(binding-forms geiser-racket--binding-forms)
(binding-forms* geiser-racket--binding-forms*))
diff --git a/elisp/geiser-repl.el b/elisp/geiser-repl.el
index 9ecbd25..c5c0490 100644
--- a/elisp/geiser-repl.el
+++ b/elisp/geiser-repl.el
@@ -1,6 +1,6 @@
;;; geiser-repl.el --- Geiser's REPL
-;; Copyright (C) 2009, 2010, 2011, 2012, 2013 Jose Antonio Ortega Ruiz
+;; Copyright (C) 2009, 2010, 2011, 2012, 2013, 2015 Jose Antonio Ortega Ruiz
;; This program is free software; you can redistribute it and/or
;; modify it under the terms of the Modified BSD License. You should
@@ -440,6 +440,7 @@ module command as a string")
(setq geiser-eval--default-connection-function 'geiser-repl--connection)
(defun geiser-repl--prepare-send ()
+ (geiser-image--clean-cache)
(geiser-autodoc--inhibit-autodoc)
(geiser-con--connection-deactivate geiser-repl--connection))