파일 끝에서 VIM이 자동 줄 바꿈 비활성화


250

그래서 저는 PHP 상점에서 일하고, 우리는 모두 다른 편집기를 사용하며, 우리는 모두 창에서 작업해야합니다. 나는 vim을 사용하고 있으며 상점의 모든 사람들은 파일을 편집 할 때마다 맨 아래에 줄 바꿈이 있다고 불평합니다. 나는 주변을 둘러 보았고 이것이 vi & vim의 문서화 된 행동이라는 것을 알았습니다 ...하지만이 기능을 비활성화 할 수있는 방법이 있는지 궁금합니다. (특정 파일 확장자에 대해 사용하지 않도록 설정하는 것이 가장 좋습니다).

누군가 이것에 대해 알고 있다면 좋을 것입니다!


23
그들에게 그들이 어리석은 짓이라고 말해야합니다 . vim이 그렇게하는 이유는 실제로 있습니다 : stackoverflow.com/questions/729692/… . 그래도 유닉스 계열 서버에 배포하는 경우에만 관련이 있다고 생각합니다.
— hdgarrood

5
공식 PHP 권장 사례는 ?>이런 이유로 마지막 닫는 태그 를 생략하는 것 입니다.
— Sebastián Grignoli

이 질문은 아마도 수퍼 유저보다 먼저 나왔을 것입니다.
— gcb

20
질문은 정말해야한다 : 우리는 당신의 가게에서 사람들이 파일의 마지막 줄을 보장하기 위해 사용하는 다른 편집자의 모든 말하려면 어떻게해야 합니까 EOL과 끝을. ;-)
— TJ Crowder

답변:


359

그리고 대한 vim7.4+ 당신은 (뉴스의 마지막 비트에 대한罗泽轩덕분에!) (당신의 .vimrc에 바람직)를 사용할 수 있습니다 :

:set nofixendofline

의 이전 버전에 관한 내용입니다 vim.

파일이 끝에 새 줄로 이미 저장된 경우에도 :

vim -b file 그리고 한 번 vim에서 :

:set noeol
:wq

끝난.

또는 vim에서 파일을 열 수 있습니다 :e ++bin file

또 다른 대안 :

:set binary
:set noeol
:wq

6
또한 .vimrcset binaryset noeol
— dryobs

17
주의 : binaryoverrides expandtab는 소스에서 리터럴 탭을 가져옵니다.
— Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

4
@CiroSantilli 감사합니다! 나는 바이너리의 부작용을 영원히 찾고 있었고 그것이 왜 기본이 아닌지 궁금합니다! 탭을 좋아하기 때문에 추가 혜택을 고려할 것입니다. :)
— gcb

11
이제 set nofixendoflineVim 7.4+의 문제를 해결하기 위해 추가 할 수 있습니다.
— 罗泽轩

1
@TrevorBoydSmith yes. 역사적으로 POSIX (실제 표준에서는 틀릴 수 있음)가 텍스트 파일의 줄 끝에 새 줄을 기대하기 때문입니다. 그렇기 때문에 대부분의 솔루션에서 바이너리로 취급해야했습니다. 아마도 매우 편리했을 것입니다. 그리고 그것은 오늘날에는 뒤떨어졌습니다. 그래서 지금 편리한 설정이 있습니다. vimrc에 추가하십시오. 어쨌든 다른 편집자들
— 에게는

23

.vimrc에 다음 명령을 추가하여 라인 끝 옵션을 설정하십시오.

autocmd FileType php setlocal noeol binary fileformat=dos

그러나 PHP 자체는 마지막 줄 끝을 무시합니다. 문제가되지는 않습니다. 나는 당신의 경우에 마지막 줄 바꿈 문자를 추가하는 다른 것이 있거나 아마도 Windows / Unix 줄 끝 유형 ( \n또는 \r\n등)이 섞일 수 있다고 확신합니다 .

최신 정보:

다른 해결책은이 줄을 .vimrc에 추가하는 것입니다.

set fileformats+=dos

나는 PHP가 잘못 해석하지 않는다는 것을 알고있다. 나는 그것을 내 동료들에게 보여 주 었지 만 winmerge는 그것들이 다르다고 생각한다.
— Boushley

이 작업을 수행하면 최종 행이 아닌 원하는 효과가 있지만 파일을 유닉스 행 끝으로 변환합니다 (Windows 상자에서도) ... 그래서 바이너리 모드로 전환하여 이전에 수행했지만 ... 줄 끝은 메모장에 쓰기로 표시되지 않습니다 ... 모든 것이 한 줄입니다.
— Boushley

불행히도 이러한 제안 중 어느 것도 효과가 없습니다. autocmd에 fileformat = dos를 추가해도 효과가 없으며 set filetype + = dos는 여전히 후행을 추가합니다. \ n
— Boushley

죄송합니다, 잘못 알고 있습니다. 'set fileformats + = dos'를 사용하고 'set fileformats ...'을 (를) 사용하지 마십시오.
— 너무 많은 PHP

17

