파일 끝에서 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
나는 모두를 설정했다 noeolnofixeol바람직한 결과를 얻을 수 있습니다.
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 아 죄송합니다. 이 아래 찾고 있었다 INSTALLATIONCONFIGURATION. 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.