2014-12-18 2 views
1

줄 시작 부분의 공백을 모두 탭으로 바꾸고 싶습니다. 아래 스 니펫은 작동하지만 첫 번째 들여 쓰기 단계에서만 사용됩니다.줄 시작 부분의 공백을 모두 탭으로 바꾸십시오.

어떻게 작동합니까? 1 - ∞ 들여 쓰기 수준? 12 칸을 3 개의 탭으로 대체합니다 (tabstop = 4로 가정). :retab를 사용하는 것이 아니라 단지 들여 쓰기를 변경하지 않습니다 :retab 때문에, 여기에 옵션이 될 것 같다,하지만하지 않습니다

fun! Retab() 
    let l:spaces = repeat(' ', &tabstop) 
    silent! execute '%s/^' . l:spaces . '/\t/g' 
endfun 

참고 모든 repeat(' ', &tabstop) 발생을 변경 사방 파일입니다.

Vim & 파일을 다시 들여 쓰는 것도 옵션이 아닙니다. 어떤 수준에서 들여 쓰기해야하는지 (예 : 부작용이 너무 많음)에 대한 의견이 서로 다른 경우가 있습니다.

나는 또한 expand & unexpand 프로그램을 사용하는 것에 대해 생각했지만 외부 유틸리티를 사용하지 않는 것을 선호합니다.

답변

2

귀하의 시도는 올바른 방향으로 간다, 그러나 당신은 일치 공간의 수를 계산하고 탭 문자의 해당 번호로이 변환 :help sub-replace-expr 필요합니다 탭을 공백으로 대체

silent! execute '%substitute#^\%(' . l:spaces . '\)\+#\=repeat("\t", len(submatch(0))/&tabstop)#e' 

이 (반대를 수행하려면) 할 수 있습니다.

silent! execute '%substitute#^\%(\t\)\+#\=repeat("' . l:spaces . '", len(submatch(0)))#e' 
관련 문제