소스 제어에 Git을 사용하는 경우 다른 방법으로 접근 할 수 있습니다. 여기 에 대한 답변에서 영감을 얻어 gitattributes 파일 에 사용할 필터를 직접 작성했습니다 .

이 필터를 설치하려면 필터를 noeol_filter다른 곳에 저장 $PATH하고 실행 가능하게 한 후 다음 명령을 실행하십시오.

git config --global filter.noeol.clean noeol_filter
git config --global filter.noeol.smudge cat

자신 만의 필터 사용을 시작하려면 다음 줄을 입력하십시오 $GIT_DIR/info/attributes.

*.php filter=noeol

이렇게하면 .phpVim이 무엇을하든 eof에서 줄 바꿈을하지 않아도 됩니다.

그리고 지금, 스크립트 자체 :

#!/usr/bin/python

# a filter that strips newline from last line of its stdin
# if the last line is empty, leave it as-is, to make the operation idempotent
# inspired by: /programming/1654021/how-can-i-delete-a-newline-if-it-is-the-last-character-in-a-file/1663283#1663283

import sys

if __name__ == '__main__':
    try:
        pline = sys.stdin.next()
    except StopIteration:
        # no input, nothing to do
        sys.exit(0)

    # spit out all but the last line
    for line in sys.stdin:
        sys.stdout.write(pline)
        pline = line

    # strip newline from last line before spitting it out
    if len(pline) > 2 and pline.endswith("\r\n"):
        sys.stdout.write(pline[:-2])
    elif len(pline) > 1 and pline.endswith("\n"):
        sys.stdout.write(pline[:-1])
    else:
        sys.stdout.write(pline)

불행히도 나는 git을 사용하지 않았지만 훌륭한 솔루션입니다. svn을 사용하고 있었지만 비슷한 접근법을 취할 수 있다고 생각합니다. 어쨌든, 나는 그 위치에서 나아 갔고 더 이상 그것에 대해 걱정할 필요가 없습니다 :)
— Boushley

12

이 옵션을 시도하지 않았지만 다음 정보가 vim 도움말 시스템에 제공됩니다 (예 : help eol).

'endofline' 'eol'   boolean (default on)
            local to buffer
            {not in Vi}

When writing a file and this option is off and the 'binary' option
is on, no <EOL> will be written for the last line in the file.  This
option is automatically set when starting to edit a new file, unless
the file does not have an <EOL> for the last line in the file, in
which case it is reset.  

일반적으로이 옵션을 설정하거나 재설정 할 필요가 없습니다. 'binary'가 꺼져 있으면 파일을 쓸 때 값이 사용되지 않습니다. '이진'이 켜져 있으면 파일의 마지막 줄에 대한 존재를 기억하는 데 사용되므로 파일을 쓸 때 원본 파일의 상황을 유지할 수 있습니다. 그러나 원하는 경우 변경할 수 있습니다.

이전 질문에 대한 대답에 관심이있을 수도 있습니다. " 파일이 줄 바꿈으로 끝나야하는 이유 ".


나는 또한 eol 설정을 보았지만 ...이 작업을 수행하지는 않습니다. 파일 끝에 이미 있는지 여부를 결정하는 변수가 더 있습니다. 또한 텍스트 파일에는 영향을 미치지 않지만 이진 파일에만 영향을줍니다.
— Boushley 2016 년

3
이 vim 도움말에는 " 'binary'가 꺼져 있으면 파일을 쓸 때 값이 사용되지 않습니다."라고 표시됩니다. eol 소개
— Boushley 2016 년

1
해당 질문에 대한 VonC의 답변은 +1로, "newline"과 EOL이 혼동되고 있음을 강조합니다. 열등한 편집기 는 EOL 때문에 추가 줄 바꿈을 잘못 표시 합니다. vim은 "줄 바꿈"을 추가하지 않습니다!
— ches

9

Vim Wiki에 비슷한 (그러나 다른) 문제에 대한 팁을 추가했습니다.

http://vim.wikia.com/wiki/Do_not_auto-add_a_newline_at_EOF


5
“Vim 7.4.785는 fixeol파일 끝에 누락 된 EOL을 자동으로 유지하기 위해 비활성화 할 수있는 옵션을 추가 합니다. Vim 7.4.785 이상에서는이 스크립트가 불필요하게되었습니다.” (출처 : 같은 위키 페이지) 고마워, 나는 그 새로운 옵션을 몰랐다.
— Amir

1
나는 모두를 설정했다 noeol및 nofixeol바람직한 결과를 얻을 수 있습니다.
— selurvedu

8

좋아, 당신은 Windows에서 일을 복잡하게합니다;)

'binary'옵션이 'fileformat'옵션을 재설정하고 ( 'binary'세트로 쓰는 것은 항상 유닉스 줄 끝으로 쓴다) 큰 망치를 꺼내서 외부 적으로 해보자!

BufWritePost 이벤트에 대한 자동 명령 (: help autocommand)을 정의하는 것은 어떻습니까? 이 자동 명령은 전체 버퍼를 쓸 때마다 실행됩니다. 이 자동 명령에서 방금 작성된 파일의 마지막 줄 바꿈을 제거하는 작은 외부 도구 (php, perl 또는 any script)를 호출하십시오.

