読者です 読者をやめる 読者になる 読者になる

ダイヤル `^M` を廻せ!

あーもーやだ.

試行錯誤を繰り返すも,一向に結果が伴わない.

これはイケナイやつです.

埒明かないので頭冷やす上でも一旦ここで切って,現状でまとめておこうかと思います.

Carriage ReturnCarriage Return / Ole Husby

改行の表記は今後,\r 推しで行く

と言うことに決めたっ,という話です.

具体的にはこんなことです.

置換を使って改行を入れる,な話,しばしば目にるかと思います.

そしてその方法として,それはあくまで個人的な感覚ですが,目にする多くの内容は,例えばこんな感じです.;

:s/,/^M/g

ご存じ,これはカンマを改行にしているわけですが,置き換え先とする改行は ^M ((実際は [control]+[v] のキー入力に続いて,[enter] または [control]+[m] とします.ここでは便宜上,すべて ^M と表記します.)) と表記します.実際自分もこれらの情報を参考に,常にこの表記を使ってました.

ですが今後は,;

:s/,/\r/g

^M ではなく,極力 \r 使う事を先ず考えるよう癖をつけよう,と.

きっかけは github

御多分にもれず,dot ファイルを github 上で管理していたりするのですが,ここでずっと気になっている事がありました.

それが ^M

管理している dot ファイルには勿論 .vimrc もありまして,ここに個人的なスクリプトを書いております.その中で ^M と改行コードを記載している箇所があるのですが,この ^Mgithub 上で見ると ^M ではなく実際に改行されてしまっているのです*1

一応例を示しておきますと,実際の作業上にはこう書いているとします.;

exe 'silent %s/,/^M/ge'

で,github 上での結果はと言いますと,こう.;

exe 'silent %s/,/
/ge'

これは,当然でしょうが,ローカル側もリモートリポジトリ側も同じです.

「まぁ dot ファイルを clone するという状況はそうあるものでもないし」と割り切り,その度に人力手作業でチチくってまし た.
でも push すれば ^M はやはり改行に変わる.で clone しては都度直し...なんて実に実直に頭の悪い営みを実直に繰り返すことで遣り過ごして来たのですが,この度,この事象にキチンと向き合ってみようと思い立ったわけなのです.

git(hub) には《CRLF を LF に自動変換》する仕組みがあるのだそうです

それを制御する設定が core.autocrlf と.

詳細については,ドキュメントがあるのでそちらを参照いただくとして.

ターミナルで以下のようなコマンドを叩きます.*2;

% git config --global core.autocrlf input

さて?

結果...

内容を適当に差分を作って push.
結果を見てみますと,今まで通り.^M の位置で改行されてます.

一方,同コードを checkout なり,あるいは真っ新にして clone し直し,ローカル側で覗いてみると,こちらは今までと違う結果になりました.
リポジトリ上で姿が変わってしまっていた改行コード ^M は,^M

これは設定が効いているということなの?

だとしても気持ち悪い.*3

いやいや,リモートリポジトリ上でどうであろうと,ローカルリポジトリではイメージ通りの無いから良い,となるの?

だとしてもやっぱ何か気持ち悪い.

vim 側でのオプション fileformat を掛け合わせて試しても同じですし.

こんなに迷うのなら \r にするわ

と.

決めました.

でも本当に /r で大丈夫なのかな,というのも気になる...

ヘルプにはこうあります.;

\r    <CR> にマッチします

via. :h \r

を? CR って?

キャリッジ・リターン carriage return のことを指してるのかな?

この辺りに関しては参照すべきリソースは《たくさんあります》が,《制御(改行)コード CR は ^M って表示される》ものだとされてますよね.

と言うことは?
\r = CR なので,やっぱり結局 \r = ^M,...なのですか?

^M 使うも \r 使うも,両者共に同じ CR なので,結局変わらないと言うことだったりするのですか?

例えば,こんなミニマルな二行だけ書いたファイルを用意して覗いてみることに.;

%s/,/\r/
%s/,/^M/

結果.;

% od -bc example.vim
0000000   045 163 057 054 057 134 162 057 015 012 045 163 057 054 057 015
           %   s   /   ,   /   \   r   /  \r  \n   %   s   /   ,   /  \r
0000020   057 015 012
           /  \r  \n

\r の方は \r でそれぞれに 134+162 となっています.
そして ^M の方は /r で 015 となっています.

あ,一応上の例では fileformatdos で試したものです.

ちなみに詳細具体的な結果は省略しますが,s[ubstitute] での置き換え文字に ^M\r を指定してそれぞれの結果も確かめてみたら,fileformat やら fileformats オプションの設定にしたがったものでした.

いいかな.

何か戸惑いがそのまま出た感じの内容で,とっ散らかった感じになったかも.

はい,おしまい.

*1:正しくは,commit 時かと.

*2:これは "自分が扱うデータ全てに対し,CRLF な改行コードを持ってくる時,皆一律で LF にしてしまう",という設定を施しています."自動的に変換" というのは少々気味悪かったりもするのですが,作業環境は osx で,このマシンで行う作業は全てプライベートなので,ぜんぶ LF にしてしまっても良し,としてます.

*3:実際,例えば,core.autocrl を false にしたり,設定項目自身を消したら結果は変わるか,というとそう言うわけでもなかったし...また別の要因が実は影響しているのではないかと.