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 tocread -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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With