VimScript覚書

はじめての、びむすくりぷと。

ってことで、ちょっとしたVimプラグインを開発中。
その過程でのVimScript覚書をメモ。

VimScript開発の取っ掛かりに参考にさせてもらったページ

Vimスクリプト基礎文法最速マスター - 永遠に未完成
Big Sky :: モテる男のVim Script短期集中講座

autoloadは、autoload/foo/bar/baz.vimの様にフォルダ階層で区切られたファイルが#でセパレートされたネームスペースで呼び出され、call foo#bar#baz#XXX()というアクセスの瞬間にbaz.vimが読み込まれるという仕組みを持っています。
ですので、最近のVim Scriptはpluginではコマンドやキーマップのみを宣言するのが最近の流儀です。


使いそうな組み込み関数

参考:


mode({expr})
現在のモードを示す文字列を返す
'n' : ノーマル
'v' : 文字指定ビジュアル
'V' : 行指定ビジュアル
'CTRL-V' : 矩形指定ビジュアル
's' : 文字指定選択
'S' : 行指定選択
'CTRL-S' : 矩形指定選択
'i' : 挿入
'c' : コマンドライン
getreg( [{regname} [, 1]])
レジスタの中身を取得
getregtype( [{regname}])
レジスタの種類を取得
'v' : 文字指定
'V' : 行指定
'<CTRL-V>{width}' : 矩形指定
0 : 空または未知レジスタ
line({expr})
行番号を取得
line('.') : カーソル位置の行番号取得
line('v') : ビジュアルモードでの選択領域の開始行番号取得
col({expr})
桁番号を取得
col('.') : カーソル位置の桁番号取得
virtcol({expr})
スクリーン上での桁番号を取得
virtcol('.') : カーソル位置の桁番号取得
getpos({expr})
カーソル位置を[bufnum, lnum, col, off]のリストで取得する
{expr}の値はline()と同じ
setpos({expr}, {list})
{expr}の位置を設定する
listの値は[bufnum, lnum, col, off]でなくてはならない
成功すれば0、失敗すれば-1を返す


自動コマンドautocmdについて

参考: Vim documentation: autocmd

その他覚書

letは変数の定義時だけではなく、変数を扱う際にも付けなくてはならない

let a = 1   "定義”
let a += 5    "値の変更"
a += 5    "NG!"

関数を呼び出す時は変数への代入やcallコマンドを使用する必要がある

let a = Func()    "OK"
call Func()    "OK"
Func()    "NG!"

関数にrangeを付加することで範囲を指定して呼び出せる
a:firstline/a:lastlineで範囲の開始行と終了行を取得できる
rangeなし関数で複数行選択中に関数を呼び出すと、各行毎に関数処理が行われる。

function! Func() range
    let lnum = a:lastline - a:firstline + 1
    echo 'select line num =' . lnum
endfunction

参考: usr_41 - vimdoc-ja