5

My problem is that every line executing on the remote Linux machine seems to be including a trailing ^M (as is shown as ? in the file name apa? below).

Content of my .org document:

* Test #+BEGIN_SRC sh :dir /plink:pi@raspberry:/home/pi/test touch apa touch bepa && echo ls -al #+END_SRC #+RESULTS: : total 8 : drwxr-xr-x 2 pi pi 4096 Nov 23 21:35 . : drwxr-xr-x 10 pi pi 4096 Nov 23 20:07 .. : -rw-r--r-- 1 pi pi 0 Nov 23 21:35 apa? : -rw-r--r-- 1 pi pi 0 Nov 23 21:35 bepa 

If I ssh to my Linux machine and type the file name using tab completion I see

pi@raspberry:~/test $ ls apa^M 

Running plink directly from a cmd.exe does not add ^M to the filename:

c:\>plink.exe -l pi raspberry "cd test && touch cepa" 

I have saved the org document with Unix line endings, but I get the same result.

My current workaround is to add the && echo to eat the ^M, but I'd really like to find a better one...

I'm running Emacs 25.1 and org-mode v8.3.6 on Windows 10. My Linux machine is a raspberryPi running raspian jessie.

2
  • 1
    You can try to run the delete-trailing-whitespace command Commented Nov 23, 2016 at 21:19
  • Running delete-trailing-whitespace did not change my document, nor the resulting filename... Commented Nov 23, 2016 at 21:24

3 Answers 3

5

It seems that org-babel executes code blocks by dumping them to a temporary file and then loading the file into whatever interpreter is to be used for the designated language (in this case, a shell). When you specify a remote :dir argument, the temporary file is placed on the remote host using TRAMP via with-temp-file.

Unfortunately it seems this file doesn't inherit the coding system of the org buffer (though I guess that wouldn't make sense anyway). Nor is its coding system autodetected from the OS running on the remote host (which probably would make sense).

I don't know what the best way to solve this problem is, but it should suffice to set the global default coding system so that new buffers automatically follow unix EOL conventions:

(setq-default buffer-file-coding-system 'utf-8-unix) 

As an Emacs user on Windows, this might prove inconvenient for you in other situations, though.

2
  • Thanks for the thorough explanation. The suggestion of using (setq-default buffer-file-coding-system 'utf-8-unix) is a much less obtrusive work-around. I tried making a macro to toggle that variable but since it "Automatically becomes buffer-local" I have not figured out how to get the current default-value... Commented Nov 24, 2016 at 15:31
  • 1
    @kini Great suggestion, thanks! Setting buffer-file-coding-system did the trick for me. Commented Aug 16, 2021 at 14:14
3

Thanks to the explanation from kini I have now created a satisfactory solution by adding a parameter to org-babel-sh-evaluate:

#+BEGIN_SRC sh :file-coding utf-8-unix :dir /plink:pi@raspberry:/home/pi/test touch apa touch bepa ls -al #+END_SRC 

using the following defadvice:

(defadvice org-babel-sh-evaluate (around set-shell activate) "Add header argument :file-coding that sets the buffer-file-coding-system." (let ((file-coding-param (cdr (assoc :file-coding params)))) (if file-coding-param (let ((file-coding (intern file-coding-param)) (default-file-coding (default-value 'buffer-file-coding-system))) (setq-default buffer-file-coding-system file-coding) ad-do-it (setq-default buffer-file-coding-system default-file-coding)) ad-do-it))) 
1

Does using the DOS cr+lf (^M^J) in an org file actually have a benefit? I guess you will only open it in Emacs anyway. (Other editors should be able to come to terms with unix lf (^J) line endings too.)

To just set the encoding for this one file, do

 M-x set-buffer-file-coding-system <ret> utf-8-unix <ret> 

and if necessary remove any ^M with

 M-x replace-string <ret> C-q C-m <ret><ret> 

then of course save the file.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.