2011-03-11 4 views
0

모든 프로그램 편집에 Vim을 사용하고 있으며 모든 소스 코드 파일의 맨 위에 사용하는 표준 헤더가 있습니다. 나는 어떤 변경 사항을 저장할 때 .vimrc 파일을이 헤더의 특정 필드 (예 : Last Modified)를 업데이트하도록 설정했다 : w코드 줄에 텍스트를 삽입하도록 Vim 구성

내 질문은 다음과 같은 코드 행 수를 계산하는 방법이다. 비어 있지 않은 행만 계산되는 기본 규칙?

나는 기본적으로 두 줄 바꿈이 나타납니다 얼마나 많은 시간 계산 (나는 모든 행을 계산하는

:%s/\n//gn 

을 사용할 수 있으며,

:%s/\n\n//gn 

은 빈 줄을 계산하는 개방 정력 버퍼 내에서 알고 행, 빈 줄을 나타냄). 그러나 어떻게 이것을 .vimrc 파일에 넣을 수 있습니까?

다음은 헤더 필드를 업데이트 내 .vimrc 파일의 코드 조각입니다 :

또한
function! LastModified() 
    if &modified 
    let save_cursor = getpos(".") 
    let n = min([20, line("$")]) 
    keepjumps exe '1,' . n . 's#^\(.\{,10}Last Modified:\).*#\1' . 
      \ strftime(' %a %b %d, %Y %I:%M%p') . '#e' 
    keepjumps exe '1,' . n . 's#^\(.\{,10}Filename:\).*#\1' . 
      \ ' ' . @% . '#e' 
    keepjumps exe '1,' . n . 's#^\(.\{,10}LOC:\).*#\1' . 
      \ ' ' . '' . '#e' 
    call histdel('search', -1) 
    call setpos('.', save_cursor) 
    endif 
endfun 

, 난 그냥이 (화장실을 사용하는 것과 같이 할 수있는 많은 다른 방법이 알고, 추가하고 싶습니다 - 줄을 셸에서)하지만 정말 편집기를 구성하는 방법을 배우는 데 관심이 있습니다 (그래서 그것을 학습 연습이라고 부릅니다).

+0

줄 수를'line ("$")'로 얻을 수도 있습니다. –

답변

3

당신은 실제로 여기 :s을 사용하지해야합니다

:

function! CountNonEmpty() 
    return len(filter(getline(1, line('$')), '!empty(v:val)')) 
endfunction 
그런데

, 당신의 헤더 업데이터를 구현의 getline +지도 + setline을 사용하는 것

function! LastModified() 
    if &modified 
     " If number of buffer lines is < 20, then getline(1, 20)" 
     " will return only existing lines without any errors " 
     call setline(1, map(getline(1, 20), 'substitute(substitute(substitute(v:val, '. 
     \'"^\\v(.{,10}Last Modified:).*", "\\1 ".strftime("%s %b %d, %Y %I:%M%p"), ""),'. 
     \'"^\\v(.{,10}Filename:).*",  "\\1 ".escape(@%, "&\\~"), ""),'. 
     \'"^\\v(.{,10}LOC:).*",   "\\1 ", "")')) 
    endif 
endfunction 
+0

이것은 내가 원하는 것에 더 가깝고 잘 작동합니다. 3 자 이하의 줄을 셀 수없는 방법이 있습니까? – dvanaria

+0

@dvanaria :'! empty (v : val)'을 number를 반환하는 표현식으로 바꿀 수 있습니다. 귀하의 요청에 대해 그것은'v : val = ~ # "^. \\ {, 3} $"'입니다. – ZyX

+0

! empty (v : val)의 표현식을 두 번째 예제로 대체하겠습니까? return len (filter (getline (1, line ('$')),!! empty (v : val = ~ # "^. \\ {, 2} $") ')) – dvanaria

1

이 도움이 될 수 있습니다 :

function! CountNonEmpty() 
    redir => g:nonblank 
    silent %s/^.\+$/&/n 
    redir END 
    return substitute(g:nonblank, '\n\s*\(\d\+\)\D.*$', '\1', '') 
endfunction
  • : REDIR => 다음 예의 출력이 주어진 변수로 명령을 저장합니다. 참조 :help :redir
+0

이것은 나를 해결책으로 시작 했어. 고마워. – dvanaria

관련 문제