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