Vim 공백을 탭으로 변환하기

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

특히 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&gt;0
	let oldbuf=@&quot;
	normal y0
	let tabsz=len(@&quot;)
	for i in &#91;4,3,2&#93;
		if tabsz%i==0
			let tabsz=i	
			break
		endif
	endfor
	if tabsz&gt;1
		let s='^\(\t*\)\(\( \{'&#46;tabsz&#46;'\}\)\+\)\(&#91;^ &#93;\)'
		try
			execute retab_range&#46;'/'&#46;s&#46;'/\=Spaces2Tab(submatch(1),submatch(2),'&#46;tabsz&#46;',submatch(4))/g'
		catch
		endtry
	endif
	let @&quot;=oldbuf
	let vret=1
endif
call setpos(&quot;&#46;&quot;,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[/attachment:1n8siyt4]