elisp – Capturando stderr de subprocesos

Pregunta:

Estoy tratando de capturar stderr por separado de stdout para un proceso (sincrónico) que se ejecuta desde emacs. Encontré una forma de hacerlo basada en un código copiado de la función shell-command de emacs (no quiero usar shell-command directamente porque no hay necesidad de un shell y shell-command pone stdout en un búfer ):

(defun helm-dash-sql (db-path sql)
  "Run the sql command, parse the results and display errors"
  (helm-dash-parse-sql-results
   (with-output-to-string
     (let ((error-file (make-temp-file "helm-dash-errors-file")))
       (call-process "sqlite3" nil (list standard-output error-file) nil
                     ;; args for sqlite3:
                     db-path sql)

       ;; display errors, stolen from emacs' `shell-command` function
       (when (and error-file (file-exists-p error-file))
         (if (< 0 (nth 7 (file-attributes error-file)))
             (with-current-buffer (get-buffer-create "*helm-dash-errors*")
               (let ((pos-from-end (- (point-max) (point))))
                 (or (bobp)
                     (insert "\f\n"))
                 ;; Do no formatting while reading error file,
                 ;; because that can run a shell command, and we
                 ;; don't want that to cause an infinite recursion.
                 (format-insert-file error-file nil)
                 ;; Put point after the inserted errors.
                 (goto-char (- (point-max) pos-from-end)))
               (display-buffer (current-buffer))))
     (delete-file error-file))))))

Sin embargo, sospecho que podría hacerse mejor de dos maneras:

  1. Parece que esto debería ser un problema resuelto y emacs debería tener una función que simplemente "hace lo correcto" con stderr, pero no puedo encontrar una. ¿Existe tal función?

  2. Cada vez que se ejecuta un proceso, shell-command crea (y luego elimina) un archivo temporal en el que almacenar stderr. Nos preocupa un poco que esto pueda tener un impacto en el rendimiento porque se ejecutan múltiples procesos para cada pulsación de tecla mientras se encuentra dentro de este comando de helm . ¿Es probable que esto sea un problema y, de ser así, cuál es la mejor manera de solucionarlo?


Para cualquiera que tenga curiosidad: esto es para helm-dash . El código exacto que estoy usando actualmente está en esta solicitud de extracción .

Respuesta:

Esto está arreglado en Emacs 25, donde puede usar la función make-process con el argumento :stderr . No creo que haya nada adecuado en Emacs 24.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım