" Author: w0rp " Description: gcc for Fortran files " This option can be set to 0 to use -ffixed-form call ale#Set('fortran_gcc_use_free_form', 1) call ale#Set('fortran_gcc_executable', 'gcc') " Set this option to change the GCC options for warnings for Fortran. call ale#Set('fortran_gcc_options', '-Wall') function! ale_linters#fortran#gcc#Handle(buffer, lines) abort " We have to match a starting line and a later ending line together, " like so. " " :21.34: " Error: Expected comma in I/O list at (1) let l:line_marker_pattern = ':\(\d\+\)[.:]\=\(\d\+\)\=:\=$' let l:message_pattern = '^\(Error\|Warning\): \(.\+\)$' let l:looking_for_message = 0 let l:last_loclist_obj = {} let l:output = [] for l:line in a:lines if l:looking_for_message let l:match = matchlist(l:line, l:message_pattern) else let l:match = matchlist(l:line, l:line_marker_pattern) endif if len(l:match) == 0 continue endif if l:looking_for_message let l:looking_for_message = 0 " Now we have the text, we can set it and add the error. let l:last_loclist_obj.text = l:match[2] let l:last_loclist_obj.type = l:match[1] is# 'Warning' ? 'W' : 'E' call add(l:output, l:last_loclist_obj) else let l:last_loclist_obj = { \ 'bufnr': a:buffer, \ 'lnum': l:match[1] + 0, \ 'col': l:match[2] + 0, \} " Start looking for the message and error type. let l:looking_for_message = 1 endif endfor return l:output endfunction function! ale_linters#fortran#gcc#GetCommand(buffer) abort let l:layout_option = ale#Var(a:buffer, 'fortran_gcc_use_free_form') \ ? '-ffree-form' \ : '-ffixed-form' return '%e -S -x f95 -fsyntax-only ' . l:layout_option \ . ale#Pad(ale#Var(a:buffer, 'fortran_gcc_options')) \ . ' -' endfunction call ale#linter#Define('fortran', { \ 'name': 'gcc', \ 'output_stream': 'stderr', \ 'executable': {b -> ale#Var(b, 'fortran_gcc_executable')}, \ 'command': function('ale_linters#fortran#gcc#GetCommand'), \ 'callback': 'ale_linters#fortran#gcc#Handle', \})