Subject: Re: bug#29149: Tramp shell uses local shell setting in windows

From: Shuguang Sun <[email-masked]>
Date: Sat, 6 Jan 2018 23:18:11 +0800

Dear all,

I have a patch to shell.el and dired-aux.el which
1. to use the tramp-remote-shell and tramp-remote-shell-args (in shell.el)
2. remove the "start /b" in dired-do-shell-command (in dired-aux.el)

https://github.com/ShuguangSun/emacsimprovement/tree/master/bug%2329149

On Sun, Nov 26, 2017 at 2:09 AM, Shuguang Sun <[email-masked]> wrote:

> Hi,
>
> I put some trace log for problem2:For problem 2: I don't know why it
> doesn't take tramp-remote-shell as the shell, but to ask user to input the
> shell path in the server side.
>
> When I input /bin/sh, the same as the tramp-remote-shell, it raise the
> error "
>
> - "env: c:/bin/sh: No such file or directory" in shell buffer
> -  "Process shell exited abnormally with code 127" in tramp_shell2.txt
> (the trace buffer)
> -  in tramp_shell_debug2.txt, (the tramp debug buffer)
> 00:34:02.040229 tramp-send-command (6) # cd /opt/bee/home/username/test/
> &&  exec  env PS1\=/plink\:username\@host\:/opt/bee/home/username/test/\
> \#\$\  TERM\=emacs TERMCAP\=emacs\:co\#135\:tc\=unknown\:
> INSIDE_EMACS\=27.0.50\,comint c\:/bin/sh -i
>
> The file is too large, therefore, I put them in github:
> https://github.com/ShuguangSun/Emacs-bug-29149
>
> Hope it works.
>
>
>
>
>
>
>
>
> On Sat, Nov 11, 2017 at 5:10 PM, michael.albinus <[email-masked]>
> wrote:
>
>> Hi Eli,
>>
>> My laptop crashed last night. If I cannot recover over the weekend, it
>> might take some days before I could react. Sorry.
>>
>> Best regards, Michael.
>>
>>
>>
>> Von meinem Samsung Galaxy Smartphone gesendet.
>>
>
>
diff --git a/lisp/dired-aux.el b/lisp/dired-aux.el
index 7fff7e7a24..d3ecde95ec 100644
--- a/lisp/dired-aux.el
+++ b/lisp/dired-aux.el
@@ -794,13 +794,14 @@ dired-shell-stuff-it
           (and in-background (not sequentially) (not (eq system-type 'ms-dos))))
          (w32-shell (and (fboundp 'w32-shell-dos-semantics)
                          (w32-shell-dos-semantics)))
+         (file-remote (file-remote-p default-directory))
          ;; The way to run a command in background in Windows shells
          ;; is to use the START command.  The /B switch means not to
          ;; create a new window for the command.
-         (cmd-prefix (if w32-shell "start /b " ""))
+         (cmd-prefix (if (and w32-shell (not file-remote)) "start /b " ""))
          ;; Windows shells don't support chaining with ";", they use
          ;; "&" instead.
-         (cmd-sep (if (and (not w32-shell) (not parallel-in-background))
+         (cmd-sep (if (and (or (not w32-shell) file-remote) (not parallel-in-background))
                       ";"
                     "&"))
 	 (stuff-it
diff --git a/lisp/shell.el b/lisp/shell.el
index f046d7830e..ca8cc60c9c 100644
--- a/lisp/shell.el
+++ b/lisp/shell.el
@@ -727,11 +727,28 @@ shell
                (null explicit-shell-file-name)
                (null (getenv "ESHELL")))
           (set (make-local-variable 'explicit-shell-file-name)
-               (expand-file-name
+               ;;(expand-file-name ;; add c: to /bin/sh
                 (file-local-name
                  (read-file-name
-                  "Remote shell path: " default-directory shell-file-name
-                  t shell-file-name)))))))
+                  "Remote shell path: "
+                  (concat (file-remote-p default-directory) "/")
+                  (cadr (assoc
+                        'tramp-remote-shell
+                        (assoc (file-remote-p default-directory 'method) tramp-methods)))
+                  t
+                  (cadr (assoc
+                        'tramp-remote-shell
+                        (assoc (file-remote-p default-directory 'method) tramp-methods)))
+                  ))
+                ;;)
+                )
+        ;; need to be improved. It just works for /bin/sh
+        (set (make-local-variable 'explicit-sh-args)
+             (cadr (assoc
+                   'tramp-remote-shell-args
+                   (assoc (file-remote-p default-directory 'method) tramp-methods)))
+             )
+        )))

   ;; The buffer's window must be correctly set when we call comint
   ;; (so that comint sets the COLUMNS env var properly).