I am trying to use ansi-term in emacs (configured to tcsh shell). I see some issues with newline characters being displayed. If I try the following from the terminal (ansi-term), I get the correct output:
myterm > echo "Line1"; echo "Line2"; echo "Line3";
Line1
Line2
Line3
myterm >
But if I try putting the same lines in a shell script and try to execute the script from ansi-term, I get a wrong output
Script: (test)
#!/usr/bin/env tcsh
echo "Line1"; echo "Line2"; echo "Line3";
Running the script (test):
myterm > ./test
Line1
Line2
Line3
myterm >
Note: /usr/bin/env tcsh does point to the correct shell (its the same shell that I used while invoking ansi-term). Also executing the script from gnome-terminal also displays the correct output. I have also tried setting the following variables but it did not solve my issues:
(set-terminal-coding-system 'utf-8-unix)
(setq default-process-coding-system '((utf-8-unix . utf-8-unix)))
If you set stty onlcr
in your script, you will get the behaviour you require.
Translating the command into english one might say:
set the tty to output newline as carriage-return and newline.
This is a workaround of course, because this option should be set by default. I can see from the output of stty -a
that you gave in your comments that it is set in the tcsh that runs in your ansi-term. I suspect one possible reason why ansi-term and your shell script behave differently is due to the following lines in term.el
(apply 'start-process name buffer
"/bin/sh" "-c"
(format "stty -nl echo rows %d columns %d sane 2>/dev/null;
if [ $1 = .. ]; then shift; fi; exec \"$@\""
term-height term-width)
".."
command switches)))
The stty
command in the above actually sets onlcr
twice, since
the compound option -nl
translates to icrnl -inlcr -igncr onlcr -ocrnl -onlret
and the sane
option translates to
cread -ignbrk brkint -inlcr -igncr icrnl -iutf8 -ixoff -iuclc -ixany imaxbel opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
Another possible cause: for non-login shells tcsh will only read /etc/csh.cshrc
and either ~/.tcshrc
or ~/.cshrc
when it starts up, but for login shells it reads a number of other files including /etc/csh.login
~/.history
or the value of $histfile
- You should consult the man page for full details including the exact order in which it reads things.