Vim이 개행을 추가하는 이유는 무엇입니까? 이것이 컨벤션입니까?


18

Vim을 열고 입력 itest<Esc>:wq하면 Vim 에 줄 바꿈이 없지만 코드에 줄 바꿈이있는 파일을 얻습니다 .

$ vim -u NONE test.txt
$ cat test.txt | hd
00000000  74 65 73 74 0a                    |test.|
00000005

Vim을 열고 입력 itest<Return><Esc>:wq하면 Vim 에는 줄 바꿈이 하나 있지만 코드 에는 줄 바꿈 이 두 개 있는 파일이 있습니다 .

$ rm test.txt
$ vim -u NONE test.txt
$ cat test.txt | hd
00000000  74 65 73 74 0a 0a                 |test..|
00000006

Vim을 열고 -u NONE있으므로 로컬 구성이 사용되지 않습니다. 또한 이것은 이전 질문 과 관련이있을 수 있습니다 .

이것은 내 시스템 정보입니다.

$ uname -a
Linux awsAlpha 3.2.0-60-virtual #91-Ubuntu SMP Wed Feb 19 04:13:28 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ vim --version
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled May  4 2012 04:25:35)
Included patches: 1-429
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by buildd@

이 시스템에서도 똑같은 동작을 확인할 수 있습니다.

$ uname -a
Linux bruno 3.5.0-48-generic #72-Ubuntu SMP Mon Mar 10 23:18:29 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ vim --version
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Oct 26 2012 16:45:33)
Included patches: 1-547
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by buildd@

Vim이 개행을 추가하는 이유는 무엇입니까? 이것이 컨벤션입니까?

hdUbuntu Server에 설치된 명령 에 대한 설명은 다음과 같습니다 .

$ man hd | head -4
HEXDUMP(1)            BSD General Commands Manual            HEXDUMP(1)

NAME
     hexdump, hd — ASCII, decimal, hexadecimal, octal dump

8
컨벤션 인 것 같습니다. 원하는 경우 비활성화하는 방법은 다음과 같습니다 . 여기 이력이 있습니다.
— jliv902

답변:


27

유닉스 텍스트 파일의 규칙은 모든 줄이 줄 바꿈으로 끝나고 줄 바꿈이 줄 구분자가 아니라 줄 바꿈이라는 것입니다.

Vim은 버퍼를 파일로 저장하면 해당 파일 형식에 대한 줄 끝 순서로 모든 줄을 종료합니다. Unix의 경우 줄 바꿈입니다. 만나다

:help 'fileformat'

Unix 텍스트 처리 도구를 사용하는 경우이 규칙을 따르는 것이 가장 좋습니다. 그러나 파일의 마지막 줄 끝에 줄 바꿈을 넣지 않아도되는 경우도 있습니다. Vim은 이러한 파일을 "이진"으로 간주합니다. 만나다

:help 'binary'
:help edit-binary

오 재밌 네요. 유명한 \ r \ n 대 \ n 외에. Windows는 줄 구분 기호를 사용하고 유닉스는 줄 종결자를 사용합니까? 그리고 그것은 어디에나 문서화되어 있습니까? 유닉스 "ISO / IEC 9899 : 2011, 섹션 §7.21.2에 적용되는 것으로 추정됩니다. 스트림 : 텍스트 스트림은 줄로 구성된 순서가 지정된 문자 시퀀스입니다. 각 줄은 0 개 이상의 문자로 구성되며 새로운 문자로 끝나는 문자입니다. 줄 문자 "
— barlop

그러나 창에 줄 구분 기호가 사용된다는 문서는 어디에 있습니까?
— barlop

2

Vim은 당신이 직접 넣지 않은 것을 추가하지 않습니다.

"줄 바꿈"문자는 "줄 바꾸기"가 아니며 두 예제 모두 완벽하게 정상입니다.

  • 첫 번째 파일에는 파일에 한 줄만 포함되므로 하나의 "줄 바꿈"문자가 표시됩니다.
  • 두 번째 줄에는 파일에 두 줄이 포함되어 있으므로 두 개의 "줄 바꿈"문자가 표시됩니다.

2
개행을 추가합니다. 다음과 같이 테스트 한 다음와 printf "\x41" > /tmp/test.txt함께 'A'문자가 하나만 있는지 확인하십시오 xxd /tmp/test.txt. 이제 vim /tmp/test.txt<ENTER>:wq. 'A \ n'이라는 2 바이트 파일이있는 파일을 다시 확인하십시오.
— Ruslan

