VIM이 Windows 개행 문자를 추가하고 있나요?

VIM이 Windows 개행 문자를 추가하고 있나요?

다음에서 끝나는 줄을 확인하세요 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아무것도 없다는 것이 어떻게 표시되는지 보면 VIM이 이것이 파일이라고 어떻게 판단할 수 있을까요?^Mdos

답변1

Vim은 (에서 구성된 파일 형식 중에서) 원본 파일 형식을 감지 'fileformats'하고 동일한 파일 형식으로 작성합니다. Vim이 전환하는 유일한 방법(예: Unix에서 Windows 스타일로)은 명시적인 :setlocal fileformat=dos. 귀하의 구성에 해당 항목이 있을 가능성은 거의 없습니다. :verbose setl ff?당신에게 말할 수 있습니다.

나는 Git diff 자체에 대해 너무 걱정하지 않을 것입니다.모두줄이 변경된 것으로 나타나면 실제로 줄 끝이 바뀌지만 커밋된 내용은 괜찮습니다.

Git 설정을 사용하면 autocrlf = trueGit은 파일을 체크아웃할 때 줄 바꿈을 시스템 표준으로 변환하고 커밋할 때 LF 줄 바꿈으로 변환합니다. 따라서 모든 것이 괜찮을 수 있지만 Git diff 출력만 혼란스럽습니다.

답변2

이는 우리 모두가 매트릭스 속에 살고 있다는 증거이다. 지금이 정말로 21세기라면 우리는 여전히 다른 라인 엔딩을 놓고 싸우지 않을 것입니다.

Vim은 줄 끝을 사용하여 The Right Thing을 꽤 잘 수행하고 있습니다. 자세한 내용은 아래에 설명되어 있습니다 :help 'ffs'. 물론 vim은 사용자의 마음을 읽을 수 없습니다.일관성 없는줄 끝이 있으면 vim이 원하는 대로 작동하지 않을 수 있습니다.

vim에서 파일을 여는 것이 좋습니다.

:e! ++ff=unix

그러면 디스크에서 파일이 다시 로드되어 vim이 유닉스 스타일 줄 끝을 사용하게 됩니다. 그런 다음 원시 문자로 끝나기 때문에 CRLF 결말이 있는 줄을 정확히 확인해야 합니다 ^M.

나는 git을 좋아하지만 vim만큼 잘 모르고 신뢰하지도 않습니다. 일부 사람들은 crlf혼란을 초래할 수 있는 git 설정에 대해 "설정하고 잊어버리는" 구성을 권장한다고 생각합니다 . 나는 @Ingo Karkat이 그의 답변에서 언급한 설정을 피하는 것을 선호합니다. 나는 git이 체크인된 동일한 파일을 체크아웃하고 나(그리고 vim)가 줄 끝을 처리하도록 하길 원한다.

답변3

git diff추가된 줄에만 캐리지 리턴( ^M)이 표시되고 제거되거나 변경되지 않은 줄에는 표시되지 않습니다. -R다른 방향으로 차이점을 표시하는 플래그를 사용하면 이를 볼 수 있습니다 .

$ git diff -R:

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

따라서 vim은 아무것도 추가하지 않습니다. 특히 한 줄만은 아닙니다. Vim은 파일을 여는 동안 파일에서 찾은 줄바꿈을 사용합니다.

답변4

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 index 트리에서는 이 파일이 unix 파일이므로 를 사용하면 git diff파일이 변경된 것을 확인할 수 있습니다. Unix 형식의 파일의 경우 추가 항목은 ^M 문자로 표시됩니다.

관련 정보