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.