Snabbreferens

Vimscript fusklapp

En omfattande referensguide för Vimscript: variabler, funktioner, anpassade kommandon, datastrukturer, tangentbordsmappningar och syntaxfärgning.

· Publicerad

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

Relaterade ämnen