Vim Advent Calendar 2013 33日目の記事です。昨日はVimConf2013が無事終わりましたでした。にょ……。
今年はVimに関する記事を書きたいときは、記事を下書きしておいてVACに投稿しやうと思ひますね☆
lightline.vimを導入したのでついでに書く。
復たn度目的な記事です。別になんら新しいことではないけど、此う云ふのは何度書いても目についてゐない人は居る。
Vimで文字数を数へる
なんとなく文字数を知りたい訳です。Vimで文字数を数へる丈の事であれば、恐らく最も簡単なのは、
:%s/.//gn :nohl
で好い。行数を数へるのであれば、
:%s/.//n :nohl
でできる。n flagを付ければ、実際には置換せず置換結果の個数だけ受け取れる。:h :substitute
を参照。
然し入力が鬱陶しいし、hilightされて鬱陶しいし、記憶されていたmatch pattenが上書きされるし、好い事は無い。其れに行数等と同じやうにstatus lineに表示できれば便利だ。
追記 2014-01-02ujihisa : > 文字数 01/02 02:25
<c-g>「^^」 01/02 02:25
g<C-g> 01/02 02:25
- -
s_of_p : g<C-g> 知らなかった。 01/02 02:26
g プレフィックス優秀すぎて全部置き換えたい感ある。 01/02 02:27
- -
supermomonga : <C-g>べんりそう 01/02 02:32
http://lingr.com/room/vim/archives/2014/01/01#message-17963096
g<C-g>
べんり。
statusline
status lineは多分表示されてゐると思ふ。表示されてゐなければ、
set laststatus=2
で表示されると思ふ。:set laststatus=0
で隠せる。
status lineは、window毎 (だいたい、表示されてゐるbuffer毎) の情報表示領域だ。Vimの、下の方になんかfile名とか表示してあるやつ。
Kaoriya版GVimのdefaultに近い表示は、以下で得られる (fileformatとfileencodingの表示を勝手に足してゐる)。違ふ記述でもいけると思ふ、余り自信が無い。
set statusline=%-(%f%m%h%q%r%w%)%=%{&ff}\|%{&fenc}\ %y%l,%c\ %0P
%-(%f%m%h%q%r%w%)
が左端に、%{&ff}\|%{&fenc}\ %y%l,%c\ %0P
が右端に表示される。:h statusline
を参照。
lightline.vim
lightline.vim https://github.com/itchyny/lightline.vim は、status lineを改造できるpluginの一つだ。昔はvim-powerlineとか有ったらしい (開発終了し、powerlineに移行)。今はvim-airlineとかも有る。
cf. lightline.vim作りました - プラグインの直交性について - プログラムモグモグ http://d.hatena.ne.jp/itchyny/20130824/1377351527
cf. 作者が教える! lightline.vimの導入・設定方法! ~ 初級編 - インストールしよう - プログラムモグモグ http://d.hatena.ne.jp/itchyny/20130828/1377653592
cf. 作者が教える! lightline.vimの設定方法! ~ 初級編 - コンポーネントを作ってみよう - プログラムモグモグ http://d.hatena.ne.jp/itchyny/20130917/1379369171
cf. 作者が教える! lightline.vimの設定方法! ~ 中級編 - 展開コンポーネントを理解しよう - プログラムモグモグ http://d.hatena.ne.jp/itchyny/20130918/1379461406
設定を書かなくてもdefaultで可成り動作するので労力を恐れず導入して好い。NeoBundleやVundleを使ってゐれば五秒で導入できる。少しdefaultに近い設定を書けば、以下の様に成る。
NeoBundle 'itchyny/lightline.vim' if !exists('g:lightline') let g:lightline = {} let g:lightline.component = {} endif let g:lightline.colorscheme = 'jellybeans' let g:lightline.active = { \ 'left': [ \ ['mode', 'paste'], \ ['readonly', 'filename', 'modified'] \ ], \ 'right': [ \ ['lineinfo'], \ ['percent'], \ ['fileformat', 'fileencoding', 'filetype'] \ ] \ } let g:lightline.inactive = { \ 'left': [ \ ['filename'] \ ], \ 'right': [ \ ['percent'], \ ['fileformat', 'fileencoding', 'filetype'] \ ] \ }
なんとなく解ると思ふ。g:lightline.active.left
に、windowにcursorが当ってゐる時の左端、g:lightline.active.right
に同じく右端に、表示されるcomponent名を書く。defaultで結構なcomponentが用意されてゐるから、statuslineを余り弄ってなければ困らないだらう。
文字数をstatuslineやlightline.vimに表示する
追記 2014-01-02関数を作ってやる。
現在のわたしの推奨手順はg<C-g>
です。べんり。:h g
を参照。
cf. ファイル内の文字数のカウント - サイト更新停滞ちうっ http://d.hatena.ne.jp/taku-o/20080420/1208703880
cf. 文字数カウントスクリプト - 地獄の猫日記 http://d.hatena.ne.jp/nokturnalmortum/20080422/1208817273
cf. Vimで文字数カウントをステータスラインに表示する - ナレッジエース http://n.blueblack.net/articles/2012-06-15_01_vim_character_count/
augroup char_counter autocmd! autocmd BufCreate,BufEnter * call s:char_counter_initialize() autocmd BufNew,BufEnter,BufWrite,InsertLeave * call s:char_counter_update() augroup END function! s:char_counter_initialize() if !exists('b:char_counter_count') let b:char_counter_count = 0 endif endfunction function! s:char_counter_update() let b:char_counter_count = s:char_counter() endfunction function! s:char_counter() let result = 0 for linenum in range(0, line('$')) let line = getline(linenum) let result += strlen(substitute(line, '.', 'x', 'g')) endfor return result endfunction if !exists('b:char_counter_count') let b:char_counter_count = 0 endif set stl+=\ %{b:char_counter_count} let g:lightline.component.char_counter = '%{b:char_counter_count}'
b:char_counter_count
と云ふbuffer localな変数に文字数を保存してゐる。s:char_counter()
がmainの文字数を数へる関数だ。BufNew,BufEnter,BufWrite,InsertLeaveのtimingで文字数を再計算してゐる:h autocmd-events
を参照。
set stl+=\ %{b:char_counter_count}
でstatuslineに追加。
let g:lightline.component.char_counter = '%{b:char_counter_count}'
で、char_counterと云ふ名でlightline.vimのcomponentを作成してゐる。lightline.vimには、適当な所にchar_counter componentを追加すれば好い。私の設定は以下のものだ。
let g:lightline.active = { \ 'left': [ \ ['mode', 'paste'], \ ['readonly', 'filename', 'modified'] \ ], \ 'right': [ \ ['lineinfo', 'char_counter'], \ ['percent'], \ ['fileformat', 'fileencoding', 'filetype'] \ ] \ } let g:lightline.inactive = { \ 'left': [ \ ['filename'] \ ], \ 'right': [ \ ['char_counter'], \ ['fileformat', 'fileencoding', 'filetype'] \ ] \ }
さっちゃんのdotfilesは此ちら。コピペしてたvimrcが、読める!読めるぞ! な感じに成ってゐた。
明日は @kamichidu さんです。