탭을 공백으로 바꾸는 방법?


85

텍스트 정렬을 유지하면서 탭을 공백으로 변환 할 수 있습니까?

선행 문자가 없을 때만 간단히 교체하는 것이 유용합니다.


vim-faq를 설치 한 경우 오프라인 답변을 얻을 수 있습니다 : :h vim-faq및 검색 /tab characters. 기억하기 어려운 태그는 :h faq-14.16입니다.
Hotschke

답변:


98

:retab명령을 사용할 수 있습니다 . 에서 :help :retab

<Tab>주어진 새로운 tabstop 값을 사용하여 공백을 포함하는 모든 일련의 공백 을 새로운 공백 문자열로 교체하십시오 . 새 탭 스톱 크기를 지정하지 않거나 0이면 Vim은 현재 값을 사용합니다 'tabstop'. [...] 'expandtab'on으로 설정하면 Vim은 모든 탭을 적절한 수의 공백으로 바꿉니다.

이 명령은 범위를 허용하므로 시각적으로 선택한 다음 :retab선택한 선만 선택할 수 있습니다.


시원한! 빠르고 간단하게 작동합니다!
DenisKolodin

2
예제를 제공하는 것은 어떻습니까?
Petr

23

:retab그러나 명시된 바와 같이을 사용할 수 있지만 줄 시작 부분의 탭 뿐만 아니라 모든 탭이 공백으로 변경 됩니다.

그래서 이것은 ( 탭 문자가 있습니다) :

if :; do
⇥echo "⇥hello"
end

( 공백 문자가있는 곳 )으로 변경됩니다 .

if :; do
␣␣echo "␣␣hello"
end

일부 시나리오에서는 예기치 않은 부작용이 발생할 수 있으며 공백을 탭으로 변경할 때 훨씬 더 큰 문제가됩니다!

따라서 줄 의 시작 부분 에서 탭 / 공백 변경하는 작은 기능을 작성했습니다 .

" :retab changes *everything*, not just start of lines
fun! Retab(expandtab)
    let l:spaces = repeat(' ', &tabstop)

    " Replace tabs with spaces
    if a:expandtab
        silent! execute '%substitute#^\%(' . l:spaces . '\)\+#\=repeat("\t", len(submatch(0)) / &tabstop)#e'
    " Replace spaces with tabs
    else
        silent! execute '%substitute#^\%(\t\)\+#\=repeat("' . l:spaces . '", len(submatch(0)))#e'
    endif
endfun

이 버전을 사용 expandtab하면 함수 호출에서 수동으로 지정해야 합니다 (즉 :call Retab(1), 탭을 공백으로 변경). 현재 &expandtab와 같이 ( 현재 와 &tabstop같이) 현재 값 을 갖도록 수정 할 수도 있습니다 :retab. (수동으로 지정하는 것을 선호합니다).


6
라인 시작시에만 리타 빙하는 것을 다루는 SO에 대한 답변 도 있습니다 . 그 설명이 명확하기 때문에 연결하는 것이 좋습니다.
jalanb

누군가 편지 aif a:expandtab의미를 설명 할 수 있습니까?
john cj

또한 조건이 반대로 보인다 (농담 : D?). set expandtab.vimrc에 있으면 autocmd BufWritePre * :call Retab(&expandtab)들여 쓰기가 공백 대신 탭으로 변경됩니다.
john cj

11

Vim은 주어진 새로운 tabstop (예 :) 값을 사용하여 !retab모든 <Tab>문자열을 새로운 공백 문자열로 대체 하는 명령을 제공 :set tabstop=2하지만 문자열 내부의 모든 탭을 수정할 수 있습니다 (예 : C 프로그램에서는이 \t를 피하기 위해 사용해야 합니다)!

또는 다음 명령을 사용하여 모든 탭을 공백으로 변경할 수 있습니다.

:%s/\t/  /g

또는 @Shahbaz가 제안한 대로 :

:%s/^\t\+/ g

따라서 들여 쓰기에 사용 된 탭만 변환됩니다.

설명:

  • %전체 버퍼 / 파일을 나타냅니다 ( :help :%)
  • s대체 ( :help sub-replace-special)의 약자
  • \t또는 ^I탭을 나타냅니다
  • -하나의 탭당 필요한만큼의 공간을 사용하십시오
  • g -전역을 나타내며 여러 줄의 탭을 동일한 줄에서 변환합니다.

그런 다음 전체 파일의 들여 쓰기를 수정하려면 다음을 시도하십시오 gg=G.. 확인 : 잘못 들여 쓰기 된 코드다시 들여 쓰기 하여 자세한 내용을 확인하십시오.

탭 대신 기본적으로 공백을 사용하려면 .vimrc파일에 다음 설정을 추가해야 합니다.

set tabstop=2     " (ts) width (in spaces) that a <tab> is displayed as
set expandtab     " (et) expand tabs to spaces (use :retab to redo entire file)
set shiftwidth=2  " (sw) width (in spaces) used in each step of autoindent (aswell as << and >>)

다른 해결책은 사용하는 것입니다 tidy


관련 :


1
적어도 %s/^\t\+/ g들여 쓰기에 사용 된 탭 만 변환되도록해야합니다. 또한 gg=G파이썬과 같은 언어로 치명적일 수 있습니다.
Shahbaz

3

다음을 사용하십시오.

expand -t 4 input_filename output_filename

expand탭을 공백으로 변환하는 명령 줄 도구이며 셸에서 또는로 실행할 수 있습니다 :!expand.

그것은이다 POSIX으로 는 대부분의 시스템에서 사용할 수 있어야하므로. unexpand그건 그렇고 그 반대의 경우도 마찬가지입니다.


2
무엇입니까 expand?
muru

Expand는 탭 문자를 공백으로 복사하는 내장 된 터미널 명령입니다. 자세한 내용은 다음 링크를 참조하십시오. computerhope.com/unix/uexpand.htm
Ankit Shah

2
이러한 명령이 외부 명령 인 경우 언급해야합니다.
muru

추가 설명이 추가되었습니다. 검토하십시오
Ankit Shah

5
:%!expand -t 4vim 내부에서 할 수도 있습니다 . 더 나은 아직, 당신은 또한 현재 시프트 폭 옵션을 사용할 수 있습니다 : :exe '%!expand -t ' . &shiftwidth
EvergreenTree

1

완전성 =을 위해 탭을 공백으로 바꾸도록 지정한 후 들여 쓰기를 수정하는 데 사용할 수도 있습니다. 일반 모드에서는을 입력하면됩니다 :set expandtab. 그런 다음 =두 가지 방법으로 사용할 수 있습니다.

  • 비주얼 모드에서는 단일 =코드 블록의 들여 쓰기를 수정합니다.
  • 일반 모드에서는 gg=G전체 파일을 수정하여 gg커서를 파일의 시작 부분으로 이동 한 다음 =적용 G하고 커서를 파일의 끝으로 이동합니다.

참조 : 링크


이것은 vim이 현재 들여 쓰기를 올바르게 재 계산할 수 있다고 가정합니다 (경우 에 따라 다름 ) -구조화되지 않은 파일 또는 들여 쓰기 규칙이 약간 다른 다른 편집기로 작성된 코드 의 경우 에도 마찬가지입니다.
ideasman42

감사합니다 @ ideasman42; 더 완벽하게 답변에 추가했습니다.
사무엘 리
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.