답변:
:retab
명령을 사용할 수 있습니다 . 에서
:help :retab
<Tab>
주어진 새로운 tabstop 값을 사용하여 공백을 포함하는 모든 일련의 공백 을 새로운 공백 문자열로 교체하십시오 . 새 탭 스톱 크기를 지정하지 않거나 0이면 Vim은 현재 값을 사용합니다'tabstop'
. [...]'expandtab'
on으로 설정하면 Vim은 모든 탭을 적절한 수의 공백으로 바꿉니다.
이 명령은 범위를 허용하므로 시각적으로 선택한 다음 :retab
선택한 선만 선택할 수 있습니다.
: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
. (수동으로 지정하는 것을 선호합니다).
a
의 if a:expandtab
의미를 설명 할 수 있습니까?
set expandtab
.vimrc에 있으면 autocmd BufWritePre * :call Retab(&expandtab)
들여 쓰기가 공백 대신 탭으로 변경됩니다.
Vim은 주어진 새로운 tabstop (예 :) 값을 사용하여 !retab
모든 <Tab>
문자열을 새로운 공백 문자열로 대체 하는 명령을 제공 :set tabstop=2
하지만 문자열 내부의 모든 탭을 수정할 수 있습니다 (예 : C 프로그램에서는이 \t
를 피하기 위해 사용해야 합니다)!
또는 다음 명령을 사용하여 모든 탭을 공백으로 변경할 수 있습니다.
:%s/\t/ /g
:%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
관련 :
%s/^\t\+/ g
들여 쓰기에 사용 된 탭 만 변환되도록해야합니다. 또한 gg=G
파이썬과 같은 언어로 치명적일 수 있습니다.
다음을 사용하십시오.
expand -t 4 input_filename output_filename
expand
탭을 공백으로 변환하는 명령 줄 도구이며 셸에서 또는로 실행할 수 있습니다 :!expand
.
그것은이다 POSIX으로 는 대부분의 시스템에서 사용할 수 있어야하므로. unexpand
그건 그렇고 그 반대의 경우도 마찬가지입니다.
expand
?
:%!expand -t 4
vim 내부에서 할 수도 있습니다 . 더 나은 아직, 당신은 또한 현재 시프트 폭 옵션을 사용할 수 있습니다 : :exe '%!expand -t ' . &shiftwidth
완전성 =
을 위해 탭을 공백으로 바꾸도록 지정한 후 들여 쓰기를 수정하는 데 사용할 수도 있습니다. 일반 모드에서는을 입력하면됩니다 :set expandtab
. 그런 다음 =
두 가지 방법으로 사용할 수 있습니다.
=
코드 블록의 들여 쓰기를 수정합니다.gg=G
전체 파일을 수정하여 gg
커서를 파일의 시작 부분으로 이동 한 다음 =
적용 G
하고 커서를 파일의 끝으로 이동합니다.참조 : 링크
:h vim-faq
및 검색/tab characters
. 기억하기 어려운 태그는:h faq-14.16
입니다.