vim에서 후행 공백을 자동으로 제거하는 방법


197

git에서 일부 파일을 커밋하려고하는 'trailing whitespace'오류가 발생합니다.

파이썬 파일을 저장하기 직전에 후행 공백 문자를 자동으로 제거하고 싶습니다.

이를 위해 vim을 구성 할 수 있습니까? 그렇다면 어떻게?


3
이 혼자 우려 파이썬을하지 않습니다

2
DeleteTrailingWhitespace 플러그인을 사용하십시오 .
Ingo Karkat

답변:


208

나는 여기서 답을 찾았다 .

내 .vimrc 파일에 다음을 추가하면 트릭을 얻었습니다.

autocmd BufWritePre *.py :%s/\s\+$//e

1
흥미 롭습니다! 후행 공백은 직장에서의 전투입니다. 나는 그것을 혐오하며, 다른 사람들은 왜 그런지 이해하지 못한다. vim만큼 vi를 사용합니다 (vim을 사용합니다. vim을 설치하지 않아도 됨). Strip Trailing Blanks에 stb라고 부르는 프로그램이 있는데 이것을 필터로 사용합니다. vi에서도 작동합니다. 이게 낫다.
Jonathan Leffler

16
각 저장시 커서 위치가 변경됩니다. 피할 수 있습니까?
stepancheg

3
이것은이 질문에 대한 사실상의 대답이므로 커서 위치를 유지하기 위해 업데이트해야 할 수도 있습니다.
Edu Felipe

2
이렇게하면 여러 줄 문자열에서 후행 공백이 삭제되므로 경우에 따라 원하지 않을 수도 있습니다. 그러나 이것을 피할 수있는 쉬운 방법이 없다고 생각합니까?
luator

3
어쩌면 당신이 e마지막에 패턴을 찾지 못하면 vi는 대체 명령이 실패한 것으로 간주하지 않는다는 것을
명백하게 알 수 있습니다.

169

위의 커서 위치와 저장 커서 위치의 컴파일 :

fun! <SID>StripTrailingWhitespaces()
    let l = line(".")
    let c = col(".")
    keepp %s/\s\+$//e
    call cursor(l, c)
endfun

autocmd FileType c,cpp,java,php,ruby,python autocmd BufWritePre <buffer> :call <SID>StripTrailingWhitespaces()

파일에 저장할 때 이것을 적용하려면 두 번째 파일을 제외 autocmd하고 와일드 카드를 사용하십시오 *.

autocmd BufWritePre * :call <SID>StripTrailingWhitespaces()

9
마지막 검색을 저장하고 복원하여 기능을 향상시킬 수 있습니다. let _s = @ / let @ / = _ s
xApple

3
autocmd FileType c,cpp,java,php,ruby,python 모든 파일에 적용하기 위해 부분을 제거했습니다 .
swt83

8
@xApple : 함수 내부에서 마지막 검색을 저장하고 복원 할 필요가 없습니다. 함수 컨텍스트를 벗어나면 처리됩니다.
Tobias

3
@ 당신은 또한 교체해야 swt83 <buffer>으로 *모든 파일에 대한 작업을 원하는 경우
cadlac

3
대체 명령에 접두사를 keeppkeepp %s/\s\+$//e
붙이면

68

나는 또한 보통 :

match Todo /\s\+$/

.vimrc파일에서 줄 끝 공백이 강조 표시됩니다.

Todo는 , 또는 과 같은 키워드를 강조 표시하는 데 사용되는 구문 강조 그룹 이름 입니다 . 성가 시게 못생긴 노란 배경색을 가지고 있으며 코드에서 원하지 않는 것을 강조하는 것이 가장 좋습니다 :-)TODOFIXMEXXX


7
또는 list를 설정하고 listchars + = trail :을 설정할 수 있습니다.
Oli December

훌륭함-후행 공백을 자동으로 제거하는 것 (알지 못하거나 동일한 파일에서 작업하는 다른 사람의 코드 인 경우)에서 아무것도하지 않는 완벽한 중간 지점입니다. . 감사.
Daniel Hershcovich

