改行文字

そういやまとめようと思っていながら今になってまとめる series 。 RTM の整理をしてたら出てきた task をつぶしてるだけとも言う。

で、実際のところは 'fileformat' と 'fileformats' の設定はどういう効果があるのかってハナシ。とりあえず :help 'fileformat':help 'fileformats' を読むと既存の file を buffer に読み込むときと新規に buffer を作るとき以外には関係ないようなのでその 2 つで分けてみる。それぞれ「読込」と「新規」という呼び方ね。まず表。

'fileformats'
設定あり 設定なし
新規 'fileformats' の最初の値 'fileformat' の既定値
読込 'fileformats' と file の内容による 'fileformat' の既定値

'fileformat' の既定値は help で確認可能。 Kaoriya さんとこのだったら "dos" 。あと「読込」かつ「 'fileformat' 設定あり」の詳細は help に詳しく書いてあるんだけど見落としやすい注意点としては以下。

  • 'fileformats' に 2 つ以上の値を指定する & 「読込」の場合、値の「順番」は関係ない
    • 2 つ以上指定されていると自動認識が働く ( 俺訳 ) と書かれているので指定する数に気をつける。
    • ただし新規 buffer の設定は順番が関係する ( 最初の値が使われる ) 点に注意。
  • 値 "dos" と "mac" はどちらか一方しか実質的に有効でない。
    • help には判定する algorithm は詳しく書いてあるものの結論がわかりにくい。
    • <CR> ( U+000d CARRIAGE RETURN ) が file に含まれているとき "dos" が "fileformats" に指定されている場合 "mac" が指定されていようが "dos" になってしまう ( という algorithm であると理解出来る記述な ) ので両方の指定は意味がない。

というあたり。上記をひっくるめて考えると 'fileformats' の設定は実質以下の 8 通りしかないわけだ。

  • :set fileformats=
    • すべての改行を 'fileformat' の既定値として取り扱う
  • :set fileformats=dos
    • すべての改行を <CR><NL> として取り扱う
  • :set fileformats=unix
    • すべての改行を <NL> として取り扱う
  • :set fileformats=mac
    • すべての改行を <CR> として取り扱う
  • :set fileformats=dos,unix
    • 既存 file の改行の取り扱いを <CR><NL> か <NL> かで自動判定し新規 buffer の改行は <CR><NL> として取り扱う
  • :set fileformats=unix,dos
    • 既存 file の改行の取り扱いを <CR><NL> か <NL> かで自動判定し新規 buffer の改行は <NL> として取り扱う
  • :set fileformats=mac,unix
    • 既存 file の改行の取り扱いを <NL> か <CR> かで自動判定し新規 buffer の改行は <CR> として取り扱う
  • :set fileformats=unix,mac
    • 既存 file の改行の取り扱いを <NL> か <CR> かで自動判定し新規 buffer の改行は <NL> として取り扱う

そして 'fileformat' の操作は現在の buffer にしか効果がない。なので .vimrc に書いても無視される ( 起動時に最初の buffer が作られる前に .vimrc の処理をするはずなので 'fileformat' で変更すべき buffer 自体がないはず ) 。これ当たり前に思えるけど重要なんだよね。

というところ。少し複雑だけど「伝統」でもあるので仕方ない。