مرجع سريع

ورقة غش دوال Vimscript

دليل مرجعي سريع لدوال Vimscript المدمجة: معالجة القوائم والقواميس، فحص المخازن المؤقتة (buffer)، حركة المؤشر، وعمليات السلاسل النصية.

· تاريخ النشر

دليل مرجعي لدوال لغة 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    المجلد الأب (/Users/name/project)
" :t    اسم الملف فقط (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)      " تحليل بنظام سداسي عشري (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')      " تجاهل حالة الأحرف

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')))

السجلات (Registers)

getreg('*')            " جلب محتويات الحافظة
getregtype('*')        " نوع السجل: 'v' (حرف)، 'V' (سطر)، '<ctrl-v>' (كتلة)
setreg('*', 'new text')

موضوعات ذات صلة