2
불행히도, 내가 가장 좋아하는 색 구성표 zenburn은 강조 표시되지 않습니다
Peter Long

@PeterLong은 railscasts 테마에서도 작동하지 않습니다. 로 확인하십시오 :hi Todo. 그래서 정독 :hi <Tab>하고 :help hi. 나는 생각 Cursor하고 Error,하지만 난 시도 것 같아요 match VisualNOS /\s\+$/ . 나는 이것을 autocmd다른 답변의 일부와 결합 할 수 있습니다.
브래디 트레이너

51

나는 기존의 후행 공백을 강조하고 후행 공백을 제거합니다.

끝에 공백을 표시하도록 편집기 (vim)를 구성합니다. 예 :

여기에 이미지 설명을 입력하십시오

내 .vimrc의 하단에 이것을 사용하십시오 :

highlight ExtraWhitespace ctermbg=red guibg=red
match ExtraWhitespace /\s\+$/
autocmd BufWinEnter * match ExtraWhitespace /\s\+$/
autocmd InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
autocmd InsertLeave * match ExtraWhitespace /\s\+$/
autocmd BufWinLeave * call clearmatches()

그리고 파일을 저장할 때 파일에서 '자동 스트립'합니다. 내 경우에는 루비 파일 * .rb, ~ / .vimrc에 다시

function! TrimWhiteSpace()
    %s/\s\+$//e
endfunction
autocmd BufWritePre     *.rb :call TrimWhiteSpace()

13

다음은 둘 이상의 FileType으로 필터링하는 방법입니다.

autocmd FileType c,cpp,python,ruby,java autocmd BufWritePre <buffer> :%s/\s\+$//e

모든 파일 : autocmd FileType * autocmd BufWritePre <buffer> : % s / \ s \ + $ // e
JREAM

7

http://blog.kamil.dworakowski.name/2009/09/unobtrusive-highlighting-of-trailing.html 에서 복사하여 붙여 넣기 (링크가 더 이상 작동하지 않지만 필요한 비트는 다음과 같습니다)

"이것은 파일을 열거 나 삽입 모드를 떠날 때만 줄 끝에 입력하는 각 공간을 강조 표시하지 않는 이점이 있습니다. 매우 깔끔합니다."

highlight ExtraWhitespace ctermbg=red guibg=red
au ColorScheme * highlight ExtraWhitespace guibg=red
au BufEnter * match ExtraWhitespace /\s\+$/
au InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
au InsertLeave * match ExtraWhiteSpace /\s\+$/

1
블로그 링크가 죽은 것 같습니다.
Tobias

이 링크 의 "match 명령 사용"에 동일한 솔루션이 있습니다.
ryanjdillon

6

VIM Wikia 의 의견 에서이 솔루션을 보았습니다 -원하지 않는 공간을 제거하십시오.

정말 좋아. .불필요한 공백을 추가합니다 .

여기에 이미지 설명을 입력하십시오

이것을 당신의 .vimrc

" Removes trailing spaces
function TrimWhiteSpace()
  %s/\s*$//
  ''
endfunction

set list listchars=trail:.,extends:>
autocmd FileWritePre * call TrimWhiteSpace()
autocmd FileAppendPre * call TrimWhiteSpace()
autocmd FilterWritePre * call TrimWhiteSpace()
autocmd BufWritePre * call TrimWhiteSpace()

5

이것이 내가하는 일입니다. 어디에서 훔쳤는 지 기억이 나지 않습니다.

autocmd BufWritePre * :call <SID>StripWhite()
fun! <SID>StripWhite()
    %s/[ \t]\+$//ge
    %s!^\( \+\)\t!\=StrRepeat("\t", 1 + strlen(submatch(1)) / 8)!ge
endfun

2
흠, 이진 파일을 결국 열면 "*"에서 처리하는 것이 매우 위험합니다.
mat

네, 아마도 가장 똑똑하지 않을 것입니다. 다시 한 번 16 진수 편집기에 vim을 사용하지 않습니다. 저장하지 않으면 실행되지 않습니다.
gregf 2009

