クイックリファレンス

Vimscript 関数 チートシート

Vimscript 組み込み関数のクイックリファレンス:リストや辞書の操作、バッファ調査、カーソル移動、文字列操作、構文イントロスペクション。

· 公開日

Vim 組み込みスクリプト関数およびデータ構造のリファレンスガイド。

データ構造

辞書 (Dictionaries)

let colors = {
  \ "apple": "red",
  \ "banana": "yellow"
}

echo colors["apple"]
echo get(colors, "apple")   " 存在しない場合のエラーを抑制

call remove(colors, "apple")

" 調査と判定
if has_key(dict, 'foo')
if empty(dict)
keys(dict)
len(dict)

max(dict)
min(dict)
count(dict, 'x')
string(dict)

map(dict, 'v:val . "!"')
extend(s:fruits, { "cherry": "red" })
for key in keys(mydict)
  echo key . ': ' . mydict[key]
endfor

リスト (Lists)

let mylist = [1, "two", 3, "four"]

let first = mylist[0]
let last  = mylist[-1]

" デフォルト値付きの安全な取得
let second = get(mylist, 1)
let fallback = get(mylist, 10, "NONE")

バッファとカーソル

バッファの調査

line('.')             " 現在の行番号
col('.')              " 現在の列番号
col('$')              " 現在の行の最終列番号

getline('.')          " 現在の行の文字列内容
getline(1)            " 1 行目の文字列内容
getline(1, 5)         " 1〜5 行目を文字列のリストとして取得
search('^$')          " 次の空行の行番号
search('^$', 'n')     " カーソルを動かさずに次の空行を検索

getcurpos()           " [bufnum, lnum, col, off, curswant]
getpos('.')           " [bufnum, lnum, col, off]

nextnonblank(1)       " 1 行目以降の最初の非空行番号
prevnonblank(10)

マーク (Marks)

getpos("'a")          " マーク 'a' の位置
setpos("'a", [0, 10, 5, 0])

getpos("'<")          " ビジュアル選択の開始位置
getpos("'>")          " ビジュアル選択の終了位置

カーソルの位置指定

call cursor(line, col)
call cursor(line, col, off, curswant)

ファイル名展開

expand('<cword>')      " カーソル下の単語
expand('<cfile>')      " カーソル下のファイルパス
expand('%')            " 現在のファイル名

" 修飾子:
" :p    フルパス (/Users/name/project/file.txt)
" :h    ディレクトリ (Head) (/Users/name/project)
" :t    ファイル名 (Tail) (file.txt)
" :r    拡張子なしのベース名 (file)
" :e    拡張子 (txt)
" 例: expand('%:p:h')

ファイルとパス

fnameescape('string')
fnamemodify('main.c', ':p:h')
fnamemodify(fname, ':e')
filereadable(fname)
getfsize('file.txt')
getcwd()

globpath(&rtp, "plugin/commentary.vim")

数値計算と型

数学演算

fmod(9, 2)            " 剰余: 1.0
abs(-0.5)             " 絶対値
sqrt(9)               " 平方根

trunc(1.84)           " 1.0
floor(1.84)           " 1.0
ceil(1.84)            " 2.0
float2nr(3.14)        " 浮動小数点数を整数に変換: 3

型変換

str2float('0.2')
str2nr('240')
str2nr('ff', 16)      " 16進数解析

string(0.3)           " 文字列に変換

型チェック

type(var) == type(0)            " 数値
type(var) == type("")           " 文字列
type(var) == type(function("tr")) " 関数参照
type(var) == type([])           " リスト
type(var) == type({})           " 辞書
type(var) == type(0.0)          " 浮動小数点数

文字列と正規表現

文字列操作

if a =~ '\s*'
let clean = substitute(str, '\s\+', ' ', 'g')

strpart("abcdef", 3, 2)         " == "de" (部分文字列: オフセット、長さ)
strpart("abcdef", 3)            " == "def"
stridx("abcdef", "e")           " == 4 (部分文字列)
strridx("abcdef", "d")          " 逆方向インデックス検索

matchstr('testing', 'test')     " == 'test' (一致した文字列)
match('testing', 'test')        " == 0 (一致開始インデックス)
matchend('testing', 'test')     " == 4 (一致終了インデックス)
match('testing', '\ctest')      " 大文字・小文字を無視 (\c)

split(str, '\zs')               " 文字列を文字配列に分割

strlen(str)                     " バイト長
strchars(str)                   " 文字数 (マルチバイト対応)
strdisplaywidth(str)            " 画面上の表示桁数

toupper(str)
tolower(str)
tr('foo', '_-', '  ')           " 文字置換

比較演算

if name ==# 'John'     " 大文字・小文字を区別する一致
if name ==? 'John'     " 大文字・小文字を区別しない一致
if name == 'John'      " 'ignorecase' オプションに依存

if "hello" =~ '.*'     " パターンに一致
if "hello" !~ '.*'     " パターンに一致しない

コマンドと実行

コマンド実行

normal! ddahello
execute 'normal! ' . a:keys
wincmd J               " ウィンドウ移動コマンド

Shell コマンド

let output = system('ls ' . shellescape(expand('%:h')))

レジスタ

getreg('*')            " クリップボードの内容を取得
getregtype('*')        " レジスタ種別: 'v' (文字), 'V' (行), '<ctrl-v>' (矩形ブロック)
setreg('*', 'new text')

関連テーマ