neovim

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

raku.vim (3562B)


      1 " Vim indent file
      2 " Language:      Perl 6
      3 " Maintainer:    vim-perl <vim-perl@googlegroups.com> (need to be subscribed to post)
      4 " Homepage:      https://github.com/vim-perl/vim-perl
      5 " Bugs/requests: https://github.com/vim-perl/vim-perl/issues
      6 " Last Change:   2020 Apr 15
      7 "                2023 Aug 28 by Vim Project (undo_indent)
      8 " Contributors:  Andy Lester <andy@petdance.com>
      9 "                Hinrik Örn Sigurðsson <hinrik.sig@gmail.com>
     10 "
     11 " Adapted from indent/perl.vim by Rafael Garcia-Suarez <rgarciasuarez@free.fr>
     12 
     13 " Suggestions and improvements by :
     14 "   Aaron J. Sherman (use syntax for hints)
     15 "   Artem Chuprina (play nice with folding)
     16 " TODO:
     17 " This file still relies on stuff from the Perl 5 syntax file, which Perl 6
     18 " does not use.
     19 "
     20 " Things that are not or not properly indented (yet) :
     21 " - Continued statements
     22 "     print "foo",
     23 "       "bar";
     24 "     print "foo"
     25 "       if bar();
     26 " - Multiline regular expressions (m//x)
     27 " (The following probably needs modifying the perl syntax file)
     28 " - qw() lists
     29 " - Heredocs with terminators that don't match \I\i*
     30 
     31 " Only load this indent file when no other was loaded.
     32 if exists("b:did_indent")
     33    finish
     34 endif
     35 let b:did_indent = 1
     36 
     37 " Is syntax highlighting active ?
     38 let b:indent_use_syntax = has("syntax")
     39 
     40 setlocal indentexpr=GetRakuIndent()
     41 
     42 " we reset it first because the Perl 5 indent file might have been loaded due
     43 " to a .pl/pm file extension, and indent files don't clean up afterwards
     44 setlocal indentkeys&
     45 
     46 setlocal indentkeys+=0=,0),0],0>,0»,0=or,0=and
     47 if !b:indent_use_syntax
     48    setlocal indentkeys+=0=EO
     49 endif
     50 
     51 let b:undo_indent = "setlocal indentexpr< indentkeys<"
     52 
     53 let s:cpo_save = &cpo
     54 set cpo-=C
     55 
     56 function! GetRakuIndent()
     57 
     58    " Get the line to be indented
     59    let cline = getline(v:lnum)
     60 
     61    " Indent POD markers to column 0
     62    if cline =~ '^\s*=\L\@!'
     63        return 0
     64    endif
     65 
     66    " Get current syntax item at the line's first char
     67    let csynid = ''
     68    if b:indent_use_syntax
     69        let csynid = synIDattr(synID(v:lnum,1,0),"name")
     70    endif
     71 
     72    " Don't reindent POD and heredocs
     73    if csynid =~ "^rakuPod"
     74        return indent(v:lnum)
     75    endif
     76 
     77 
     78    " Now get the indent of the previous perl line.
     79 
     80    " Find a non-blank line above the current line.
     81    let lnum = prevnonblank(v:lnum - 1)
     82    " Hit the start of the file, use zero indent.
     83    if lnum == 0
     84        return 0
     85    endif
     86    let line = getline(lnum)
     87    let ind = indent(lnum)
     88    " Skip heredocs, POD, and comments on 1st column
     89    if b:indent_use_syntax
     90        let skippin = 2
     91        while skippin
     92            let synid = synIDattr(synID(lnum,1,0),"name")
     93            if (synid =~ "^rakuPod" || synid =~ "rakuComment")
     94                let lnum = prevnonblank(lnum - 1)
     95                if lnum == 0
     96                    return 0
     97                endif
     98                let line = getline(lnum)
     99                let ind = indent(lnum)
    100                let skippin = 1
    101            else
    102                let skippin = 0
    103            endif
    104        endwhile
    105    endif
    106 
    107        if line =~ '[<«\[{(]\s*\(#[^)}\]»>]*\)\=$'
    108            let ind = ind + &sw
    109        endif
    110        if cline =~ '^\s*[)}\]»>]'
    111            let ind = ind - &sw
    112        endif
    113 
    114    " Indent lines that begin with 'or' or 'and'
    115    if cline =~ '^\s*\(or\|and\)\>'
    116        if line !~ '^\s*\(or\|and\)\>'
    117            let ind = ind + &sw
    118        endif
    119    elseif line =~ '^\s*\(or\|and\)\>'
    120        let ind = ind - &sw
    121    endif
    122 
    123    return ind
    124 
    125 endfunction
    126 
    127 let &cpo = s:cpo_save
    128 unlet s:cpo_save
    129 
    130 " vim:ts=8:sts=4:sw=4:expandtab:ft=vim