Краткий справочник

Шпаргалка по функциям 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)            " Текст первой строки
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)        " Преобразовать float в integer: 3

Преобразование типов

str2float('0.2')
str2nr('240')
str2nr('ff', 16)      " Шестнадцатеричный парсинг (Base-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')

Связанные темы