From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: samer Newsgroups: gmane.emacs.bugs Subject: bug#18108: [PATCH] 24.3.92 : eshell-visual-options fails with some output. Date: Mon, 19 Jan 2015 01:08:42 -0800 Message-ID: <62d14355b5b5ca4810d6646ecf484c47@samertm.com> References: NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Trace: ger.gmane.org 1421658634 6637 80.91.229.3 (19 Jan 2015 09:10:34 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Mon, 19 Jan 2015 09:10:34 +0000 (UTC) Cc: 18108@debbugs.gnu.org To: Charles Rendleman Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Mon Jan 19 10:10:34 2015 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1YD8Lx-0003ZN-2v for geb-bug-gnu-emacs@m.gmane.org; Mon, 19 Jan 2015 10:10:33 +0100 Original-Received: from localhost ([::1]:36223 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YD8Lw-0005dt-6k for geb-bug-gnu-emacs@m.gmane.org; Mon, 19 Jan 2015 04:10:32 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:46304) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YD8LX-0004y5-2q for bug-gnu-emacs@gnu.org; Mon, 19 Jan 2015 04:10:08 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YD8LS-0004jf-Il for bug-gnu-emacs@gnu.org; Mon, 19 Jan 2015 04:10:07 -0500 Original-Received: from debbugs.gnu.org ([140.186.70.43]:52117) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YD8LS-0004jT-GN for bug-gnu-emacs@gnu.org; Mon, 19 Jan 2015 04:10:02 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.80) (envelope-from ) id 1YD8LR-0004Uw-TK for bug-gnu-emacs@gnu.org; Mon, 19 Jan 2015 04:10:02 -0500 X-Loop: help-debbugs@gnu.org In-Reply-To: Resent-From: samer Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 19 Jan 2015 09:10:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 18108 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 18108-submit@debbugs.gnu.org id=B18108.142165856717241 (code B ref 18108); Mon, 19 Jan 2015 09:10:01 +0000 Original-Received: (at 18108) by debbugs.gnu.org; 19 Jan 2015 09:09:27 +0000 Original-Received: from localhost ([127.0.0.1]:60978 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1YD8Ks-0004U0-V1 for submit@debbugs.gnu.org; Mon, 19 Jan 2015 04:09:27 -0500 Original-Received: from samertm.com ([162.243.37.26]:57880 helo=mail.samertm.com) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1YD8Kp-0004Tq-Tp for 18108@debbugs.gnu.org; Mon, 19 Jan 2015 04:09:25 -0500 Original-Received: by mail.samertm.com (Postfix, from userid 1010) id 319E081E6B; Mon, 19 Jan 2015 09:09:08 +0000 (UTC) Original-Received: from samertm.com (localhost [127.0.0.1]) by mail.samertm.com (Postfix) with ESMTP id AFAAA80A2A; Mon, 19 Jan 2015 09:08:42 +0000 (UTC) X-Sender: samer@samertm.com User-Agent: Roundcube Webmail/0.9.5 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 140.186.70.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:98465 Archived-At: Hi friends, Charles, countrymen, and debbugs, When eshell opens a visual command, it creates a buffer for the process, switches to that buffer, and, if the process is still running, attaches a sentinel to the process that kills the process when the sentinel dies. If the process is not running, the visual command signals an error, I assume because there is no good reason to show the term buffer for a process that isn't running. There is a race condition in the part that handles whether a command is running: even short-lived commands, like "git --version", are running when polled, and the error is never thrown. That means we've attached the buffer-killing sentinel to these short-lived commands, so the buffer they're attached to gets killed immediately afterwards. To sum up everything wrong with the current behavior: 1. Killing the process's buffer when the process dies is not the desired behavior. 2. Even if we wanted to kill the process's buffer for long running processes but not short ones, there is *no way* to tell how long a process will run. That means, there is no way to do this correctly. The solution is simple: for every visual application, simply create the term-mode buffer for it and switch to that buffer. This satisfies every use case: if a process dies quickly with an error message, the user will be able to read the error; if the process is running, it doesn't quit (this is also the current behavior); if the process is long running and dies, the user will be able to read the output of the process. I've attached a patch that implements this behavior below. There is a small issue with this patch: eshell does not start on a new line when you execute a visual command, and so you need to press 'enter' before entering a new command. If anyone has any insight into this, I'm all ears, otherwise I can probably figure it out eventually. This is a longer patch, and so it may need to wait for my papers to be processed. I am not sure how long that will take, as it's been more than a month since I first submitted my application. -samer Patch below: Changes in 3e0d44a..b9f2247 2 files changed, 14 insertions(+), 37 deletions(-) ChangeLog | 6 ++++++ lisp/eshell/em-term.el | 45 ++++++++------------------------------------- Modified ChangeLog diff --git a/ChangeLog b/ChangeLog index 36edfe6..d09380a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2015-01-19 Samer Masterson + + * eshell/em-term.el (eshell-exec-visual, eshell-term-sentinel): + Remove eshell-term-sentinel, show term-mode buffer regardless of + whether the process has died (bug#18108). + 2015-01-04 Paul Eggert * INSTALL: Mention 'make WERROR_CFLAGS='. Modified lisp/eshell/em-term.el diff --git a/lisp/eshell/em-term.el b/lisp/eshell/em-term.el index 4a6ac23..6870a6d 100644 --- a/lisp/eshell/em-term.el +++ b/lisp/eshell/em-term.el @@ -132,10 +132,6 @@ character to the invoked process." :type 'boolean :group 'eshell-term) -;;; Internal Variables: - -(defvar eshell-parent-buffer) - ;;; Functions: (defun eshell-term-initialize () @@ -171,39 +167,14 @@ allowed." (cdr args))))) (term-buf (generate-new-buffer - (concat "*" (file-name-nondirectory program) "*"))) - (eshell-buf (current-buffer))) - (save-current-buffer - (switch-to-buffer term-buf) - (term-mode) - (set (make-local-variable 'term-term-name) eshell-term-name) - (make-local-variable 'eshell-parent-buffer) - (setq eshell-parent-buffer eshell-buf) - (term-exec term-buf program program nil args) - (let ((proc (get-buffer-process term-buf))) - (if (and proc (eq 'run (process-status proc))) - (set-process-sentinel proc 'eshell-term-sentinel) - (error "Failed to invoke visual command"))) - (term-char-mode) - (if eshell-escape-control-x - (term-set-escape-char ?\C-x)))) - nil) - -;; Process sentinels receive two arguments. -(defun eshell-term-sentinel (proc _string) - "Destroy the buffer visiting PROC." - (let ((proc-buf (process-buffer proc))) - (when (and proc-buf (buffer-live-p proc-buf) - (not (eq 'run (process-status proc))) - (= (process-exit-status proc) 0)) - (if (eq (current-buffer) proc-buf) - (let ((buf (and (boundp 'eshell-parent-buffer) - eshell-parent-buffer - (buffer-live-p eshell-parent-buffer) - eshell-parent-buffer))) - (if buf - (switch-to-buffer buf)))) - (kill-buffer proc-buf)))) + (concat "*" (file-name-nondirectory program) "*")))) + (switch-to-buffer term-buf) + (term-mode) + (set (make-local-variable 'term-term-name) eshell-term-name) + (term-exec term-buf program program nil args) + (term-char-mode) + (if eshell-escape-control-x + (term-set-escape-char ?\C-x)))) ;; jww (1999-09-17): The code below will allow Eshell to send input ;; characters directly to the currently running interactive process.