Vimscript är det inbyggda skriptspråket för att anpassa och utöka textredigeraren Vim.
Kom igång
let name = "John"
echo "Hello, " . name
Du kan spara koden i en fil (script.vim) och ladda den via (:source script.vim), eller köra kommandon direkt i normalläge via :let och :echo.
Lär dig genom exempel
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>
Variabler
Definition
let var = "hello"
Variabelns räckviddsprefix (Scope)
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
Prefixet s: kan också användas för skriptlokala funktionsnamn. Se :help local-variables.
Andra räckvidder
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-alternativ
echo 'tabstop is ' . &tabstop
if &insertmode
echo &g:option
echo &l:option
Lägg till prefixet & före alternativnamn för att läsa eller ändra dem i uttryck.
Aritmetiska och strängoperatorer
a + b " Numbers only!
'hello ' . name " String concatenation
let var -= 2
let var += 5
let var .= 'string'
Strängar (Strings)
Strängsyntax
let str = "String"
let str = "String with \n newline"
let literal = 'literal, no \ escaping'
let literal = 'that''s enough'
echo "result = " . res
Strängfunktioner
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')
Funktioner
Funktionsdefinition
function! s:Initialize(cmd, args)
echo "Command: " . a:cmd
return 1
endfunction
Skriva över funktioner
function! MyFunc()
echo "Function defined or replaced"
endfunction
Genom att använda function! (med !) ersätts tidigare definierade funktioner med samma namn utan felmeddelande.
Namnrymder och automatisk laddning (Autoload)
function! myplugin#hello()
" autoload/myplugin.vim
endfunction
Anropa funktioner
call s:Initialize()
call s:Initialize("hello", 123)
Fånga returvärden
let result = s:Initialize()
Avbryt vid fel (Abort)
function! MyFunction() abort
endfunction
Variadiska argument (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')
Loopar och flödeskontroll
Loopar (Loops)
for s in list
echo s
continue
break
endfor
while x < 5
let x += 1
endwhile
Anpassade kommandon (Custom Commands)
Definiera kommandon
command! Save :set fo=want tw=80 nowrap
Användardefinierade kommandon måste börja med en stor bokstav. Utropstecknet ! tillåter att skriva över befintliga kommandon.
Anropa funktioner i kommandon
command! Save call <SID>Foo()
function! s:Foo()
endfunction
Kommandoargument
command! -nargs=? Save call script#foo(<args>)
| Argumentspecifikation | Beskrivning |
|---|---|
-nargs=0 |
0 argument (standard) |
-nargs=1 |
Exakt 1 argument (kan innehålla blanksteg) |
-nargs=? |
0 eller 1 argument |
-nargs=* |
0 eller fler blankstegsseparerade argument |
-nargs=+ |
1 eller fler blankstegsseparerade argument |
Villkorssatser (Conditionals)
If / Elseif / Else
let char = getchar()
if char == "\<LeftMouse>"
elseif char == "\<RightMouse>"
else
endif
Sanningsvärden (Truthiness)
if 1 "=> True
if 0 "=> False
if "1" "=> True
if "456" "=> True
if "xfz" "=> False
Vimscript har ingen fristående boolesk typ: 0 är falskt och heltal skiljda från noll är sanna.
Jämförelseoperatorer
if 3 > 2
if a && b
if (a && b) || (c && d)
if !c
Skiftlägeskänslighet i strängar
if name ==# 'John' " case-sensitive
if name ==? 'John' " case-insensitive
if name == 'John' " &ignorecase
Identitetsjämförelse
if a is b
if a isnot b
Kontrollerar om a och b refererar till exakt samma datainstans i minnet.
Reguljära uttrycksmatchningar
"hello" =~ 'xx*'
"hello" !~ 'xx*'
"hello" =~ '\v<\d+>'
\v aktiverar 'very magic'-syntax, vilket tillåter specialtecken utan överflödig escaping.
Enradsinstruktioner
if empty(a:path) | return [] | endif
let status = a ? b : c
Använd | för att sammanfoga flera instruktioner på en rad.
Datastrukturer
Listor (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")
Listoperationer
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)
Funktionella listmetoder
call map(files, "bufname(v:val)")
call filter(files, 'v:val != ""')
Ordlistor (Dictionaries)
let colors = {
\ "apple": "red",
\ "banana": "yellow"
}
echo colors["apple"]
echo get(colors, "apple")
Ordlisteoperationer
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
Räckviddsprefix (s:, g:, l:, b:) är själva tillgängliga som ordlisteobjekt:
let script_keys = keys(s:)
Tal och aritmetik
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-specifika funktioner
Dynamisk kommandokörning (execute)
execute "vsplit"
execute "edit " . fnameescape(filename)
Tangenter i normalläge (normal)
normal G
normal! G
execute "normal! gg/foo\<cr>dd"
Filnamnsexpansion (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
Utdatakontroll och meddelanden
silent g/pattern/p
echo 'Simple text'
echomsg 'Persistent text recorded in :messages'
echoerr 'Error message'
echohl WarningMsg | echomsg "=> Warning!" | echohl None
Konfigurationsalternativ
set number
set nonumber
set number!
set numberwidth=5
set guioptions+=e
Introspektion och funktionsdetektering
has("clipboard")
executable("python3")
globpath(&rtp, "syntax/c.vim")
exists("$ENV")
exists(":command")
exists("variable")
exists("+option")
Tangentbordsmappningar (Key Mappings)
Lägen (Modes)
[nvixso](nore)map
Vanliga mappningsflaggor
| Flagga | Betydelse |
|---|---|
<buffer> |
Gäller endast aktuell buffer |
<silent> |
Visa inte kommandot på statusraden |
<nowait> |
Utför omedelbart utan att vänta på längre sekvenser |
Syntaxfärgning och döljning (Conceal)
Markeringsgrupper
hi Comment term=bold gui=bold ctermfg=4 guifg=#80a0ff
hi def link markdownH1 htmlH1
Filtypsidentifiering (Filetype Detection)
augroup filetypedetect
au! BufNewFile,BufRead *.json setf javascript
augroup END
au Filetype markdown setlocal spell
Dölj text (Conceal)
set conceallevel=2
syn match newLine "<br>" conceal cchar=}
hi newLine guifg=green
Inkluderingsskydd (Include Guards)
if exists('g:loaded_myplugin')
finish
endif
let g:loaded_myplugin = 1