따라서 이것은 다음과 같을 것이며 .vimrc 파일로 이동합니다.

autocmd!   "Remove all autocmds (for current group), see below"
autocmd BufWritePost *.php !your-script <afile>

자동 명령을 처음 다루는 경우 자동 명령에 대한 전체 vim 설명서를 읽으십시오. 몇 가지주의 사항이 있습니다. 예를 들어 .vimrc가 여러 번 소스 될 수있는 경우 .vimrc에서 모든 autocmds를 제거하는 것이 좋습니다.


글쎄 ... 나는 이것보다 더 나은 해결책이 있기를 바랐다. 그러나 이것은 확실히 작동한다!
— Boushley

3
이것은 잘 작동합니다! 예이! 그러나 한 가지 질문이 있습니다 ... 각 저장 후 엔터를 두 번 누르지 않아도되도록하는 방법이 있습니까? vim이 스크립트가 성공적으로 반환되었다고 알려주기 때문에 cmd 창에서 Enter 키를 누른 다음 다시 입력해야합니다 ... 모두 제거 할 수있는 방법은 무엇입니까?
— Boushley

2
<Enter Enter> 프롬프트를 피하려면 명령 앞에 접두사를 붙이십시오 silent. 예 silent !your-script <afile>.
— dash-tom-bang

6

Vim 내부에서 실행되거나 (언어 지원으로 컴파일 된 경우) 외부 Perl 스크립트를 통해 Perl 및 Python 사후 처리를 통해 Blixtor의 제안을 구현했습니다. vim.org 에서 PreserveNoEOL 플러그인 으로 제공됩니다 .


철저히 테스트하지는 않았지만 더 나은 솔루션처럼 보입니다.
— Boushley

플러그인은 작동하지만 설치 후 파일 에 넣어야 let g:PreserveNoEOL = 1했습니다 .vimrc! 플러그인 설명에서 알아내는 vimscript를 배웠습니다! : D
— DarthVanger

1
@DarthVanger : :help PreserveNoEOL-usage당신에게도 말했을 것입니다. RTFM :-)
— Ingo Karkat

@ IngoKarkat 아 죄송합니다. 이 아래 찾고 있었다 INSTALLATION및 CONFIGURATION. USAGE설치보다 위에 있기 때문에 설명 부분 도 눈치 채지 못했습니다 :)
— DarthVanger

3

어쩌면 당신은 그들이 불평하는 이유를 볼 수 있습니다. 종료?> 뒤에 php 파일에 줄 바꿈이 있으면 php는 페이지의 일부로 출력합니다. 파일이 포함 된 후 헤더를 보내려고하지 않으면 문제가되지 않습니다.

그러나 PHP 파일 끝의?>는 선택 사항입니다. 파일 끝에서 줄 바꿈에 아무런 문제가 없습니다.


2
당신은 정확하지만 상점으로서 우리는 결말을 갖는 것이 더 나을 것이라고 결정 했습니까?> 나는 우리가 그것을 사용할 수 없다는 것을 알고 있습니다 ...하지만 다른 방법보다 내 코딩 스타일에 맞게 편집기를 조정하는 것을 선호합니다.
— Boushley 2016 년

1
또한, PHP가 자동으로 종료 태그를?> 또는?> \ n으로 구문 분석한다는 것을 알고 있습니다 (리눅스에서는 모든 유효한 파일이 \ n으로 끝나야하기 때문에) ... 그래서 내 코드는 이러한 문제를 일으키지 않습니다 ... 그들은 단지 모양을 좋아하지 않습니다.
— Boushley

2

.vimrc에 추가합니다

set binary

그리고 도움이됩니다.


2

나는 받아 들인 대답보다 더 나은 해결책을 찾았다 고 생각합니다. 대안 솔루션이 나를 위해 작동하지 않았으며 항상 바이너리 모드로 작업하고 싶지 않았습니다. 다행히도 이것은 작업을 완료 한 것으로 보이며 아직 불쾌한 부작용을 경험하지 못했습니다. 텍스트 파일 끝에 줄 끝을 유지하십시오 . 방금 ~ / .vimrc에 모든 것을 추가했습니다.


1

이러한 파일을 저장하기 위해 특별한 명령을 사용할 수 있습니까?

: set binary, : w 및 : set nobinary를 수행하면 시작할 파일이 없으면 줄 바꿈없이 파일이 작성됩니다.

이 명령 시퀀스는 물론 사용자 정의 명령 또는 매핑에 넣을 수 있습니다.


불행히도 Windows로 작업하고 있기 때문에 바이너리 모드로 저장하면 저장이 유닉스 모드가됩니다. 내가 할 때조차도 : set binary : set fileformat = dos : w : set nobinary 일단 종료하면 파일을 유닉스 형식으로 저장했습니다 ...이 기능을 끌 수있는 방법이 없다고 믿을 수 없습니다.
— Boushley


0

이 vimscript 플러그인이이 상황에 도움이된다는 것을 알았습니다.

Plugin 'vim-scripts/PreserveNoEOL'

또는 github 에서 더 읽으십시오

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