나는 이것이 당신이 작업 할 수있는 모든 단일 파일 유형을 나열하는 대안을 능가한다고 생각합니까? 나는 rb, php, cs, html, sass, css, js, coffee, xml, xslt, pl 등에서 일하고 있습니다 ... 행복한 매체가 있습니까?
Derek 이전

4
vim에서 바이너리 파일에 쓰지 않는 한 이것은 문제가되지 않을 것입니다.
gregf 2016 년

그것은 처음 %s으로 세계 (g) 깃발이 EOL의 공간만큼 쓸모없는 것처럼 보입니다 :-)
Jens

3

파일에서 후행 공백을 제거하는 솔루션은 모든 상황에서 허용되는 것은 아닙니다. 처음부터이 정책을 적용한 프로젝트에서 작동하므로 앞으로 커밋에 자신을 추가하지 않은 공백이 없습니다.

작업과 관련없는 변경 사항을 커밋하지 않기 위해 편집하지 않은 줄의 기존 공백에 영향을 미치지 않고 후행 공백의 새 인스턴스를 추가하지 않기를 원한다고 가정하십시오.

이 경우 git을 사용하면 다음과 같은 스크립트를 사용할 수 있습니다.

#!/bin/sh

set -e # bail on errors

git stash save commit-cleanup
git stash show -p | sed '/^\+/s/ *$//' | git apply
git stash drop

즉, 변경 사항을 숨기고 +작업 디렉토리에 변경 사항을 다시 적용 할 때 diff의 모든 줄 을 필터링 하여 후행 공백을 제거합니다. 이 명령 파이프가 성공하면 숨김을 삭제합니다.


1

MacVim에서 .vimrc파일에 사용될 때 다른 접근 방식이 어떻게 든 작동하지 않았습니다 . 다음은 후행 공백을 수행하고 강조 표시하는 것입니다.

set encoding=utf-8
set listchars=trail:·
set list

실행 set listchars=trail:·말 : E474: Invalid argument: listchars=trail:·. 예를 확인할 수 있습니까?
kenorb



0

특정 파일 형식에 대해 파일을 실행하려는 사람들의 경우 (FileTypes가 항상 신뢰할 수있는 것은 아님) :

autocmd BufWritePre *.c,*.cpp,*.cc,*.h,*.hpp,*.py,*.m,*.mm :%s/\s\+$//e

또는 vim7의 경우 :

autocmd BufWritePre *.{c,cpp,cc,h,hpp,py,m,mm} :%s/\s\+$//e

0

공백을 자르면 이미 깨끗한 파일 에서만 해야합니다. "로마에 갔을 땐...". 이것은 가짜 변경이 환영받지 않는 코드베이스에서 작업 할 때 좋은 예의입니다.

이 기능은 후행 공백을 감지하고 이미 깨끗해야 트리밍을 켭니다.

이 아이디어에 대한 크레딧은 https://github.com/atom/whitespace/issues/10 (가장 긴 버그 티켓 댓글 스트림)

autocmd BufNewFile,BufRead *.test call KarlDetectWhitespace()

fun! KarlDetectWhitespace()
python << endpython
import vim
nr_unclean = 0
for line in vim.current.buffer:
    if line.rstrip() != line:
        nr_unclean += 1

print "Unclean Lines: %d" % nr_unclean
print "Name: %s" % vim.current.buffer.name
cmd = "autocmd BufWritePre <buffer> call KarlStripTrailingWhitespace()"
if nr_unclean == 0:
    print "Enabling Whitespace Trimming on Save"
    vim.command(cmd)
else:
    print "Whitespace Trimming Disabled"
endpython
endfun

fun! KarlStripTrailingWhitespace()
    let l = line(".")
    let c = col(".")
    %s/\s\+$//e
    call cursor(l, c)
endfun

검색 레지스터를 유지 let _s=@/하고 마지막에`let @ / = _ s` 복원 할 수도 있습니다 .이 경우에는 블랙홀 레지스터를 사용합니다
SergioAraujo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.