「行末改行」と「インデントのタブ or スペース」って何?という人へ

ATOMやSublimeTextなど多くのエディタには便利な機能が備わっています。
「行末改行挿入」や「タブのスペース変換」などもその機能に該当します。

そんな便利機能を

「とりあえず設定したら捗るらしいから設定しておく」

というレベルから脱却するための記事です。

「何でこんな設定をしているのか?」という疑問を解消するべく調べてみました。

スポンサーリンク

インデントはタブかスペースか論争(2個?4個?)

自分は現在SublimeText使いなのですが、設定はこんな感じ。

"translate_tabs_to_spaces": true,
"tab_size": 2,

Preferences -> Settings から設定出来ます。

この設定でTab使用時に、「スペース2個でインデント」が行われるよう変換してくれます。

また、言語や好みによってインデントのスペースは「2個派・4個派・8個派」などが存在。
文化によってはスペースでのインデントではなく、タブでインデントする事もあるとのこと。

Rubyからプログラミングを始めた自分は勧められるがまま「スペース2個のインデント」を使用していたので、こういった文化の違いがあることすら新鮮でした。

ちなみにRubyのスタイルガイドではスペース2個のインデントが推奨されています。

「スペースが悪い、タブが悪い」というものではなく最終的には好みや言語の規約次第、という話に落ち着いたりしているのが結論。

色々あるが、一番やってはいけないのは「インデント方法を混同させる」こと。
プロジェクトの規約に則って、統一することが一番大事。

参考

インデントにタブを使うことのデメリット

「teratail」の質問から。
回答が29も付いていて盛り上がってる議題

Rails coding standards – Why 2 space indentation?

「Stack Overflow」の質問から
こちらでも慣習や規約の問題という回答あり。

行末の空白削除と改行

"ensure_newline_at_eof_on_save": true,
"trim_trailing_white_space_on_save": true,

SublimeTextで設定すると、この2行。

これで「行末の不要なスペースがある場合削除」かつ「行末に改行を自動挿入」ようになります。

プログラマーデビューした当初はよく行末改行を入れずにレビューで指摘もらいました。
手動で入れるのも手間なので、エディタ側で設定しておいたほうがいいですね。

しかし何で行末改行が必要なのか?と、疑問に思ったらこういうことらしい。

テキストファイルとは、いくつかの行の集合である。そして、行とは改行コードで区切られるまでの、一連のテキストデータの連続である。

この説明が一番しっくり来ました。

「行+改行」があって初めて「行」になるということ。

Stack Overflowにも同じような質問がありました。

Because that’s how the POSIX standard defines a line:

それが「POSIX」という仕様に則った行の定義の仕方、とのこと。

POSIXとは?
http://e-words.jp/w/POSIX.html

実際に「C, C++」では、改行なしのソースファイルだと未定義扱いになり誤作動を引き起こす、とのこと。

ちなみにRubyではそういった誤作動は起きないが、慣習的に行末改行はしておこう。

参考

[迷信] ソースファイルの末尾に }

「株式会社きじねこ」のブログから
CとC++の規格での行末改行の話

ファイル末尾の改行を自在にコントロールする

「ザリガニが見ていた…。」から
実際に行末改行がなかった場合の不具合の例

Why does Ruby on Rails generate add a blank line to the end of a file?

「Stack Overflow」の質問から
「何故rails g で作ったファイルに行末改行があるのか」

まとめ

チームで開発するのであれば必ず規約に則ってコードを書こう。
足並みを揃えないとGit管理での無駄なdiff発生によるコンフリクトなど、開発に少なからず影響を与えます。

おわり