この記事は Vim 8.0 Advent Calendar の 19 日目の記事です。
関数紹介編の最後です。特殊な操作をするものや、その他雑多な関数を紹介します。
uniq({list} [, {func} [, {dict}]])
配列内の連続する同じ要素を削除します。
全体から重複を削除したい場合は事前に sort()
関数を使う必要があります。
let new_uniq_list = uniq(sort(copy(list)))
比較にはデフォルトで文字列表現を使います。{func}
や {dict}
を与えることで、sort()
関数と同様に比較方法を指定することが可能です。
execute({command} [, {silent}])
Ex コマンド {command}
を実行し、コマンドラインへの出力を結果として返します。
{command}
は文字列か、文字列の配列です。
{silent}
は ""
"silent"
"silent!"
のいずれかで、コマンドのプレフィックスのように使われます。デフォルトは "silent"
です。
echo filter(split(execute('scriptnames'), "\n"), { i, line -> line =~# '^\s*1:' })
" => 1: ~/.vim/vimrc
Ex コマンドの実行中に :redir
Ex コマンドを使うことはできません。
matchaddpos({group}, {pos}[, {priority}[, {id}[, {dict}]]])
matchadd()
関数のようにウィンドウ内にハイライトを追加しますが、matchadd()
関数はパターンを指定するのに対し、matchaddpos()
関数は位置を指定します。
{pos}
には位置のリストを指定します。位置は以下のうちのいずれかです。
型 | 説明 |
---|---|
数値 | 行番号です。行全体を強調表示します。 |
数値を 1 つ持ったリスト | 行番号です。行全体を強調表示します。 |
数値を 2 つ持ったリスト | 行番号と、その行の桁です。単位はバイトで、指定した文字を強調表示します。 |
数値を 3 つ持ったリスト | 行番号、桁、文字列長(バイト単位)です。 |
一度に指定できる位置は 8 個までです。
setfperm({fname}, {mode})
ファイルのパーミッションを設定します。{mode}
は getfperm()
関数の戻り値と同様のフォーマットである、"rwxrwxrwx"
形式で指定します。
systemlist({expr} [, {input}])
system()
関数と同様ですが、戻り値は行単位のリストになります。戻り値内の NULL 文字(\0
)は改行文字に変換されます。
これにより、結果に NULL 文字が含まれてるコマンドの結果も取得できます。
perleval({expr})
if_perl を使って Perl の式を評価し、結果を Vim のデータ形式に変換して返します。
これは pyeval()
関数や luaeval()
関数の Perl 版です。
echo perleval('{"foo" => "bar"}')
" => {'foo': 'bar'}
exepath({expr})
実行コマンドのフルパスを取得します。絶対パス、相対パス、$PATH
の中に存在するファイルが実行ファイルだった場合、そのフルパスを返します。
echo exepath('git')
" => /usr/bin/git
isnan({expr})
{expr}
が NaN
値であるかを判定します。
echo isnan(0.0 / 0.0)
" => 1
reltimefloat({time})
reltime()
関数の経過時間の戻り値を秒数の Float 値に変換します。
let start = reltime()
sleep 1
echo reltimefloat(reltime(start))
" => 1.000287
以前から経過時間を文字列に変換する reltimestr()
関数がありましたが、こちらは文字列であり、かつ先頭に空白が含まれているため、表示以外の目的で使うには少々扱いづらいという問題がありました。reltimefloat()
関数を使うことで直接 Float 値が得られるため、平均の計算などがやりやすくなります。