" angular.vim " Maintainer: Kevin Burnett " Last Change: 2014 April 6 " https://github.com/scrooloose/syntastic/issues/612#issuecomment-19456342 " " define your own proprietary attributes before this plugin loads, in your " .vimrc, like so: " let g:syntastic_html_tidy_ignore_errors = [' proprietary attribute "myhotcompany-'] " " or copy the mechanism used here to ensure you get both your ignores and " the plugin's ignores. if !exists('g:syntastic_html_tidy_ignore_errors') let g:syntastic_html_tidy_ignore_errors = [] endif let g:syntastic_html_tidy_ignore_errors = g:syntastic_html_tidy_ignore_errors + [ \ ' proprietary attribute "ng-', \ ' proprietary attribute "ui-', \ ' is not recognized!', \ 'discarding unexpected ', \ 'discarding unexpected ', \ '
proprietary attribute "src' \ ] if !exists('g:angular_find_ignore') let g:angular_find_ignore = [] endif let g:angular_find_ignore = g:angular_find_ignore + [ \ 'coverage/', \ 'build/', \ 'dist/', \ 'test/', \ '.git/' \ ] " Helper " Find file in or below current directory and edit it. function! s:Find(...) abort let path="." let query=a:1 if a:0 == 2 let cmd=a:2 else let cmd="open" endif if !exists("g:angular_find_ignore") let ignore = "" else let ignore = " | egrep -v '".join(g:angular_find_ignore, "|")."'" endif let l:command="find ".path." -type f -iname '*".query."*'".ignore let l:list=system(l:command) let l:num=strlen(substitute(l:list, "[^\n]", "", "g")) if l:num < 1 echo "'".query."' not found" return endif if l:num == 1 exe cmd . " " . substitute(l:list, "\n", "", "g") else let tmpfile = tempname() exe "redir! > " . tmpfile silent echon l:list redir END let old_efm = &efm set efm=%f if exists(":cgetfile") execute "silent! cgetfile " . tmpfile else execute "silent! cfile " . tmpfile endif let &efm = old_efm " Open the quickfix window below the current window botright copen call delete(tmpfile) endif endfunction " Helper " jacked from abolish.vim (was s:snakecase there). thank you, tim pope. function! s:dashcase(word) abort let word = substitute(a:word,'::','/','g') let word = substitute(word,'\(\u\+\)\(\u\l\)','\1_\2','g') let word = substitute(word,'\(\l\|\d\)\(\u\)','\1_\2','g') let word = substitute(word,'_','-','g') let word = tolower(word) return word endfunction function! s:FindFileBasedOnAngularServiceUnderCursor(cmd) abort let l:fileundercursor = expand('') " Maybe the person actually has the cursor over a file path. " do more standard gf stuff in that case if filereadable(l:fileundercursor) execute "e " . l:fileundercursor return endif " app is the angular 'public root' conventionally. " this will help us find things like the template here: " $routeProvider.when('/view1', {templateUrl: 'partials/partial1.html', controller: 'MyCtrl1'}); if filereadable("app/" . l:fileundercursor) execute "e " . "app/" . l:fileundercursor return endif let l:wordundercursor = expand('') let l:dashcased = s:dashcase(l:wordundercursor) let l:filethatmayexist = l:dashcased . ".js" call Find(l:filethatmayexist, a:cmd) endfunction function! s:Alternate(cmd) abort let l:currentpath = expand('%') let l:newpaths = [] if l:currentpath =~ "test/unit" let l:newpaths = [ \ substitute(l:currentpath, "test/unit", "app/js", ""), \ substitute(l:currentpath, "test/unit", "app/src", ""), \ substitute(substitute(l:currentpath, "test/unit", "app/js", ""), "Spec.js", ".js", ""), \ substitute(substitute(l:currentpath, "test/unit", "app/src", ""), "Spec.js", ".js", "") \ ] elseif l:currentpath =~ "test/karma/unit" let l:newpaths = [substitute(substitute(l:currentpath, "test/karma/unit", "public/js", ""), ".spec.js", ".js", "")] elseif l:currentpath =~ "test/spec" let l:newpaths = [substitute(l:currentpath, "test/spec", "app/scripts", "")] elseif l:currentpath =~ "app/scripts" let l:newpaths = [substitute(l:currentpath, "app/scripts", "test/spec", "")] elseif l:currentpath =~ "app/src" let l:newpaths = [substitute(l:currentpath, "app/src", "test/unit", ""), substitute(substitute(l:currentpath, "app/src", "test/unit", ""), ".js", "Spec.js", "")] elseif l:currentpath =~ "app/js" let l:newpaths = [substitute(l:currentpath, "app/js", "test/unit", ""), substitute(substitute(l:currentpath, "app/js", "test/unit", ""), ".js", "Spec.js", "")] elseif l:currentpath =~ "public/js" let l:newpaths = [substitute(l:currentpath, "public/js", "test/karma/unit", ""), substitute(substitute(l:currentpath, "public/js", "test/karma/unit", ""), ".js", ".spec.js", "")] elseif l:currentpath =~ "frontend/src" let l:newpaths = [substitute(substitute(l:currentpath, "frontend/src", "tests/frontend", ""), ".js", ".spec.js", "")] elseif l:currentpath =~ "tests/frontend" let l:newpaths = [substitute(substitute(l:currentpath, "tests/frontend", "frontend/src", ""), ".spec.js", ".js", "")] endif if l:newpaths != [] for path in l:newpaths if filereadable(path) return a:cmd . ' ' . fnameescape(path) endif endfor endif return 'echoerr '.string("Couldn't find alternate file") endfunction " Helper " goes to end of line first ($) so it doesn't go the previous " function if your cursor is sitting right on top of the pattern function! s:SearchUpForPattern(pattern) abort execute 'silent normal! ' . '$?' . a:pattern . "\r" endfunction function! s:AngularRunSpecBlock() abort " save cursor position so we can go back let b:angular_pos = getpos('.') cal s:SearchUpForPattern('describe(') let l:wordundercursor = expand('') if l:wordundercursor == "describe" " if there was a spec (anywhere in the file) highlighted with "ddescribe" before, revert it to "describe" let l:positionofspectorun = getpos('.') " this can move the cursor, hence setting the cursor back %s/ddescribe/describe/ge %s/iit/it/ge " move cursor back to the spec we want to run call setpos('.', l:positionofspectorun) " change the current spec to "ddescribe" execute 'silent normal! cwddescribe' elseif l:wordundercursor == "ddescribe" " delete the second d in "ddescribe" execute 'silent normal! x' endif update " write the file if modified " Reset cursor to previous position. call setpos('.', b:angular_pos) endfunction function! s:AngularRunSpec() abort " save cursor position so we can go back let b:angular_pos = getpos('.') cal s:SearchUpForPattern('it(') let l:wordundercursor = expand('') if l:wordundercursor == "it" " if there was a spec (anywhere in the file) highlighted with "iit" before, revert it to "it" let l:positionofspectorun = getpos('.') " this can move the cursor, hence setting the cursor back %s/iit/it/ge " move cursor back to the spec we want to run call setpos('.', l:positionofspectorun) " change the current spec to "iit" execute 'silent normal! cwiit' elseif l:wordundercursor == "iit" " delete the second i in "iit" execute 'silent normal! x' endif update " write the file if modified " Reset cursor to previous position. call setpos('.', b:angular_pos) endfunction nnoremap AngularGfJump :exe FindFileBasedOnAngularServiceUnderCursor('open') nnoremap AngularGfSplit :exe FindFileBasedOnAngularServiceUnderCursor('split') nnoremap AngularGfTabjump :exe FindFileBasedOnAngularServiceUnderCursor('tabedit') augroup angular_gf autocmd! autocmd FileType javascript,html command! -buffer AngularGoToFile :call s:FindFileBasedOnAngularServiceUnderCursor('open') autocmd FileType javascript,html nmap gf AngularGfJump autocmd FileType javascript,html nmap f AngularGfSplit autocmd FileType javascript,html nmap AngularGfSplit autocmd FileType javascript,html nmap gf AngularGfTabjump augroup END augroup angular_alternate autocmd! autocmd FileType javascript command! -buffer -bar -bang A :exe s:Alternate('edit') autocmd FileType javascript command! -buffer -bar AS :exe s:Alternate('split') autocmd FileType javascript command! -buffer -bar AV :exe s:Alternate('vsplit') autocmd FileType javascript command! -buffer -bar AT :exe s:Alternate('tabedit') augroup END augroup angular_run_spec autocmd! autocmd FileType javascript command! -buffer AngularRunSpec :call s:AngularRunSpec() autocmd FileType javascript command! -buffer AngularRunSpecBlock :call s:AngularRunSpecBlock() autocmd FileType javascript nnoremap rs :AngularRunSpec autocmd FileType javascript nnoremap rb :AngularRunSpecBlock augroup END