VIM 공백을 탭으로 변환하기

사용자들이 직접 작성하는 실전팁!

Moderator: Dry8r3aD

Post Reply
protochaos
Posts: 1714
Joined: 2011/05/19 Thu 7:43 pm

VIM 공백을 탭으로 변환하기

Post by protochaos » 2013/08/17 Sat 10:39 pm

일반적으로 탭은 설정에 따라 화면에 다르게 보여질 수 있어서, 공백을 사용하기를 추천하기도 하지만,
편집할 때는 아무래도 탭이 편하고, 작업 효율도 좋습니다.

특히 python 스크립트에서는 : 로 사용되는 슈트라는 개념이 있어서, 들여쓰기를 맞추지 않으면 오류가 납니다.

[code:1n8siyt4]fun! Spaces2Tab(head,spaces,tabsz,tail)
let str=a:head
for i in range(len(a:spaces),a:tabsz,-1*a:tabsz)
let str=str.' '
endfor
return str.a:tail
endfun
fun! Retab(...)
let saved_pos = getpos(".")
let found=0
if a:0>0
let retab_range="'<,'>s"
let found=search('^ \+[^ ]','We')
else
let retab_range='%s'
call setpos(".",[0,1,1])
let found=search('^ \+[^ ]','e')
endif
let vret=0

if found>0
let oldbuf=@"
normal y0
let tabsz=len(@")
for i in [4,3,2]
if tabsz%i==0
let tabsz=i
break
endif
endfor
if tabsz>1
let s='^\(\t*\)\(\( \{'.tabsz.'\}\)\+\)\([^ ]\)'
try
execute retab_range.'/'.s.'/\=Spaces2Tab(submatch(1),submatch(2),'.tabsz.',submatch(4))/g'
catch
endtry
endif
let @"=oldbuf
let vret=1
endif
call setpos(".",saved_pos)
return vret
endfun
nnoremap <S-Tab> :call Retab()<CR>
vnoremap <S-Tab> :call Retab(1)<CR>
[/code:1n8siyt4]

위의 코드를 $HOME/.vimrc에 추가하시고, SHIFT+TAB을 누르면 공백을 변환하게 됩니다.
자동으로 공백의 갯수에 따라, 4의배수,3의배수,2의배수에 따라 탭의 크기를 결정하고,
그 배수만큼 탭으로 변환합니다.
8의 배수로 변환하시려면, 위의 코드 중 [4,3,2] 부분을 [8,4,3,2]로 변경하시면 됩니다.

블럭을 선택 후, SHIFT+TAB 누르시면, 해당 블럭의 공백을 기준으로,
일반 모드에서 SHIFT+TAB을 누르시면, 전체 내용을 기준으로 탭으로 변환합니다.

이것은 auto-ident와 달라서, 줄넘김에 의해 종료되지 않고, 영역내의 모든 줄의 첫번째 공백을 변환합니다.

뽀나스로 vim키맵을 올립니다.
[attachment=0:1n8siyt4]
vim-keymap.png
vim-keymap.png (286.23 KiB) Viewed 1933 times
[/attachment:1n8siyt4]

Post Reply