:h eval.txt を眺めてたら結構色々関数追加されてるなーと思ったのでまとめてみた。
(追記: 結構古くからある関数も交じってた…)
基本的に詳細な仕様は書くつもりはありません (古くなるかもしれないし help 見た方が正確)。
wordcount()g<C-g>を押すと現在のバッファのバイト数、文字数、単語数 (ビジュアルモードの時は選択されたバイト数、文字数、単語数も) を表示してくれますが、それを関数で取れるようにしたやつです
getcharsearch()[tfTF]コマンド (例:f<char>) の情報を返してくれるやつです- どの char を押したか、前方検索 or 後方検索、[tT] か [fF] かを返してくれます
- 要するに直前に
[tfTF]コマンドのどれを使ったか、引数の char は何なのかの情報
- 要するに直前に
eventhandler()complete_check()- ニッチだけど補完系プラグインでは便利そう
- 候補の取得に時間がかかった場合ユーザ入力があった場合に中断できる
getcompletion({pat}, {type} [, {filtered}])set wildmodeしてればコマンドラインで<Tab>を押せば補完が効くが、その補完の候補を取得できる- 例えば
getcompletion('', 'shellcmd')で PATH が通った全ての実行ファイル名を取得できる (ちょっと時間かかる)
searchdecl({name} [, {global} [, {thisblock}]])gdやgDの関数版。ううーんできればカーソルの状態変えずに位置だけ返してほしかった…
getbufinfo([{expr}])orgetbufinfo([{dict}])getwininfo([{winid}])- こんなんあったのか…!
:lsの結果を Dictionary で取れる…もう:lsをパースとかする必要なんてなかったんや…- (むしろなぜ今までなかったのか)
setbufline({expr}, {lnum}, {text})- なぜ今まで(ry)。前から Vimmer がほしいほしい言ってたやつ…
- 別バッファの指定された行を追加/更新する関数
:terminalを実装する過程でひょっこり追加された記憶
- Window ID 系
- Window ID に関しては Vim 8.0 Advent Calendar 7 日目 ウィンドウ ID - Qiita
- タブを跨いでも一意なのが便利
win_findbuf({bufnr})- bufnr のバッファを表示している Window ID のリストを返す
win_gotoid({expr})- 引数の window ID のウィンドウに移動する
execute tabnr 'tabn' | execute winnr 'wincmd w'とかやってたのが関数一つでできるようになった
win_id2tabwin({expr})- 引数の Window ID のタブ番号、ウィンドウ番号を返す
let [tabnr, winnr] = win_id2tabwin(winid)
- 引数の Window ID のタブ番号、ウィンドウ番号を返す
- Window ID に関しては Vim 8.0 Advent Calendar 7 日目 ウィンドウ ID - Qiita
- index の代わりに
N文字目のN(以下文字インデックス) を受け取る文字列操作 (7.4 からあるものもあるけど)- (文字の定義はエンコーディング (
encodingオプション) によって変わります) strchars({expr} [, {skipcc}])- 文字数を返す
strcharpart({src}, {start} [, {len}])- 文字列のスライス (
strpart()) の文字インデックス版
- 文字列のスライス (
strgetchar({str}, {index})- 文字列の index (文字インデックス) の位置の文字の数値を返す
- 文字列で取得したい場合は
nr2char()で要変換
strwidth({expr})- 文字列の文字幅を返す
- タブ文字の文字幅は1
strdisplaywidth({expr} [, {col}])- 基本
strwidth({expr})と同じだが、タブ文字はtabstop,displayオプションに影響される
- 基本
- (文字の定義はエンコーディング (
- タグファイル系
tagfiles()taglist({expr} [, {filename}])
- 実行ファイルパス取得
exepath('prog')で PATH 中の prog のフルパスを取得
changenr()undotree().seq_lastと同じ?これいつから追加されたんだろう。もしかしたら結構古いかも:helpgrep changenrしたら version7.txt に載ってたので 7.0 で追加されたっぽいです
上のはちょっと便利系関数ですがこれはマジ便利なので知ってほしい系関数(語彙力)です。
- Channel 系
ch_*()
- Job 系
job_*()
- Terminal 系
term_*()
- 部分適用
function()で引数、self を束縛できるようになった
- 小ネタ: Vim 8 からは関数名から Funcref を取得する時は
function()よりも 新規追加されたfuncref()のが安全function()は関数名の string で lookup しようとするので 同じ名前で再定義された場合は再定義後の function を見に行ってしまう- まぁ再定義とかあんまりないけど…
おまけ: カーソル下の1文字を取得
getline()とcol('.')-1(index) だとマルチバイト文字の場合にちぎれる- 以前までは
normal! ylを使っていた- レジスタを退避したりしなければならなかったりして面倒
と思ってたけどこれでいいじゃんと思った。
echo matchstr(getline('.')[col('.')-1 :], '^.')
ちなみに Vim にはカーソルのバッファ中のバイトオフセットから行番号を取得する
byte2line({byte}) という関数があるのだけど、なぜか byte2col({col}) という関数はない。
あれば正規表現使わず
echo nr2char(strgetchar(getline('.'), byte2col(wordcount().cursor_bytes)-1)
とかできるかなーとか思ったけど結局必要なかったので提案しようにも理由がなくなってしまったので決め手に欠ける…
set virtualedit=all とかして行末以降にカーソルがある状態を考慮してなかったのと、
col (=バッファのカーソルの位置) と行の文字列を比較するのも何か意味合いが違うなと感じたのでやっぱ無しで…