😺

Vimのバッファ内の文字数をカウントする方法 4選

2022/09/14に公開

よく忘れるのでメモ。複数のやり方をまとめています。それぞれ改行文字(\nなど)を含める場合とそうでない場合がありますのでご注意ください

1. 標準機能 g <Ctrl>g

設定不要で最初から使えます。改行含めた文字数に加え、単語数やバイト数なども表示してくれます。

このショートカットは wordcount() 関数に紐付けられており、文字数だけ欲しい場合は :echo wordcount()['chars'] としてもOKです。詳細は :help wordcount() を見てください。

2. wc コマンドと連携

(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> 

3. 置換結果を出力 :%s/./&/g

改行を含めないカウント数を返します。コマンドの内容としては全ての文字を同じ文字に置換しその結果を表示するというものです。なので、実行すると編集した扱いになり編集中マーク [+] がついてしまったり、置換した範囲がハイライトされてしまいます。

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

参考

https://kaworu.jpn.org/kaworu/2008-03-30-2.php

https://qiita.com/TomKid/items/c324dce77b09c5e70060

Discussion