c4se記:さっちゃんですよ☆

.。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆)

.。oO(此のblogは、主に音樂考察Programming に分類されますよ。ヾ(〃l _ l)ノ゙♬♪♡)

音樂は SoundCloud に公開中です。

考察は現在は主に Scrapbox で公表中です。

Programming は GitHub で開發中です。

Vim で、文字数をstatuslineやlightline.vimに表示する

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

ujihisa : > 文字数 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が、読める!読めるぞ! な感じに成ってゐた。


明日は @ さんです。