LFとCRLFが選択できるようになった

hasumikin is a programmer.


2020年上期のmruby/c記事シリーズ最終回(たぶん)です。

改行コードがLFだけ

mruby/cが出力する改行コードは、LF(\n)でした。 mrubyやCRubyがLFなので、互換性を考えたら当然ですね。

ターミナルの闇

闇って言うほどでもないのですが、Linuxで最も簡単に導入・利用できるシリアルターミナルエミュレータの cu は、改行コードにCRLF(\r\n)を期待します。 そして、なんと、これは変更できません。

screen も標準はCRLFで、LFにも変更できるのですが起動にsudoが必要(Ubuntuの場合)だったりCtrl+Hogeの入力状況が見えにくくて間違えやすい(私だけ?)。嫌い。

minicom というやつはUIのクセが強くてあんまり使いたくない。嫌い。

シリアル通信の似合うRuby => mruby/c

mruby/cはワンチップマイコン向けのRubyですので、UARTからCOMポートにつなぐなどのケースが多いのです。 このとき、ターミナル側にはいろいろな環境が使えるべきなので、LFだけではなくCRLFも必要なのです!

Linuxユーザが組み込みプログラミング

組み込みプログラマは、おそらくWindowsな人が多いですね。 Windowsはシステム本来の改行コードがCRLFなのに、ターミナルエミュレータのTeraTermなどは簡単にLFに変更できます。

他方、本来の改行コードがLFであるLinuxのシリアルターミナルでは、なぜかお気軽にLFを選べない。

Rubyは、Linux文化に寄り添ったプログラミング言語です。

「Rubyから(あるいはWeb・スマホ開発から)組み込み開発に興味を広げたプログラマが挫折することなくmruby/cを使い始めるためには、CRLFが是非とも必要なんです!」とお願いして、入れてもらいました。 (今回は自分でプルリクを書いた提案じゃないです)

HALの選択(参考:前回の記事)と同様、これもフラグで切り替えできます。 CFLAGS=-DMRBC_CONVERT_CRLF make みたいにすれば、改行コードがCRLFになります。やったね!

補足。念のため

CRLFを期待するターミナルがLFを受信するとなにが困るのか、をいちおう説明します。

たとえば以下のようなRubyプログラムがあったとすると:

puts "Hello"
puts "Ruby"
puts "World"

期待していた動作はこうです:

Hello
Ruby
World

ところが、このように出力されてしまいます:

Hello
     Ruby
         World

こういうことがエラーメッセージなどを含めあらゆるところで発生するので、たいへん読みにくいっていうわけです。