Subject: 27.2; eshell-command not working async

From: Thierry Volpiatto <[email-masked]>
Date: Thu, 26 Aug 2021 09:20:47 +0000

When running a command in eshell ending with "&" the command should not
block emacs, it should run asynchronously.
It seems it is broken since 2005:

  ;; 6b6f91b357f6fe2f1e0d72f046a1b8d8a2d6d8c3
  ;; Author:     John Wiegley <[email-masked]>
  ;; AuthorDate: Fri May 27 02:57:18 2005 +0000
  ;; Commit:     John Wiegley <[email-masked]>
  ;; CommitDate: Fri May 27 02:57:18 2005 +0000

To allow my eshell aliases ending with "&" working in helm-find-files I
use this advice:

    (defun helm--advice-eshell-eval-command (command &optional input)
      "Fix return value when command ends with \"&\"."
      ;; Fix this emacs commit which is plain wrong as it returns
      ;; either nil or an error (double because format spec doesn't
      ;; always match specifier) whereas it should return either a
      ;; single element (CAR DELIM) or DELIM itself if the car of
      ;; DELIM is a process.
      ;; This prevent running eshell-command async when needed i.e. when
      ;; command ends with "&".
      ;;
      ;; 6b6f91b357f6fe2f1e0d72f046a1b8d8a2d6d8c3
      ;; Author:     John Wiegley <[email-masked]>
      ;; AuthorDate: Fri May 27 02:57:18 2005 +0000
      ;; Commit:     John Wiegley <[email-masked]>
      ;; CommitDate: Fri May 27 02:57:18 2005 +0000
      (if eshell-current-command
          ;; we can just stick the new command at the end of the current
          ;; one, and everything will happen as it should
          (setcdr (last (cdr eshell-current-command))
    	      (list `(let ((here (and (eobp) (point))))
                           ,(and input
                                 `(insert-and-inherit ,(concat input "\n")))
                           (if here
                               (eshell-update-markers here))
                           (eshell-do-eval ',command))))
        (and eshell-debug-command
             (with-current-buffer (get-buffer-create "*eshell last cmd*")
               (erase-buffer)
               (insert "command: \"" input "\"\n")))
        (setq eshell-current-command command)
        (let* ((delim (catch 'eshell-incomplete
    		    (eshell-resume-eval)))
               (val (car-safe delim)))
          ;; If the return value of `eshell-resume-eval' is wrapped in a
          ;; list, it indicates that the command was run asynchronously.
          ;; In that case, unwrap the value before checking the delimiter
          ;; value.
          (if (and val
                   (not (processp val))
                   (not (eq val t)))
              (error "Unmatched delimiter: %S" val)
            ;; Eshell-command expect a list like (<process>) to know if the
            ;; command should be async or not.
            (or (and (processp val) delim) val)))))

In GNU Emacs 27.2 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.22.30, cairo version 1.15.10)
 of 2021-03-25 built on IPadS340
Windowing system distributor 'The X.Org Foundation', version 11.0.12008000
System Description: Linux Mint 19.3

Recent messages:
[perl]+ Done (/usr/bin/perl -w /usr/bin/aunpack nyxt-config-master.zip)
previous-line: Beginning of buffer [9 times]
[mu4e] Retrieving mail...done
[mu4e] Indexing... processed 7, updated 7
[mu4e] Indexing completed; processed 7, updated 7, cleaned-up 0
[mu4e] Found 1 matching message
Auto-saving...done
Mark set
Auto-saving...done
Mark set [4 times]

Configured using:
 'configure CFLAGS=-O8 --without-dbus --without-gconf
 --without-gsettings --with-mailutils --with-cairo'

Configured features:
XPM JPEG TIFF GIF PNG RSVG CAIRO SOUND GPM GLIB NOTIFY INOTIFY ACL
LIBSELINUX GNUTLS LIBXML2 FREETYPE HARFBUZZ M17N_FLT LIBOTF ZLIB
TOOLKIT_SCROLL_BARS GTK3 X11 XDBE XIM MODULES THREADS LIBSYSTEMD JSON
PDUMPER LCMS2 GMP

Important settings:
  value of $LANG: fr_FR.UTF-8
  locale-coding-system: utf-8-unix

Major mode: Elisp

Minor modes in effect:
  bug-reference-prog-mode: t
  global-undo-tree-mode: t
  undo-tree-mode: t
  global-ligature-mode: t
  ligature-mode: t
  psession-mode: t
  psession-savehist-mode: t
  global-git-gutter-mode: t
  git-gutter-mode: t
  display-time-mode: t
  winner-mode: t
  show-paren-mode: t
  helm-epa-mode: t
  helm-descbinds-mode: t
  helm-adaptive-mode: t
  helm-mode: t
  shell-dirtrack-mode: t
  helm-popup-tip-mode: t
  async-bytecomp-package-mode: t
  dired-async-mode: t
  minibuffer-depth-indicate-mode: t
  override-global-mode: t
  tooltip-mode: t
  global-eldoc-mode: t
  eldoc-mode: t
  mouse-wheel-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  column-number-mode: t
  line-number-mode: t
  transient-mark-mode: t

Load-path shadows:
/home/thierry/.emacs.d/elpa/magit-20210822.529/magit-section-pkg hides /home/thierry/.emacs.d/elpa/magit-section-20210819.1119/magit-section-pkg
/home/thierry/.emacs.d/elpa/async-20210823.528/async-bytecomp hides /usr/local/share/emacs/site-lisp/emacs-async/async-bytecomp
/home/thierry/.emacs.d/elpa/async-20210823.528/async hides /usr/local/share/emacs/site-lisp/emacs-async/async
/home/thierry/.emacs.d/elpa/async-20210823.528/async-pkg hides /usr/local/share/emacs/site-lisp/emacs-async/async-pkg
/home/thierry/.emacs.d/elpa/async-20210823.528/smtpmail-async hides /usr/local/share/emacs/site-lisp/emacs-async/smtpmail-async
/home/thierry/.emacs.d/elpa/async-20210823.528/dired-async hides /usr/local/share/emacs/site-lisp/emacs-async/dired-async
/home/thierry/.emacs.d/elpa/async-20210823.528/async-autoloads hides /usr/local/share/emacs/site-lisp/emacs-async/async-autoloads
/home/thierry/.emacs.d/elpa/seq-2.22/seq hides /usr/local/share/emacs/27.2/lisp/emacs-lisp/seq

Features:
(shadow epa-mail face-remap emacsbug helm-command helm-ls-hg vc-hg
em-unix em-term term disp-table ehelp em-script em-prompt em-ls em-hist
em-pred em-glob em-dirs esh-var em-cmpl em-basic em-banner em-alias
esh-mode helm-dabbrev qp smerge-mode helm-apt sort gnus-cite w3m-form
w3m-symbol w3m timezone w3m-hist w3m-fb bookmark-w3m w3m-ems w3m-favicon
w3m-image tab-line w3m-proc w3m-util mm-archive smiley mail-extr view
addressbook-bookmark mu4e-config org-mu4e mu4e-contrib eshell esh-cmd
esh-ext esh-opt esh-proc esh-io esh-arg esh-module esh-groups esh-util
mu4e-patch mu4e mu4e-org mu4e-main mu4e-view mu4e-view-gnus gnus-art
mm-uu mml2015 mm-view mml-smime smime dig mu4e-view-common mu4e-headers
mu4e-compose mu4e-context mu4e-draft mu4e-actions ido rfc2368 smtpmail
sendmail mu4e-mark mu4e-proc mu4e-utils mu4e-lists mu4e-message
flow-fill hl-line mu4e-vars mu4e-meta helm-x-files helm-for-files
helm-bookmark bookmark pp org-element avl-tree generator ol-eww eww
mm-url url-queue ol-rmail ol-mhe ol-irc ol-info ol-gnus nnir gnus-sum
shr svg dom gnus-group gnus-undo gnus-start gnus-cloud nnimap nnmail
mail-source utf7 netrc nnoo gnus-spec gnus-int gnus-range gnus-win
ol-docview doc-view jka-compr image-mode exif ol-bibtex bibtex ol-bbdb
ol-w3m image-file tramp-archive tramp-gvfs dbus helm-firefox
bug-reference naquadah-theme solar cal-dst holidays hol-loaddefs
tv-utils undo-tree diff rx ligature rainbow-mode color psession frameset
log-view pcvs-util pcmpl-git cl-indent ffap autocrypt-message message
rmc puny rfc822 mml mml-sec mm-decode mm-bodies mm-encode mail-parse
rfc2231 mailabbrev gmm-utils mailheader autocrypt-gnus gnus nnheader
gnus-util rmail rmail-loaddefs rfc2047 rfc2045 text-property-search
mail-utils mm-util mail-prsvr autocrypt-mu4e autocrypt ietf-drums
config-w3m git-gutter mule-util appt diary-lib diary-loaddefs gud
anaconda-mode xref project pythonic f dash s pcomplete-extension
pcmpl-unix pcmpl-gnu iterator wdired dired-extension org-config
ob-gnuplot org-crypt net-utils time pcase all-the-icons
all-the-icons-faces data-material data-weathericons data-octicons
data-fileicons data-faicons data-alltheicons winner w3m-wget wget
thingatpt wget-sysdep autotest-mode autoconf-mode paren woman man ediff
ediff-merg ediff-mult ediff-wind ediff-diff ediff-help ediff-init
ediff-util init-helm helm-fd epa derived epg epg-config helm-epa
helm-misc helm-imenu imenu helm-elisp-package helm-find helm-org org ob
ob-tangle ob-ref ob-lob ob-table ob-exp org-macro org-footnote org-src
ob-comint org-pcomplete org-list org-faces org-entities noutline outline
org-version ob-emacs-lisp ob-core ob-eval org-table ol org-keys
org-compat advice org-macs org-loaddefs cal-menu calendar cal-loaddefs
helm-external helm-net xml url url-proxy url-privacy url-expand
url-methods url-history url-cookie url-domsuf url-util mailcap
isearch-light helm-descbinds cus-edit wid-edit helm-ls-git vc-git
diff-mode vc vc-dispatcher helm-ipython helm-elisp helm-eval edebug
backtrace find-func helm-info python tramp-sh helm-adaptive helm-mode
helm-files filenotify tramp tramp-loaddefs trampver tramp-integration
files-x tramp-compat shell pcomplete parse-time iso8601 time-date
ls-lisp helm-buffers helm-occur helm-tags helm-locate helm-grep
wgrep-helm wgrep grep compile comint ansi-color ring helm-regexp
format-spec helm-utils helm-help helm-types helm-extensions-autoloads
helm-config helm-autoloads helm async-bytecomp helm-global-bindings
helm-easymenu helm-source helm-multi-match helm-lib dired-async
dired-aux dired dired-loaddefs async popup diminish cl-extra help-mode
mb-depth server edmacro kmacro avoid cus-start cus-load use-package
use-package-ensure use-package-delight use-package-diminish
use-package-bind-key bind-key easy-mmode use-package-core info w3m-load
package easymenu browse-url url-handlers url-parse auth-source cl-seq
eieio eieio-core cl-macs eieio-loaddefs password-cache json subr-x map
url-vars seq byte-opt gv bytecomp byte-compile cconv cl-loaddefs cl-lib
tooltip eldoc electric uniquify ediff-hook vc-hooks lisp-float-type
mwheel term/x-win x-win term/common-win x-dnd tool-bar dnd fontset image
regexp-opt fringe tabulated-list replace newcomment text-mode elisp-mode
lisp-mode prog-mode register page tab-bar menu-bar rfn-eshadow isearch
timer select scroll-bar mouse jit-lock font-lock syntax facemenu
font-core term/tty-colors frame minibuffer cl-generic cham georgian
utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean
japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european
ethiopic indian cyrillic chinese composite charscript charprop
case-table epa-hook jka-cmpr-hook help simple abbrev obarray
cl-preloaded nadvice loaddefs button faces cus-face macroexp files
text-properties overlay sha1 md5 base64 format env code-pages mule
custom widget hashtable-print-readable backquote threads inotify lcms2
dynamic-setting font-render-setting cairo move-toolbar gtk x-toolkit x
multi-tty make-network-process emacs)

Memory information:
((conses 16 530246 231953)
 (symbols 48 40848 1)
 (strings 32 169294 34500)
 (string-bytes 1 10791227)
 (vectors 16 76495)
 (vector-slots 8 1628858 276768)
 (floats 8 1729 733)
 (intervals 56 5114 2125)
 (buffers 1000 116))
<#secure method=pgpmime mode=sign>

-- 
Thierry