2006-05-01

タブかスペースかって言うか Emacs か否かが気になる

自分はスペースです。

※ もうどこに TB したらいいのか分からないので送るのやめた。

Dan さんも「メールで patch」のネタで触れてるけど、エディタ以外の環境のことも考えるとスペースの方がいいなと思う。メール以外にもブラウザでコードを読める環境もたくさんあるし、そういう環境での再現性も考えるとタブじゃなくてスペースの方がいいんじゃないかと。

振り返ると自分も実は DOS/Windows 中心だったときはタブ派だった。タブ派の多くの人と同じように、タブの方がエディタの設定一つで見た目を変えられるから、自分の好みに合わせつつ共同作業するときにいいじゃんて思ってた。でも実際にはこれ意外とうまくいかないんですよ。これがどうにもうまく表現できなかったんだけど、上のようにエディタ以外の環境を含めてしまうと自分の中ではしっくりくる。スペースの方がより「安全」であると。

ただこう思えるようになったのは、「Emacs を使うようになったから」でもある。Emacs はその変態キーバインドで Windows 使いの人には恐らくすこぶる評判が悪いと思うが、自分が唯一「これはいいでしょ」と言えるのはスタイルの設定に従ったオートインデントの強制。

例えば Windows 用の一般的なエディタでは

function hoge() {
  if ( ) {
    ここ ←
  }
}

「ここ」の部分にカーソルを合わせるためには、中身がスペースかタブコードかによらず、行頭でタブキーを2回押すという動作が必要になる。オートインデントを on にするとその上の行の { のうしろで改行した瞬間に「ここ」にきてくれるが、デフォルトではタブキー2回という動作が必要な場合がほとんど。しかし Emacs ではタブキーを1回押すと「ここ」にきてくれる。1

まず、タブキーはタブコードを入力するためのキーではない2。設定されたインデントの位置までスペースあるいはタブを埋めてくれるキーなのである。これがものすごく嬉しかった。

例えば上のコードをまったくインデントせずに書いても、あとから各行で(その桁位置を気にすることなく)どかどかとタブキーを押していくだけで上のインデントは再現できるのである。そしてこの機能は当然コードの解析をもとにしているので、必要以上にタブキーを押してもスペースやタブが入りすぎることはないし、どこかで { } や ( ) の対応が壊れていたらインデントが正しく再現されない。つまり、何の気なしにタブキーを押すだけで typo に気づけるのである。(とりあえずカッコ系の対応だけね。)

言い換えると、Windows の普通のエディタを使っている人たちが思っているより、Emacs ではスペースでインデントするのがものすごく楽なのだ。たぶんこの便利さを知らないとスペース派の言い分はなかなか理解できないんじゃないかと思う。というかこの機能のないエディタでスペース派の人っているんだろうか。それくらい自分の中では Emacs を使うこととスペースを使うことは切り離せなくなってしまっている。3

まとめ

  • スペースの方がエディタや IDE 以外の環境を考えたときに安全だし、自分はスペースの方が好みである
  • Emacs の場合はタブであるかスペースであるかに関わらず、インデントに関しては超楽ちんである。だからタブ派だった自分が何の不便もなくスペース派に移行できてしまった。
    • 他のエディタや IDE の場合はどうなんだろう?

まぁタブでも問題が起きない環境に限定されているのであれば、幅さえ決めてくれれば従いますけどね。従うのはエディタの仕事だし:-) それよりエディタウィンドウの幅は 80 までで制限してほしいな。日本語の文章でもなんでもそうだけど、一行が長すぎると読みにくい。一行の長さが「場合によって」80 を越えるってのは別にいいんだけど、130 前提とかで長ーいのを書かれるとつらい。

関連リンク

  1. そして、「ここ」にくるかどうかを「コーディングスタイルの設定」で変更できる。 

  2. 厳密にはモードの挙動による。 

  3. 少なくとも Windows で常用していた Emacs ライクな xyzzy ではこんな動作はしなかった。 

<pre>と改行コード

ふとした疑問。

<pre> の中の改行コードの扱いってどうなってんの?

結果。

cr1回改行される
lf1回改行される
crlf1回改行される

cr も lf も crlf も等しく一つの改行になる。cr のあとに lf 以外の文字がきた場合は cr だけで改行、lf がきたら crlf のセットで改行。つまりどれでもいいよ、と。

試したのは Firefox 1.5(OSX), MacIE 5.2, Safari 1.3, Opera 8.5(OSX), IE 6(Win) たぶんみんなこういう挙動するようになってんだろな。

About

例によって個人のなんちゃらです

Recent Posts

Categories

Tool 日々 Web Biz Net Apple MS ことば News Unix howto Food PHP Movie Edu Community Book Security Text TV Perl Ruby Music Pdoc 生き方 RDoc ViewCVS CVS Rsync Disk Mail FreeBSD Cygwin PDF Photo Zebedee Debian OSX Comic Cron Sysadmin Font Analog iCal Sunbird DNS Linux Wiki Emacs Thunderbird Sitecopy Terminal Drawing tDiary AppleScript Life Money Omni PukiWiki Xen XREA Zsh Screen CASL Firefox Fink zsh haXe Ecmascript PATH_INFO SQLite PEAR Lighttpd FastCGI Subversion au prototype.js jsUnit Apache Trac Template Java Rhino Mochikit Feed Bloglines CSS del.icio.us SBS qwikWeb gettext Ajax JSDoc Rails HTML CHM EPWING NDTP EB IE CLI ck ThinkPad Toy WSH RFC readline rlwrap ImageMagick epeg Frenzy sysprep Ubuntu MeCab DTP ERD DBMS eclipse Eclipse Awk RD Diigo XAMPP RubyGems PHPDoc iCab DOM YAML Camino Geekmonkey w3m Scheme Gauche Lisp JSAN Google VMware DSL SLAX Safari Markdown Textile IRC Jabber Fastladder MacPorts LLSpirit CPAN Mozilla Twitter OpenFL Rswatch ITS NTP GUI Pragger Yapra XML Mobile Git Study JSON VirtualBox Samba Pear Growl Mercurial Rack Capistrano Rake Win RSS Mechanize Sitemaps Android JavaScript Python RTM OOo iPod Yahoo Unicode Github iTunes God SBM friendfeed Friendfeed HokuUn Sinatra TDD Test Project Evernote iPad Geohash Location Map Search Simplenote Image WebKit RSpec Phone CSV WiMAX USB Chrome RubyKaigi RubyKaigi2011 Space CoffeeScript Nokogiri Hpricot Rubygems jQuery Node GTD CI UX Design VCS Kanazawa.rb Kindle Amazon Agile Vagrant Chef Windows Composer Dotenv PaaS Itamae SaaS Docker Swagger Grape WebAPI Microservices OmniAuth HTTP 分析基盤 CDN Terraform IaaS HCL Webpack Vue.js BigQuery Middleman CMS AWS PNG Laravel Selenium OAuth OpenAPI GitHub UML GCP TypeScript SQL Hanami Document SVG AsciiDoc Pandoc DocBook Develop Jekyll macOS Node.js Vite Heroku Transformer AI Data Cloud Wasm