[ESS] Double prompt using ess-remote through ssh on Windows

Keith Ponting k.ponting at aurix.com
Mon Apr 18 14:51:41 CEST 2011

Vincent Goulet <vincent.goulet <at> act.ulaval.ca> writes:

> Hi all,
> Charles C. Berry brought this issue to my attention. Using
> 1. my GNU Emacs 22.2-modified-1 for Windows distribution (but  
> presumably earlier versions also);
> Any idea how to fix this?
I cannot find any more recent update to this and was still getting the double
prompts. These occur both in the started shell and in R. A bit of hunting showed
that the ssh link somehow appears to be sending _two_ new lines for every
command issued. One irritating side effect is that using devAskNewPage is also
disturbed - you tend to see every other plot! 

For my setup (Windows Vista, Vincent's very useful modified Emacs 23.2.1, ESS
version 5.10 remote host running Linux and R 2.8.1) I think I may have found a
fix, with the following in my .emacs. The key is replacing \n with \r in the
comint-simple-send function (just deleting \n does not work):

(load "~/.emacs.d/ssh")
(setq ssh-program "plink")
;; ssh-explicit-args also set to -X (via customize) to enable X forwarding to 
;; Xming, which I start with:
;; "C:\Program Files (x86)\Xming\Xming.exe" :0 -clipboard -multiwindow
(defun my-comint-init ()
           (setq comint-process-echoes t) ; suppresses extra echo of R commands
           ;; following does not fix double prompt but might be useful
           (setq comint-prompt-regexp "^[^#$%>\n]*[#$%>] *") 
           (setq comint-use-prompt-regexp t)
           (setq comint-input-sender (function my-comint-simple-send))
           ;; (setq comint-input-sender-no-newline t) ; seems to have no effect
(add-hook 'comint-mode-hook 'my-comint-init)

(defun my-comint-simple-send (proc string)
  "Default function for sending to PROC input STRING.
This just sends STRING plus a newline.  To override this,
set the hook `comint-input-sender'."
  (let ((send-string
         (if comint-input-sender-no-newline
           ;; Sending as two separate strings does not work
           ;; on Windows, so concat the \n before sending.
           (concat string "\r")))) ; KMP - was \n
    ;;(message (concat "Sending /" string "/ send-string /" send-string "/" ))
    (comint-send-string proc send-string))
  (if (and comint-input-sender-no-newline
	   (not (string-equal string "")))

That fixes direct interactions in the *ssh... buffer, but it does not help when
using ESS to send commands from an R buffer. In order to fix that, I had to
modify ess-eval-linewise, replacing:
              (setq com (concat (substring text 0 pos) "\n"))
with the following:
              ;; horrible kludge for windows-to-linux ssh operation
              ;; using \r instead of \n suppresses double prompts,
              ;; but also have to force invisibly to stop something in ESS
              ;; echoing commands.
              (if (string-match-p "^\*ssh-" (process-name sprocess))
                  (progn (setq com (concat (substring text 0 pos) "\r"))
                         (setq invisibly t))
                  (setq com (concat (substring text 0 pos) "\n")))

So far, that has appeared to work for whichever combination and ordering of
remote and local R sessions I have tried.

There is one exception - when sending a region invisibly, the double carriage
return behaviour re-appears, with an extra line doubled for luck (i.e. sending a
region of two lines gives six empty prompts!). Examining the code, that case
feeds almost directly into process-send-region, which is a 'C' level Emacs
function and beyond what I can currently tackle.


Keith Ponting
Aurix Ltd. Malvern, Worcestershire, UK

More information about the ESS-help mailing list