Configuring Vim for Perl 6

Ovid on 2008-10-19T12:47:11

I've been playing around more with Perl 6 and have started to configure vim for it. First, download Parrot. After you have built it, change into the languages/perl6 directory and type make perl6. This will create a ./perl6 executable for you (don't type make install, though. This causes problems with future versions, as I've discovered).

Next, create the file ~/.vim/syntax/perl6.vim. This should contain Luke Palmer's Perl 6 vim syntax file (if there's a more up-to-date one, please post a comment). Then, in your ~/.vim/filetype.vim file, add the following entry:

augroup filetypedetect
    autocmd! BufRead,BufNewFile *.p6 setfiletype perl6
augroup END

That will associate any file with a .p6 extension with the Perl 6 filetype. Opening those files in vim will automatically apply the Perl 6 syntax to it.

While you should probably create a Perl 6 plugin, I have a (bad) habit of just dumping extra stuff in my .vimrc file. In that, I have the following (you'll need to adjust your path to the path of the ./perl6 executable):

au! FileType perl6 :call Perl6Mappings()

function! Perl6Mappings()
    map  r  :!~/code/parrot/languages/perl6/perl6 %
endfunction

I'll likely add more mappings in the future, but for now, this means that if you type ,r in vim while editing a Perl 6 file (assuming that you use the comma for your leader), you'll automatically run the program.

The tests are a bit more difficult. What I've done is this:

autocmd! BufRead,BufNewFile *.t   call s:PerlTestSetup()

function! s:PerlTestSetup()
    let n = 1
    let perl5 = 1
    if line("$") > 500
      let nmax = 500
    else
      let nmax = line("$")
    endif
    while n <= nmax
      if getline(n) =~ "use v6"
        setfiletype perl6
        let perl5 = 0
        break
      endif
      let n = n + 1
    endwhile
    if perl5 == 1
      setfiletype perl
      call PerlTestMappings()
    endif
endfunc

function! PerlTestMappings()
    noremap  ,r :!prove -vl %
    noremap  ,t :!prove -vl %
endfunction

It's a brute-force check to see if a .t file is Perl 6 or not. It uses a heuristic and can break. It also doesn't allow me to run my tests directly from the editor. It's a start, though.