Hatena::ブログ(Diary)

サイト更新停滞ちうっ このページをアンテナに追加 RSSフィード

2008-04-20

[] ファイル内の文字数のカウント 00:04  ファイル内の文字数のカウントを含むブックマーク  ファイル内の文字数のカウントのブックマークコメント

vimエディタの質問で、よくファイル内の文字数の数え方を聞く人がいるけど、

ひょっとして、こんなスクリプトが欲しいんじゃないかな?

(さっき思いついて作ったよ。私自身がこういうの欲しいな、と思ったんだ。)

" vim:set et ff=unix nowrap :
" WC:[1144/4200]:
augroup WC
    autocmd!
    autocmd BufUnload,FileWritePre,BufWritePre * call <SID>WC()
augroup END

function! s:WC()
    let l:current = 0
    let l:last = line('$')
    let l:charcount = s:CharCount()
    while l:current <= l:last
        let l:line = getline(l:current)
        call s:SearchAndReplace(l:line, l:current, l:charcount)
        let l:current += 1
    endwhile
endfunction

function! s:CharCount()
    let l:count = 0
    let l:current = 0
    let l:last = line('$')
    while l:current <= l:last
        let l:line = getline(l:current)
        let l:count += strlen(substitute(l:line, ".", "x", "g"))
        let l:current += 1
    endwhile
    return l:count
endfunction

function! s:SearchAndReplace(linetext, lineno, charcount)
    let l:found = match(a:linetext, 'WC:\[\d\{1,}/\d\{1,}]:')
    if l:found >= 0
        let l:pre  = substitute(a:linetext, '\(^.*WC:\[\)\d\{1,}\(/\d\{1,}]:.*$\)', '\1', '')
        let l:post = substitute(a:linetext, '\(^.*WC:\[\)\d\{1,}\(/\d\{1,}]:.*$\)', '\2', '')
        let l:newline = l:pre . a:charcount . l:post
        call setline(a:lineno, l:newline)
    endif
endfunction

このスクリプトをpluginディレクトリに入れると、

ファイル保存時に、あらかじめファイル内に書いておいた

WC:[数字/数字]:

の部分の左側数値が自動的にファイル内の文字数で置き換わる、autodate.vimっぽい動きのスクリプト

右の数値には、最大文字数でも入れておけば、あとどれくらい書けるか分かっていいね。


文字数結果表示行を入れたせいで文字数のカウントがずれるとか、

数え方が手抜きだとか、ハイライト表示してくれとか、

そういうのは、作ったばかりのスクリプトなので勘弁してください。


スクリプトダウンロードできるようにしておくので、欲しい人はこっちから持って行ってくださいね。

http://nanasi.jp/dist/download/auto_wc.vim