Как использовать cl-letf
или аналогично переопределять значение функции символа во время асинхронного вызова? Я хочу остановить отображение буфера после вызовов на start-process
или start-process-shell-command
, а вместо этого вместо этого вернет строку.Значение функции переопределения с асинхронным вызовом
Вот упрощенный пример, где привязка display-buffer
работает для синхронной версии, но не для асинхронной версии. Кроме того, я установил лексическое привязку к true.
(defun tst-fun-sync (url)
(call-process "wget" nil "*wget*" nil url "-O" "-")
(with-current-buffer "*wget*"
(display-buffer (current-buffer))))
(defun tst-fun-async (url)
(set-process-sentinel
(start-process "wget" "*wget*" "wget" url "-O" "-")
#'(lambda (p _m)
(when (zerop (process-exit-status p))
(with-current-buffer (process-buffer p)
(display-buffer (current-buffer)))))))
(defun tst-fun-no-display (fun &rest args)
(cl-letf (((symbol-function 'display-buffer)
#'(lambda (&rest _ignored)
(message "%s" (buffer-string)))))
(apply fun args)))
;; The first has desired result, but not the second
;; (tst-fun-no-display 'tst-fun-sync "http://www.stackoverflow.com")
;; (tst-fun-no-display 'tst-fun-async "http://www.stackoverflow.com")
Как насчет использования 'shell-command-to-string'? Например, '(replace-regexp-in-string" \ n "" "(shell-command-to-string" date "))' Нет необходимости отображать буфер для работы с ним, т. Е. Нет нужно использовать «display-buffer» в вашем примере, который я вижу. – lawlist
Вы также можете быть заинтересованы в фильтрах процессов, которые могут захватывать весь вывод процесса в виде строк. https://www.gnu.org/software/emacs/manual/html_node/elisp/Filter-Functions.html – lawlist