@@ -186,13 +186,17 @@ Leave point on the first amount, if any, otherwise the first account."
186186(defvar-local ledger-xact--preview-timer nil )
187187(defvar-local ledger-xact--date nil
188188 " In a minibuffer for the transaction text, the transaction date." )
189- (defvar-local ledger-xact--ledger-buf nil
190- " In a minibuffer for the transaction text, the original ledger buffer. " )
189+ (defvar-local ledger-xact--ledger-buf-file nil
190+ " In a minibuffer for the transaction text, the input file.
191191
192- (defun ledger-xact--preview (ledger-buf date args )
192+ The original ledger buffer is written to this temporary file so it can
193+ be read by ledger. This is quite a bit faster than passing in the input
194+ via `process-send-region' ." )
195+
196+ (defun ledger-xact--preview (date args )
193197 " Run \" ledger xact\" with DATE and ARGS and display the output.
194198
195- LEDGER-BUF's contents are passed as input to \" ledger xact\" .
199+ `ledger-xact--ledger-buf-file' is used as input to \" ledger xact\" .
196200
197201Return the window displaying the output buffer, or nil if it was not
198202displayed."
@@ -206,6 +210,7 @@ displayed."
206210 (setq buffer-read-only t )
207211 (set-buffer-modified-p nil )
208212 (current-buffer ))))
213+ (input-file ledger-xact--ledger-buf-file)
209214 window)
210215 (with-current-buffer preview-buf
211216 (with-silent-modifications
@@ -225,23 +230,22 @@ displayed."
225230 ; ; -" (even before the user has begun typing any input) and merely
226231 ; ; inputting "xact" commands at the REPL when the input changes?
227232 (erase-buffer )
228- (with-current-buffer ledger-buf
229- (while-no-input
230- (unwind-protect
231- (let ((proc (make-process
232- :name " ledger-xact-preview"
233- :buffer preview-buf
234- :command (append (list ledger-binary-path
235- " -f" " -" " xact" date)
236- args)
237- :noquery t
238- :connection-type 'pipe
239- :sentinel #'ignore )))
240- (process-send-region proc (point-min ) (point-max ))
241- (process-send-eof proc)
242- (while (accept-process-output proc)))
243- (when (get-buffer-process preview-buf)
244- (delete-process preview-buf)))))
233+ (while-no-input
234+ (unwind-protect
235+ (let ((proc (make-process
236+ :name " ledger-xact-preview"
237+ :buffer preview-buf
238+ :command (append (list ledger-binary-path
239+ " -f" input-file
240+ " xact" date)
241+ args)
242+ :noquery t
243+ :connection-type 'pipe
244+ :sentinel #'ignore )))
245+ (process-send-eof proc)
246+ (while (accept-process-output proc)))
247+ (when (get-buffer-process preview-buf)
248+ (delete-process preview-buf))))
245249 (ledger-post-align-postings (point-min ) (point-max ))))
246250 (setq window
247251 (display-buffer preview-buf
@@ -263,10 +267,9 @@ displayed."
263267 (when (and (buffer-live-p minibuffer)
264268 (eq minibuffer (window-buffer (active-minibuffer-window ))))
265269 (with-current-buffer minibuffer
266- (let ((ledger-buf ledger-xact--ledger-buf)
267- (date ledger-xact--date))
270+ (let ((date ledger-xact--date))
268271 (when-let* ((args (ledger-parse-transaction-text (minibuffer-contents ))))
269- (ledger-xact--preview ledger-buf date args))))))
272+ (ledger-xact--preview date args))))))
270273
271274(defun ledger-xact--after-change-function (_beg _end _len )
272275 " Added to `after-change-functions' in transaction-reading minibuffers."
@@ -289,20 +292,33 @@ displayed."
289292 (when-let* ((window (get-buffer-window ledger-xact--preview-buffer-name)))
290293 (delete-window window))))
291294
295+ (defun ledger-xact--delete-preview-temp-file ()
296+ (when ledger-xact--ledger-buf-file
297+ (delete-file ledger-xact--ledger-buf-file)))
298+
292299(defun ledger-read-transaction-text (date )
293300 " Read the text of a transaction with date DATE.
294301
295302The ledger buffer should be current when this function is called, since
296303it will be used as input for \" ledger xact\" for the sake of previewing
297304output."
298- (let ((ledger-buf (current-buffer )))
305+ (let ((ledger-buf (current-buffer ))
306+ (ledger-buf-dir default-directory))
299307 (minibuffer-with-setup-hook
300308 (lambda ()
301- (setq ledger-xact--date date
302- ledger-xact--ledger-buf ledger-buf)
303309 (when ledger-add-transaction-idle-preview
310+ (setq ledger-xact--date date
311+ ledger-xact--ledger-buf-file
312+ (let* ((temporary-file-directory ledger-buf-dir)
313+ (filename (make-temp-file " ldg-xact-preview" nil " .ldg" )))
314+ (with-current-buffer ledger-buf
315+ (save-restriction
316+ (widen )
317+ (write-region nil nil filename nil 'nomessage )))
318+ filename))
304319 (add-hook 'after-change-functions #'ledger-xact--after-change-function nil t )
305- (add-hook 'minibuffer-exit-hook #'ledger-xact--hide-preview-window nil t )))
320+ (add-hook 'minibuffer-exit-hook #'ledger-xact--hide-preview-window nil t )
321+ (add-hook 'minibuffer-exit-hook #'ledger-xact--delete-preview-temp-file nil t )))
306322 (read-string (concat " xact " date " : " ) nil 'ledger-minibuffer-history ))))
307323
308324(defun ledger-read-transaction ()
0 commit comments