第13回 Vimスクリプト入門みたいの (スクリプトを読みながら勉強してみる、その2)

第二回。今日の基本日記でも書いたとおり、本を読んでいたので、これは随分前に書いたもののコピペ。あまり確認せずにはっつけてるのでミスがあるかもしれません。あと内容の割に説明もすくないです。マッピングシンタックスは、まだあまり分かっていないので説明もいいかげんです。

だらだらと言い訳みたいのを書いても仕方がないので、ぺたり。

" 第13回 Vimスクリプト入門みたいの
" (スクリプトを読みながら勉強してみる、その2)
"
" QuickBuf を読む、第2回。
" 第1回では :map を見た。
" ここからは関数が続くようなので、自分で順番を決めて読む。
" まずは、ホットキーを押したときに実行される
" s:init(), SBRun() を見たいと思う。
"
" というわけで、s:init()

function s:init(onStart)
  if a:onStart
    let s:unlisted = 1 - getbufvar("%", "&buflisted")
    let s:cursorbg = synIDattr(hlID("Cursor"),"bg")
    let s:cursorfg = synIDattr(hlID("Cursor"),"fg")
    let s:cmdh = &cmdheight
    hi Cursor guibg=NONE guifg=NONE

    let s:klist = ["j", "k", "u", "d", "w", "l", "s"]
    for l:key in s:klist
      exe "cnoremap ".l:key." ".l:key."<cr>:cal SBRun()<cr>"
    endfor
    cmap <up> k
    cmap <down> j

    call s:rebuild()
    call s:setcmdh(s:blen+1)
  else
    call s:setcmdh(s:cmdh)
    for l:key in s:klist
      exe "cunmap ".l:key
    endfor
    cunmap <up>
    cunmap <down>
    exe "hi Cursor guibg=" . s:cursorbg . " guifg=".((s:cursorfg == "") ? "NONE" : s:cursorfg)
  endif
endfunc

" この関数のしていることは大きくわけて以下の2つ。
" 1. onStart が真のとき、各種 s: 変数の設定や map の追加をしている。
" 2. onStart が偽のとき、map の削除や色を戻す作業をしている。
" なので、init(1) が起動時、init(0) が終了時の処理ということみたい。
"
" 使われているコマンド・オプション・関数・ユーザ定義関数のうち、
" 書いたことのないものの一覧を書きだしてみる。
" :highlight
" 'buflisted'
" 'cmdheight'
" getbufvar()
" synIDattr()
" hlID()
" s:rebuild()
" s:setcmdh()
"
" :highlight は色を付けたり強調したりするコマンド。
" 'buflisted' はそのバッファが:lsなどの対象になるか否か。
" 'cmdheight' はコマンドライン行の高さ。
" getbufvar() はバッファごとの変数やオプションの値を取得する。
" synIDattr() は指定されたシンタックスIDの情報を取得する。
" hlID() はハイライトグループのIDを返す。
" s:rebuild(), s:setcmdh() はユーザ定義関数なので、また次回見る。
"
" 関係ないけど synIDattr() の部分はドキュメントを読む限り、
" synIDattr(synIDtrans(hlID('Cursor')),'fg')
" とした方が良さそう。
"
" 今回のまとめ
" :highlight
" 'buflisted'
" 'cmdheight'
" getbufvar()
" synIDattr()
" synIDtrans()
" hlID()
" s:init(1) が起動時、s:init(0) が終了時の処理
" 
" 次回予告
" s:init() から s:rebuild(), s:setcmdh() が呼ばれているので、
" SBRun()より先にこれらを見る。
"