vim에서 탭을 공백으로 바꿉니다.


358

gVim에서 탭을 공백으로 변환하고 싶습니다. 내 다음 줄을 추가했습니다 _vimrc.

set tabstop=2

두 공백에서 멈추는 것으로 작동하지만 여전히 하나의 탭 키가 삽입 된 것처럼 보입니다 (나중에 공백을 계산하기 위해 h 키를 사용하려고했습니다).

gVim에서 탭을 공백으로 변환하려면 어떻게해야하는지 잘 모르겠습니다.


1
개인적으로, 나는 tabstop = 2가 너무 작은 들여 쓰기를 발견했다. 나는 ts = 4를 사용하고 사람들 (Linux 커널 팀과 같은)이 ts = 8을 사용하는 이유를 이해합니다 (그리고 그들은 expandtab을 사용하지 않습니다).
Jonathan Leffler

4
vim 내부에서 공백을 탭으로 변환하는 방법이 있습니까?
cwd

2
예를 들어 현재 탭이 4 개의 공백 인 경우 @cwd 공백을 탭 문자 ( 다음에 ^I오는 )로 바꾸면 작동합니다.Ctrl-vTab:%s/ /^I/g
Indra Ginanjar

답변:


381

IIRC, 다음과 같은 것 :

set tabstop=2 shiftwidth=2 expandtab

트릭을해야합니다. 이미 탭이 있다면 멋진 전역 RE로 탭을 두 개의 공백으로 대체하십시오.


25
죄송합니다. ": %! expand -t2"
Paul Tomblin

368
아니면 그냥 사용할 수 있습니다 섞여있는
rampion

공백으로 저장하려면 어떻게해야합니까? 지금 : wq하고 파일을 다시 열면 탭으로 돌아갑니다
Gorkem Yurtseven

1
@Gorkem은이 명령들을 .vimrc에 넣었습니다. vim은 매 세션마다 그 설정을 사용합니다
Krakkos


824

다른 답변에 따라 확장 탭을 설정하면 새 설정에 따라 기존 파일을 변환하는 매우 편리한 방법은 다음과 같습니다.

:retab

현재 버퍼에서 작동합니다.


그러나 우리는 어떻게 TAB의 각 발생에 대해 retab이 확인하도록 할 수 있습니까?
Oculus Dexter

8
그리고 Vim이기 때문에, 그것은 시각적으로 선택된 지역에서도 작동합니다 :)
Andy

2
새로운 것을 가르쳐 주셔서 감사합니다. 나는 :%s/\t/ /g당신의 의견을보기 전에 수년 동안 지루한 것을 사용했습니다 .
Tai Le

:args retab | w명령 행에서 열린 모든 파일 (예 :)을 수행 할 수도 있습니다 vim *.txt.
JakeD

누구든지 vim의 어떤 버전이 : retab인지 알고 있습니까? 내 7.3.322는 그렇지 않습니다.
비트 메이커

114

시험

set expandtab

소프트 탭용.

기존 탭을 수정하려면

:%s/\t/  /g

tabstop을 이미 2 칸으로 설정했기 때문에 2 칸을 사용했습니다.


5
이 수정은 하나만 필요한 곳에 두 개의 공백을 삽입합니다.
Jonathan Leffler

8
대체 대신에 Nick이 위에서 제안한대로 (즉, retab) 수행 할 수 있습니다. 이렇게하면 기존의 모든 탭이 탭 스톱에 설정된 공간 수만큼 다시 탭됩니다.
Gowri

멋진 팁! Vim은 나에게 완벽하게 식별 된 파일을 보여 주었고 cat (linux cmd)는 불규칙한 식별을 보여주었습니다. Vim에서 사용할 때 2 개의 공백을 4로 변경했습니다 set ts = 4.
karlphillip

60

이것은 나를 위해 일했다 :

먼저 다음과 같이 탭을 볼 수 있습니다.

:set list

탭을 교체 할 수 있도록하려면 다음을 수행하십시오.

:set expandtab

그때

:retab

이제 모든 탭이 공백으로 바뀌어 다음과 같이 일반보기로 돌아갈 수 있습니다.

:set nolist

1
:set list그냥 아름답습니다.
Amir A. Shabani

44

gg=G 전체 파일을 다시 들여 쓰기하고 동료가 파일에 넣은 모든 탭이 아닌 경우 대부분 제거합니다.


1
탭을 공백으로 대체합니까?
likejudo

1
대박! 나를 위해 일했습니다.
Nawaz

