Το Vimscript είναι η ενσωματωμένη γλώσσα σεναρίων για την προσαρμογή και επέκταση του προγράμματος επεξεργασίας κειμένου Vim.
Ξεκινώντας
let name = "John"
echo "Hello, " . name
Μπορείτε να τοποθετήσετε αυτόν τον κώδικα σε ένα αρχείο (script.vim) και να το φορτώσετε με (:source script.vim), ή να εκτελέσετε μεμονωμένες εντολές απευθείας μέσω :let και :echo.
Μαθαίνοντας με παραδείγματα
function! SuperTab()
let l:part = strpart(getline('.'), col('.') - 2, 1)
if (l:part =~ '^\W\?$')
return "\<Tab>"
else
return "\<C-n>"
endif
endfunction
imap <Tab> <C-R>=SuperTab()<CR>
Μεταβλητές
Ορισμός
let var = "hello"
Προθέματα εμβέλειας μεταβλητών
let g:ack_options = '-s -H' " g: global
let s:ack_program = 'ack' " s: local (to script)
let l:foo = 'bar' " l: local (to function)
let a:arg = 'baz' " a: function argument
Το πρόθεμα s: μπορεί επίσης να χρησιμοποιηθεί για ονόματα συναρτήσεων τοπικής εμβέλειας αρχείου. Δείτε :help local-variables.
Άλλες εμβέλειες
let w:foo = 'bar' " w: window local
let b:state = 'on' " b: buffer local
let t:state = 'off' " t: tab page local
echo v:version " v: vim internal variable
let @/ = '' " @ register
echo $PATH " $ environment variable
Επιλογές Vim
echo 'tabstop is ' . &tabstop
if &insertmode
echo &g:option
echo &l:option
Προσθέστε το πρόθεμα & στα ονόματα επιλογών για να τα διαβάσετε ή να τα τροποποιήσετε σε εκφράσεις.
Αριθμητικοί τελεστές & τελεστές συμβολοσειρών
a + b " Numbers only!
'hello ' . name " String concatenation
let var -= 2
let var += 5
let var .= 'string'
Συμβολοσειρές (Strings)
Σύνταξη συμβολοσειρών
let str = "String"
let str = "String with \n newline"
let literal = 'literal, no \ escaping'
let literal = 'that''s enough'
echo "result = " . res
Συναρτήσεις συμβολοσειρών
strlen(str)
len(str)
strchars(str)
split("one two three") "=> ['one', 'two', 'three']
split("one.two.three", '.') "=> ['one', 'two', 'three']
join(['a', 'b'], ',') "=> 'a,b'
tolower('Hello')
toupper('Hello')
Συναρτήσεις
Ορισμός συνάρτησης
function! s:Initialize(cmd, args)
echo "Command: " . a:cmd
return 1
endfunction
Αντικατάσταση συναρτήσεων
function! MyFunc()
echo "Function defined or replaced"
endfunction
Η χρήση του function! (με !) αντικαθιστά οποιαδήποτε προηγουμένως ορισμένη συνάρτηση χωρίς σφάλμα.
Χώροι ονομάτων & Αυτόματη φόρτωση (Autoload)
function! myplugin#hello()
" autoload/myplugin.vim
endfunction
Κλήση συναρτήσεων
call s:Initialize()
call s:Initialize("hello", 123)
Λήψη τιμών επιστροφής
let result = s:Initialize()
Διακοπή σε σφάλμα (Abort)
function! MyFunction() abort
endfunction
Μεταβλητός αριθμός ορισμάτων (Variadic Arguments)
function! Infect(...)
echo a:0
echo a:1
echo a:2
for item in a:000
echon ' ' . item
endfor
endfunction
call Infect('jake', 'bella')
Βρόχοι & Έλεγχος ροής
Βρόχοι (Loops)
for s in list
echo s
continue
break
endfor
while x < 5
let x += 1
endwhile
Προσαρμοσμένες εντολές (Custom Commands)
Ορισμός εντολών
command! Save :set fo=want tw=80 nowrap
Οι εντολές που ορίζονται από το χρήστη πρέπει να ξεκινούν με κεφαλαίο γράμμα. Το ! επιτρέπει την αντικατάσταση υπάρχουσας εντολής.
Κλήση συναρτήσεων σε εντολές
command! Save call <SID>Foo()
function! s:Foo()
endfunction
Ορίσματα εντολών
command! -nargs=? Save call script#foo(<args>)
| Προδιαγραφή ορίσματος | Περιγραφή |
|---|---|
-nargs=0 |
0 ορίσματα (προεπιλογή) |
-nargs=1 |
Ακριβώς 1 όρισμα (μπορεί να περιέχει κενά) |
-nargs=? |
0 ή 1 όρισμα |
-nargs=* |
0 ή περισσότερα ορίσματα διαχωρισμένα με κενό |
-nargs=+ |
1 ή περισσότερα ορίσματα διαχωρισμένα με κενό |
Συνθήκες (Conditionals)
If / Elseif / Else
let char = getchar()
if char == "\<LeftMouse>"
elseif char == "\<RightMouse>"
else
endif
Αληθοφάνεια (Truthiness)
if 1 "=> True
if 0 "=> False
if "1" "=> True
if "456" "=> True
if "xfz" "=> False
Το Vimscript δεν διαθέτει αυτόνομο τύπο boolean: το 0 είναι ψευδές και οι μη μηδενικοί αριθμοί είναι αληθείς.
Τελεστές σύγκρισης
if 3 > 2
if a && b
if (a && b) || (c && d)
if !c
Διάκριση πεζών/κεφαλαίων σε συμβολοσειρές
if name ==# 'John' " case-sensitive
if name ==? 'John' " case-insensitive
if name == 'John' " &ignorecase
Σύγκριση ταυτότητας
if a is b
if a isnot b
Ελέγχει αν τα a και b αναφέρονται στην ίδια ακριβώς παρουσία δεδομένων.
Ταίριασμα κανονικών εκφράσεων (Regex)
"hello" =~ 'xx*'
"hello" !~ 'xx*'
"hello" =~ '\v<\d+>'
Το \v ενεργοποιεί τη σύνταξη 'very magic', επιτρέποντας ειδικούς χαρακτήρες χωρίς περιττό escaping.
Εντολές σε μία γραμμή
if empty(a:path) | return [] | endif
let status = a ? b : c
Χρησιμοποιήστε το | για να συνδέσετε πολλαπλές εντολές σε μία γραμμή.
Δομές δεδομένων
Λίστες (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")
Λειτουργίες λίστας
len(mylist)
empty(mylist)
let sortedlist = sort(copy(mylist))
let shortlist = mylist[2:-1]
let shortlist = mylist[2:]
let single = mylist[2:2]
let longlist = mylist + [5, 6]
let mylist += [7, 8]
call add(mylist, 9)
Συναρτησιακές μέθοδοι λίστας
call map(files, "bufname(v:val)")
call filter(files, 'v:val != ""')
Λεξικά (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)
let k = keys(dict)
let v = values(dict)
let n = len(dict)
echo max(dict)
echo min(dict)
call extend(s:fruits, { "cherry": "red" })
for key in keys(mydict)
echo key . ': ' . mydict[key]
endfor
Τα προθέματα εμβέλειας (s:, g:, l:, b:) είναι προσβάσιμα ως αντικείμενα λεξικού:
let script_keys = keys(s:)
Αριθμοί & Αριθμητική
let int = 1000
let hex = 0xff
let oct = 0755
let fl = 100.1
let sci = 5.4e4
3 / 2 "=> 1
3 / 2.0 "=> 1.5
sqrt(100)
floor(3.5)
ceil(3.3)
abs(-3.4)
Ιδιαιτερότητες του Vim
Δυναμική εκτέλεση εντολών (execute)
execute "vsplit"
execute "edit " . fnameescape(filename)
Πλήκτρα κανονικής λειτουργίας (normal mode)
normal G
normal! G
execute "normal! gg/foo\<cr>dd"
Ανάπτυξη ονομάτων αρχείων (expand)
echo expand("%") " path/file.txt
echo expand("%:t") " file.txt
echo expand("%:p:h") " /home/user/path
echo expand("%:r") " path/file
echo expand("%:e") " txt
Έλεγχος εξόδου & Μηνύματα
silent g/pattern/p
echo 'Simple text'
echomsg 'Persistent text recorded in :messages'
echoerr 'Error message'
echohl WarningMsg | echomsg "=> Warning!" | echohl None
Επιλογές διαμόρφωσης
set number
set nonumber
set number!
set numberwidth=5
set guioptions+=e
Ενδοσκόπηση & Ανίχνευση δυνατοτήτων
has("clipboard")
executable("python3")
globpath(&rtp, "syntax/c.vim")
exists("$ENV")
exists(":command")
exists("variable")
exists("+option")
Αντιστοιχίσεις πλήκτρων (Mappings)
Καταστάσεις λειτουργίας (Modes)
[nvixso](nore)map
Κοινές σημαίες αντιστοίχισης
| Σημαία | Σημασία |
|---|---|
<buffer> |
Τοπικό μόνο στο τρέχον buffer |
<silent> |
Χωρίς εμφάνιση της εντολής στη γραμμή κατάστασης |
<nowait> |
Άμεση ενεργοποίηση χωρίς αναμονή |
Επισήμανση σύνταξης & Απόκρυψη (Conceal)
Ομάδες επισήμανσης
hi Comment term=bold gui=bold ctermfg=4 guifg=#80a0ff
hi def link markdownH1 htmlH1
Ανίχνευση τύπου αρχείου (Filetype Detection)
augroup filetypedetect
au! BufNewFile,BufRead *.json setf javascript
augroup END
au Filetype markdown setlocal spell
Απόκρυψη (Conceal)
set conceallevel=2
syn match newLine "<br>" conceal cchar=}
hi newLine guifg=green
Φύλακες συμπερίληψης (Include Guards)
if exists('g:loaded_myplugin')
finish
endif
let g:loaded_myplugin = 1