줄 바꿈 문자로 끝납니다. 한 줄이 있으므로 줄 바꿈 문자가 하나 있습니다.
— romainl

글쎄, printf여기 후에 나는 잘 형성된 "줄"이 없었다. vim 후에 하나가 있습니다. 그래서 거기에 넣지 않은 것을 추가합니다.
— Ruslan

당신은 printf당신이 추가되지 않는 선 아닙니다 \n. 텍스트 편집기, 기본적으로 라인 빔 거래하고 있다는 어떤 사용자가 파일에 삽입 텍스트 것은 입니다 당신이 명시 적으로 그렇게하지 빔을 밝히지 않는 한 라인, 최소한,에.
— romainl

2

종료되지 않은 텍스트 파일은 여러 가지 이유로 악합니다. 여기 아직 언급하지 않은 것이 있습니다.

후행 줄 바꿈이없는 텍스트 파일이 허용되는 가상 세계에서는 0 줄이 포함 된 파일과 1 빈 줄이 포함 된 파일간에 차이가 없습니다. 둘 다 0 바이트 파일로 표시됩니다.

파일에 몇 줄이 있는지 결정할 수 없으면 나쁠 것입니다.


비 유닉스 시스템의 텍스트 파일에는 0 개 이상의 완전한 행과 0 개 이상의 문자의 불완전한 행이 포함됩니다. 빈 파일에는 빈 줄이 없습니다. 완전한 0 행과 0 문자의 일부 행을 포함합니다. 모호성은 어디에 있습니까?
— supercat

이 "부분 라인"은 불쾌한 개념입니다. 파일 끝 이외의 다른 곳을 가질 수 없으며 "부분 라인" 이없는 파일을 만들 수 없습니다 . 파일간에 줄 바꿈이 추가됩니다. 파일 사이에 줄 바꿈을 삽입하더라도 원래 파일 쌍과 의미가 동일하지 않은 것으로 끝납니다 (2 개의 파일에는 2 개의 부분 라인이 있고 그 중 하나는 무언가가 되었기 때문에 우아하지 않은 제안.
— Wumpus Q. Wumbley

파일을 연결하면 첫 번째 파일의 끝 부분에서 다음 파일 앞에 추가되는 부분 행이 두 파일에 전체 행이 포함 된 경우 일반적으로 불안정합니다 (때로는 전체 행이 포함되지 않은 파일을 연결하는 것이 유용 할 수 있음) ), 그러나 그것이 바로 그 것입니다. 유닉스는 부분 줄로 끝나는 텍스트 파일의 구성을 금지하지 않으며 그러한 파일을 연결하면 MSDOS와 같이 작동한다고 생각합니다. 내가 생각하는 차이점은 많은 DOS 기반 편집기가 역사적으로 파일을로드하고 즉시 저장하면 새 파일이 생성된다는 견해를 가지고 있다는 것입니다.
— supercat

... 이전 버전과 약간 동일합니다 (PC-Write 초기 버전의 등록 사용자는 실행 파일 사본을 열고, 덮어 쓰기 모드로 전환하고 특정 문자열을 찾아서 대체하도록 지시했습니다) 일련 번호!). 파일을 저장할 때 줄 바꿈으로 끝나도록하면 해당 제약 조건을 위반하게됩니다.
— supercat

1

'j'명령을 사용하면 모든 행을 하나로 결합 할 수 있습니다.

마지막 줄에서 LF 또는 CRLF를 제거하려면 vi에서 다음을 수행하십시오.

$ vi file
:set binary
:set noeol
:w!
:f          look for [noeol] on the status line
:q

1

Vim 8.0은 이제이 fixeol옵션을 제공합니다 . 특히 당신이 할 경우 :

:set nofixeol

Vim 은 파일에 아직 줄이 없으면 마지막 줄 끝에 줄 바꿈 문자를 추가하지 않습니다.

파일 형식 플러그인 또는 아마도 .vimrc.

(이것은 :set binary최종 줄 바꿈 문자에만 영향을 미치기 때문에 개선되었습니다 . 반면 binary실제로 바이너리 파일을 편집하지 않는 한 원하지 않는 다른 동작도 변경됩니다.)

새로 작성된 파일에는 기본적으로 후행 줄 바꿈 문자가 있습니다. 다음을 추가로 수행하여 변경 할 수 있습니다 (최종 개행 문자가있는 파일을 가지고 있지 않은 것으로 전환).

:set noeol

변경하려는 각 파일에 대해 특별히 설정해야합니다. 파일을 버퍼에로드하면 항상 eol파일의 현재 상태와 일치하도록 설정 됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.