2011-02-11 4 views
2

VIM의 문자열 서식이 나를 괴롭 히고 있습니다.VIM의 문자열 서식 (패딩)

필자는 파이썬에서 문자열 형식을 지정하는 데 매우 익숙해 보입니다. 출력 문자열이 얼마나 많은 공백으로 구분되는지 지정할 수 있습니다. 내가 버퍼에 추가하기 전에 해당 문자열을 구축하고 모든 환상적인 작품

Line: 1 ==>> ErrorName ==>> File Path: /foo 

:

그래서 나는처럼 보이는 스크래치 버퍼에 정보를 출력하는 VIM 플러그인을 가지고있다. 내가하고 탭 대신 공백이 일을 시도했다

Line: 1 ==>> Error ==>> File Path: /foo 
Line: 123 ==>> ErrorNameLong ==>> File Path: /foo 
Line: 12 ==>> ErrorShort ==>> File Path: /foo 

하지만 그것은 단지 (공간이 더 큰 성장) 더 나쁜 것이 있습니다 : 당신이 다른 줄 번호가있을 때마다하지만 (자리 현명한)이 같은 일을 얻는다.

Line: 1 ==>> Error   ==>> File Path: /foo 
Line: 123 ==>> ErrorNameLong ==>> File Path: /foo 
Line: 12 ==>> ErrorShort ==>> File Path: /foo 

내가 도와 플러그인 (예 : tabular.vim) 잘 알고 있지만,이 플러그인 자체이기 때문에, 내가 종속성을 필요로하지 않습니다 그래서 내 이상적인 최종 결과는 다음과 같이 할 것 간단한 문자열 포맷팅을 위해서만 다른 플러그인에.

이 내가 지금까지 시도했던 사항은 다음과 같습니다

  • 탭 (및 탭 + 공간)
  • 검색 (버퍼에 렌더링 후 공백과 탭) 탭으로 대체

나는 이것에 대한 좋은 접근이 있어야하며 나는 그것을 놓치고있는 것처럼 보인다.

VIM에서 필요한 문자열 서식을 어떻게 얻을 수 있습니까?

답변

3

두 개의 작은 기능을 사용합니다. 아무 것도 없으며, 문자열 뒤에 패딩을 추가하는 코드와 문자열 앞에 추가하려면 코드를 추가하십시오. PrePad 함수는 패딩 문자의 선택적 인수를 허용합니다.이 인수는 앞의 0으로 숫자를 채우기 위해 사용됩니다.

function! Pad(s,amt) 
    return a:s . repeat(' ',a:amt - len(a:s)) 
endfunction 

" Pad('abc', 5) == 'abc ' 
" Pad('ab', 5) == 'ab ' 


function! PrePad(s,amt,...) 
    if a:0 > 0 
     let char = a:1 
    else 
     let char = ' ' 
    endif 
    return repeat(char,a:amt - len(a:s)) . a:s 
endfunction 

" PrePad('832', 4)  == ' 823' 
" PrePad('832', 4, '0') == '0823' 

원본 로그 메시지 작성시 Pad()가 간단합니다. 예 :

echo 'Line: ' . Pad(linenum,8) . '==>> ' . Pad(errmsg,12) . '==>> FilePath: ' . path 
+0

처음에는이 접근 방식이 효과가 있을지 의심 스러웠습니다. 처음에 나를 버렸던 것은'a : amt-len (a : s)'입니다. 왜냐하면 당신은 그것을 작동시키기 위해 충분한 패딩이 필요하기 때문입니다. 이것은 내 문제를 해결해 주는데 시간을내어 여기에 기능을 가져다 주셔서 감사합니다. – alfredodeza

+1

@alfredodeza 만약 당신이 ascii 만 받아 들일 때만'len()'을 사용해야합니다. 모든 len을'strwidth()'(vim-7.3 만) 또는'len (split (a : s, '\ zs'))'(전각 문자를 처리하지 않음)으로 바꾸어보십시오. – ZyX

+3

@alfredodeza ascii 만 처리하면 정상적으로 작동하지만이 두 함수를 버리고 내장 된 printf를 사용할 수 있습니다.'echo printf ('Line : % - * u == >> - % s *= >> >> 파일 경로 % s ', 8, linenum, 12, errmsg, path)' PrePad의 경우'%'다음에'-'를 제거하십시오. – ZyX