1
gg = G가 무엇을하는지 설명 할 수 있습니까? 이것은 내가 찾던 것을 정확하게했습니다. 나는 숭고한 HTML을 가지고 있으며 vim에 붙여 넣을 때 미친 듯이 들여 쓰기되었습니다. 이제 깨끗해 보입니다.
jes516

3
@ jes516 gg은 커서를 버퍼의 시작 부분으로 이동시킵니다. =형식이며 이동 명령을받습니다. G커서를 버퍼의 끝으로 이동하여 vim에게 현재 버퍼의 처음부터 끝까지 포맷하도록 지시합니다.
Jake Sellers

40

.vimrc에 다음 줄을 추가하십시오

set expandtab
set tabstop=4
set shiftwidth=4
map <F2> :retab <CR> :wq! <CR>

vim에서 파일을 열고 F2를 누릅니다. 탭이 4 개의 공백으로 변환되고 파일이 자동으로 저장됩니다.


그것은이 있음을 지적 아마도 가치 q뿐만 아니라 파일의 현재 버퍼를 닫습니다. 이것은 바람직하거나 바람직하지 않을 수 있습니다.
Willem van Ketwich

14

\t8 칸을 동일하게 유지하려면 설정을 고려하십시오.

   set softtabstop=2 tabstop=8 shiftwidth=2

이렇게하면 <TAB>프레스 당 2 개의 공백이 생길 수 있지만 실제 \t코드에서는 8 자로 표시됩니다.


softtabstop킬러 기능 중 하나 를 언급 해 주셔서 감사합니다 .
Martin Ueding


4

파일에서 탭을 먼저 검색하십시오 : / ^ I : set expandtab : retab

작동합니다.


첫 번째 부분을 설명해 주시겠습니까?
serup

3

이 기사에는 탭 + 공백을 처리하고 그 사이를 변환하는 데 유용한 vimrc 스크립트가 있습니다.

다음 명령이 제공됩니다.

Space2Tab 들여 쓰기로만 공백을 탭으로 변환하십시오.

Tab2Space 들여 쓰기에서만 탭을 공백으로 변환합니다.

RetabIndent Space2Tab ( 'expandtab'이 설정된 경우) 또는 Tab2Space (그렇지 않은 경우)를 실행하십시오.

각 명령은 탭 열의 공백 수를 지정하는 인수를 허용합니다. 기본적으로 '탭 중지'설정이 사용됩니다.

출처 : http://vim.wikia.com/wiki/Super_retab#Script

" Return indent (all whitespace at start of a line), converted from
" tabs to spaces if what = 1, or from spaces to tabs otherwise.
" When converting to tabs, result has no redundant spaces.
function! Indenting(indent, what, cols)
  let spccol = repeat(' ', a:cols)
  let result = substitute(a:indent, spccol, '\t', 'g')
  let result = substitute(result, ' \+\ze\t', '', 'g')
  if a:what == 1
    let result = substitute(result, '\t', spccol, 'g')
  endif
  return result
endfunction

" Convert whitespace used for indenting (before first non-whitespace).
" what = 0 (convert spaces to tabs), or 1 (convert tabs to spaces).
" cols = string with number of columns per tab, or empty to use 'tabstop'.
" The cursor position is restored, but the cursor will be in a different
" column when the number of characters in the indent of the line is changed.
function! IndentConvert(line1, line2, what, cols)
  let savepos = getpos('.')
  let cols = empty(a:cols) ? &tabstop : a:cols
  execute a:line1 . ',' . a:line2 . 's/^\s\+/\=Indenting(submatch(0), a:what, cols)/e'
  call histdel('search', -1)
  call setpos('.', savepos)
endfunction

command! -nargs=? -range=% Space2Tab call IndentConvert(<line1>,<line2>,0,<q-args>)
command! -nargs=? -range=% Tab2Space call IndentConvert(<line1>,<line2>,1,<q-args>)
command! -nargs=? -range=% RetabIndent call IndentConvert(<line1>,<line2>,&et,<q-args>)

이것은 내가 솔루션을 처음 검색했을 때의 대답보다 조금 더 도움이되었습니다.


3

expand탭을 공백으로 변환하는 유닉스 유틸리티입니다. setvim에서 아무 것도 원하지 않으면 vim에서 쉘 명령을 사용할 수 있습니다.

:!% expand -t8

1
코드의 일부만 확장하려면 먼저 시각 모드에서 해당 부분을 선택한 다음을 누르십시오 :. 이제 vim 명령 줄이 표시 :'<,'>됩니다. 그런 다음 !expand -t4탭을 4 칸에 입력 하십시오. (결과 명령 줄은 다음과 같습니다 :'<,'>!expand -t4)
Penghe Geng
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.