0

私はすべてのプログラム編集に Vim を使用しており、すべてのソース コード ファイルの先頭に標準ヘッダーを使用しています。:w を使用して変更を保存すると、このヘッダーの特定のフィールド (Last Modified など) を更新するように .vimrc ファイルをセットアップしました。

私の質問は、空白以外の行のみがカウントされるという基本的なルールに従って、コードの行をカウントする関数をどのように配置すればよいですか?

開いているvimバッファ内で使用できることを知っています

:%s/\n//gn 

すべての行を数えます。

:%s/\n\n//gn 

空白行を数えます (基本的に、空白行を示す 2 つの改行が連続して現れる回数を数えます)。しかし、どうすればこれを .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

また、追加したいのですが、これを行うには他にも多くの方法があることは知っていますが(シェルから wc --lines を使用するなど)、エディターを実際に構成する方法を学ぶことに興味があります(したがって、学習演習と呼びます) )。

4

2 に答える 2

3

:sここでは実際に使用しないでください。

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

ところで、getline+map+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
于 2011-03-11T19:44:44.853 に答える
1

これは役立つかもしれません:

function! CountNonEmpty()
  redir => g:nonblank
  silent %s/^.\+$/&/n
  redir END
  return substitute(g:nonblank, '\n\s*\(\d\+\)\D.*$', '\1', '')
endfunction
  • :redir => 次の ex コマンドの出力を指定された変数に格納します。見る:help :redir
于 2011-03-11T19:35:30.170 に答える