neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

zig.vim (2137B)


      1 " Vim filetype indent file
      2 " Language: Zig
      3 " Upstream: https://github.com/ziglang/zig.vim
      4 
      5 " Only load this indent file when no other was loaded.
      6 if exists("b:did_indent")
      7    finish
      8 endif
      9 let b:did_indent = 1
     10 
     11 if (!has("cindent") || !has("eval"))
     12    finish
     13 endif
     14 
     15 setlocal cindent
     16 
     17 " L0 -> 0 indent for jump labels (i.e. case statement in c).
     18 " j1 -> indenting for "javascript object declarations"
     19 " J1 -> see j1
     20 " w1 -> starting a new line with `(` at the same indent as `(`
     21 " m1 -> if `)` starts a line, match its indent with the first char of its
     22 "       matching `(` line
     23 " (s -> use one indent, when starting a new line after a trailing `(`
     24 setlocal cinoptions=L0,m1,(s,j1,J1,l1
     25 
     26 " cinkeys: controls what keys trigger indent formatting
     27 " 0{ -> {
     28 " 0} -> }
     29 " 0) -> )
     30 " 0] -> ]
     31 " !^F -> make CTRL-F (^F) reindent the current line when typed
     32 " o -> when <CR> or `o` is used
     33 " O -> when the `O` command is used
     34 setlocal cinkeys=0{,0},0),0],!^F,o,O
     35 
     36 setlocal indentexpr=GetZigIndent(v:lnum)
     37 
     38 let b:undo_indent = "setlocal cindent< cinkeys< cinoptions< indentexpr<"
     39 
     40 function! GetZigIndent(lnum)
     41    let curretLineNum = a:lnum
     42    let currentLine = getline(a:lnum)
     43 
     44    " cindent doesn't handle multi-line strings properly, so force no indent
     45    if currentLine =~ '^\s*\\\\.*'
     46        return -1
     47    endif
     48 
     49    let prevLineNum = prevnonblank(a:lnum-1)
     50    let prevLine = getline(prevLineNum)
     51 
     52    " for lines that look like
     53    "   },
     54    "   };
     55    " try treating them the same as a }
     56    if prevLine =~ '\v^\s*},$'
     57        if currentLine =~ '\v^\s*};$' || currentLine =~ '\v^\s*}$'
     58            return indent(prevLineNum) - 4
     59        endif
     60        return indent(prevLineNum-1) - 4
     61    endif
     62    if currentLine =~ '\v^\s*},$'
     63        return indent(prevLineNum) - 4
     64    endif
     65    if currentLine =~ '\v^\s*};$'
     66        return indent(prevLineNum) - 4
     67    endif
     68 
     69 
     70    " cindent doesn't handle this case correctly:
     71    " switch (1): {
     72    "   1 => true,
     73    "       ~
     74    "       ^---- indents to here
     75    if prevLine =~ '.*=>.*,$' && currentLine !~ '.*}$'
     76       return indent(prevLineNum)
     77    endif
     78 
     79    return cindent(a:lnum)
     80 endfunction