😺
Vimのバッファ内の文字数をカウントする方法 4選
よく忘れるのでメモ。複数のやり方をまとめています。それぞれ改行文字(\n
など)を含める場合とそうでない場合がありますのでご注意ください
g <Ctrl>g
1. 標準機能 設定不要で最初から使えます。改行含めた文字数に加え、単語数やバイト数なども表示してくれます。
このショートカットは wordcount()
関数に紐付けられており、文字数だけ欲しい場合は :echo wordcount()['chars']
としてもOKです。詳細は :help wordcount()
を見てください。
wc
コマンドと連携
2. (1) :w !wc -m
バッファの内容をパイプを通して wc
コマンドでカウントする方法です。-m
はマルチバイト文字対応のためです。Windowsでは使えません。
nnoremap <silent> <space><space> :<C-u>w !wc -m<CR>
(2) :w !sed -z 's/\n//g' | wc -m
改行を含めたくない場合は sed コマンドで取り除きます。
ただしvimrc内で sed -> wc をパイプで繋げないのでショートカットに登録することはできません(なんでや)
" not work !!!
nnoremap <silent> <space><space> :<C-u>w !sed -z 's/\n//g' | wc -m<CR>
:%s/./&/g
3. 置換結果を出力 改行を含めないカウント数を返します。コマンドの内容としては全ての文字を同じ文字に置換しその結果を表示するというものです。なので、実行すると編集した扱いになり編集中マーク [+]
がついてしまったり、置換した範囲がハイライトされてしまいます。
4. VimScript関数を自作
結局は欲しい物があったら自分で作る、というのに落ち着いてしまいますね。
-
getline
バッファの中身を取得 -
join
リストを結合して文字列に変換 -
substitute
マルチバイト文字を変換 -
strlen
文字数を数える
改行は含めない設定になっていますので、必要なら len(l:buffer_lines)
を追加するなどしてください。
nnoremap <silent> <space><space> :<C-u>call CalcMChar()<CR>
function! CalcMChar()
let l:buffer_lines = getline(0, '$')
let l:buffer_chars = join(l:buffer_lines, '')
echo 'Char count : ' .. strlen(substitute(l:buffer_chars, ".", "x", "g"))
endfunction
参考
Discussion