unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: Samer Masterson <samer@samertm.com>
To: Eli Zaretskii <eliz@gnu.org>
Cc: John Wiegley <johnw@newartisans.com>, 12689@debbugs.gnu.org
Subject: bug#12689: 24.2; Eshell ${cmd} substitution
Date: Sun, 05 Apr 2015 20:41:04 -0700	[thread overview]
Message-ID: <1428291664.14271.0@mail.samertm.com> (raw)
In-Reply-To: <1425551640.2108.1@mail.samertm.com>

Hi,

I haven't finished, but I'm putting this work on hold for now as I've 
spent ages on it, and I'll return to this when I've learned more about 
eshell's architecture. The state of my work is below.

The patch below addresses the points you brought up, but it is 
incomplete for two reasons:
 - my code uses eshell-wait-for-process, which doesn't seem to be the 
correct wait to actually wait for a process to end because it locks up 
Emacs (because the core of eshell-wait-for-process is a while loop).
 - "prompt$ ${ext_command_one} | ext_command_two" will not reset the 
eshell prompt to normal if ext_command_one takes longer than 
ext_command_two. It works normally when ext_command_two takes longer 
than ext_command_one.

So I need to figure out a couple things in order to unblock myself:
 - how eshell knows to wait for other external processes (excluding 
eshell-wait-for-process), and whether that can be used at command-level 
granularity. E.g. for "cmd ${ext_cmd0} | ext_cmd1", the entire process 
needs to wait for both sides of the pipe to finish, and "cmd" needs to 
wait for "ext_cmd0" to finish before executing). "cmd ${ext_cmd0}" also 
shouldn't lock Emacs.
 - where the entry point is for the command prompt, and how the command 
prompt is reset after a set of commands finishes.

I've cc'd johnw because he might know the answer to the above 
questions, and what the correct approach to fixing this should be. I'll 
return to this when I've learned more about how eshell works.

-samer

work-in-progress patch:

--- a/lisp/eshell/esh-cmd.el
+++ b/lisp/eshell/esh-cmd.el
@@ -851,8 +851,9 @@ This is used on systems where `start-process' is 
not supported."
 (defmacro eshell-as-subcommand (command)
   "Execute COMMAND using a temp buffer.
 This is used so that certain Lisp commands, such as `cd', when
-executed in a subshell, do not disturb the environment of the main
-Eshell buffer."
+executed in a subshell, do not disturb the environment of the
+main Eshell buffer.  If COMMAND is an external command, it is
+called synchronously."
   `(let ,eshell-subcommand-bindings
      ,command))

@@ -1234,14 +1235,21 @@ COMMAND may result in an alias being executed, 
or a plain command."
 (defun eshell-plain-command (command args)
   "Insert output from a plain COMMAND, using ARGS.
 COMMAND may result in either a Lisp function being executed by name,
-or an external command."
+or an external command.
+
+If COMMAND is in an external command and `eshell-in-subcommand-p'
+is true, `eshell-plain-command' is synchronous and waits for
+COMMAND to finish."
   (let* ((esym (eshell-find-alias-function command))
 	 (sym (or esym (intern-soft command))))
     (if (and sym (fboundp sym)
 	     (or esym eshell-prefer-lisp-functions
 		 (not (eshell-search-path command))))
 	(eshell-lisp-command sym args)
-      (eshell-external-command command args))))
+      (let ((ext (eshell-external-command command args)))
+        (if eshell-in-subcommand-p
+            (eshell-wait-for-process ext)
+          ext)))))








  reply	other threads:[~2015-04-06  3:41 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-10-20  8:06 bug#12689: 24.2; Eshell ${cmd} substitution Aidan Gauland
2014-12-14 12:44 ` samer
2015-02-24 10:56 ` Samer Masterson
2015-03-03 15:54   ` Eli Zaretskii
2015-03-04 12:14     ` Samer Masterson
2015-03-04 17:38       ` Eli Zaretskii
2015-03-05 10:34         ` Samer Masterson
2015-04-06  3:41           ` Samer Masterson [this message]
2015-04-06  4:19             ` John Wiegley
2015-04-06  4:54               ` Samer Masterson
2022-02-09  9:12 ` Lars Ingebrigtsen
2022-02-09 19:01   ` Jim Porter
2022-02-09 20:12     ` Lars Ingebrigtsen
2022-05-03  3:52       ` Jim Porter
2022-05-03 10:37         ` Lars Ingebrigtsen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1428291664.14271.0@mail.samertm.com \
    --to=samer@samertm.com \
    --cc=12689@debbugs.gnu.org \
    --cc=eliz@gnu.org \
    --cc=johnw@newartisans.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).