VIMはWindowsの改行を追加していますか?


10

からの行末に注意してくださいgit diff

-   IP_ADDR: 'http://1.2.3.4:143'
+   IP_ADDR: 'http://2.4.6.8:143'^M

このファイルを編集するには、カーソルを置いてから1、押しct:て新しいIPアドレスを入力します。ファイルに完全な行が追加または削除されていません。ただし、ファイルはdosVIMでタイプとして表示されます。

ドキュメントのその部分を明示的に編集しなかった場合、VIMが行末を変更するのはなぜですか?また、元の行diffにないことをどのように示しているかを見て^M、VIMがこれがdosファイルであることを他にどのように決定したでしょうか?

回答:


8

Vimは(で構成されたものの中から'fileformats')元のファイル形式を検出し、同じファイル形式で書き込みます。Vimが(たとえば、UnixからWindowsスタイルに)切り替える唯一の方法は、明示的な経由:setlocal fileformat=dosです。あなたの設定にそれがあることはまずありません。:verbose setl ff?あなたに伝えることができます。

Git diff ifselfについてはあまり気にしません(すべての行が変更されているように見えない限り、実際に行末の切り替えがあります)。

Gitを設定するとautocrlf = true、Gitはファイルをチェックアウトするときに改行をシステムの標準に変換し、コミットするときにLF改行に変換することに注意してください。したがって、すべてがうまくいくかもしれませんが、Git diff出力だけが混乱を招きます。


5

これは、私たち全員がマトリックスに住んでいるという証拠です。これが本当に21世紀だった場合、別の行末で戦うことはありません。

Vimは行末で「正しいこと」を行うという非常に良い仕事をしています。詳細はで説明されてい:help 'ffs'ます。もちろん、vimはあなたの心を読むことができません。ファイルに一貫性のない行末がある場合、vimはあなたが望むことをしないかもしれません。

vimでファイルを開いてから、

:e! ++ff=unix

これにより、ファイルがディスクからリロードされ、vimがUNIXスタイルの行末を使用するようになります。次に、行が生^M文字で終わるため、CRLFで終わる行を正確に確認する必要があります。

私はgitが大好きですが、vimと同じようにそれを知りませんし、信頼していません。crlf混乱を招く可能性のあるgitの設定に「設定して忘れる」構成を推奨する人もいると思います。@Ingo Karkatが彼の答えで言及した設定を避けることを好みます。チェックインされたのと同じファイルをgitにチェックアウトさせ、行末の処理を私(およびvim)に任せます。


1

Vimはfileformatオプションの値に基づいて、現在開いているファイルがdos、unix、またはmacファイルかどうかを判断します。fileformatオプションの値は、fileformatsオプションの値によって決まります。

vimがファイルを開くと、vimは現在のfileformatsオプションの値に基づいて、現在のバッファーの有効なfileformatオプション値を決定します。以下は、vimがfileformatsオプションの値によって現在のバッファーのfileformatオプションの値を決定する方法に関するvimマニュアルの説明です。

'fileformats' 'ffs' string (default:
                Vim+Vi  MS-DOS, MS-Windows OS/2: "dos,unix",
                Vim Unix: "unix,dos",
                Vim Mac: "mac,unix,dos",
                Vi  Cygwin: "unix,dos",
                Vi  others: "")
            global
            {not in Vi}
    This gives the end-of-line (<EOL>) formats that will be tried when
    starting to edit a new buffer and when reading a file into an existing
    buffer:
    - When empty, the format defined with 'fileformat' will be used
      always.  It is not set automatically.
    - When set to one name, that format will be used whenever a new buffer
      is opened.  'fileformat' is set accordingly for that buffer.  The
      'fileformats' name will be used when a file is read into an existing
      buffer, no matter what 'fileformat' for that buffer is set to.
    - When more than one name is present, separated by commas, automatic
      <EOL> detection will be done when reading a file.  When starting to
      edit a file, a check is done for the <EOL>:
      1. If all lines end in <CR><NL>, and 'fileformats' includes "dos",
         'fileformat' is set to "dos".
      2. If a <NL> is found and 'fileformats' includes "unix", 'fileformat'
         is set to "unix".  Note that when a <NL> is found without a
         preceding <CR>, "unix" is preferred over "dos".
      3. If 'fileformat' has not yet been set, and if a <CR> is found, and
         if 'fileformats' includes "mac", 'fileformat' is set to "mac".
         This means that "mac" is only chosen when:
          "unix" is not present or no <NL> is found in the file, and
          "dos" is not present or no <CR><NL> is found in the file.
         Except: if "unix" was chosen, but there is a <CR> before
         the first <NL>, and there appear to be more <CR>s than <NL>s in
         the first few lines, "mac" is used.
      4. If 'fileformat' is still not set, the first name from
         'fileformats' is used.
      When reading a file into an existing buffer, the same is done, but
      this happens like 'fileformat' has been set appropriately for that
      file only, the option is not changed.
    When 'binary' is set, the value of 'fileformats' is not used.

    When Vim starts up with an empty buffer the first item is used.  You
    can overrule this by setting 'fileformat' in your .vimrc.

    For systems with a Dos-like <EOL> (<CR><NL>), when reading files that
    are ":source"ed and for vimrc files, automatic <EOL> detection may be
    done:
    - When 'fileformats' is empty, there is no automatic detection.  Dos
      format will be used.
    - When 'fileformats' is set to one or more names, automatic detection
      is done.  This is based on the first <NL> in the file: If there is a
      <CR> in front of it, Dos format is used, otherwise Unix format is
      used.
    Also see |file-formats|.
    For backwards compatibility: When this option is set to an empty
    string or one format (no comma is included), 'textauto' is reset,
    otherwise 'textauto' is set.
    NOTE: This option is set to the Vi default value when 'compatible' is
    set and to the Vim default value when 'compatible' is reset.

質問に戻ると、ファイルはvimでdosファイルとして識別されているため、ファイルを保存してvimを終了すると、vimは改行文字をdosスタイルnewlineに自動的に置き換えます。

git作業ディレクトリツリーでは、このファイルはdosファイルですが、このファイルはgitインデックスツリーのunixファイルなので、を使用git diffすると、ファイルが変更されていることがわかります。Unix形式のファイルの場合、余分な文字は^ M文字として表示されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.