Γρήγορη αναφορά

Συνοπτικός οδηγός Vimscript

Ένας περιεκτικός οδηγός αναφοράς για το Vimscript: μεταβλητές, συναρτήσεις, προσαρμοσμένες εντολές, δομές δεδομένων και αντιστοιχίσεις πλήκτρων.

· Δημοσιεύτηκε

Το 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

Σχετικά θέματα