diff --git a/plugin/scriptease.vim b/plugin/scriptease.vim index 2fc2888..9fa626f 100644 --- a/plugin/scriptease.vim +++ b/plugin/scriptease.vim @@ -507,10 +507,10 @@ augroup scriptease_breakadd autocmd! autocmd FileType vim command! \ -buffer -bar -nargs=? -complete=custom,s:Complete_breakadd Breakadd - \ :exe s:break('add',) + \ :exe s:break('add',) | :call s:show_breakpoint_signs() autocmd FileType vim command! \ -buffer -bar -nargs=? -complete=custom,s:Complete_breakdel Breakdel - \ :exe s:break('del',) + \ :exe s:break('del',) | :call s:show_breakpoint_signs() augroup END function! s:breaksnr(arg) abort @@ -786,4 +786,75 @@ augroup END " }}}1 +function! s:to_function_name(symbol) + let result = matchstr(a:symbol, '^.*\d\+_\zs.*\ze$') + return empty(result) ? a:symbol : result +endfunction + +function! s:to_SID(symbol) + return matchstr(a:symbol, '^.*\zs\d\+\ze_.*$') +endfunction + +let s:sign_name = 'scriptease_break' +" ID number of the next sign to place +let s:sign_id = 17607 +execute 'sign define ' . s:sign_name . ' texthl=ErrorMsg text=>>' + +function! s:show_breakpoint_signs() + sign unplace * + " get output of :breaklist + redir => result + silent execute 'breaklist' + redir END + if result =~# 'No breakpoints defined' + return + endif + " make breakpoint list + let l:blist = [] + for bstr in split(result, '\n') + let bcols = split(bstr) + let bentry = { 'type' : bcols[1], 'line' : bcols[4] } + if bentry['type'] ==# 'file' + " set fullpath of the file + let bentry['file'] = expand(bcols[2]) + elseif bentry['type'] ==# 'func' + " set SID and function name + let bentry['func'] = { 'SID': s:to_SID(bcols[2]), 'name': s:to_function_name(bcols[2]) } + endif + call add(l:blist, l:bentry) + endfor + " PPmsg l:blist + for be in l:blist + if be['type'] ==# 'file' + " place sign to the file + execute 'sign place ' . s:sign_id . ' line=' . be['line'] . ' name=' . s:sign_name . ' file=' . be['file'] + " PPmsg 'sign place ' . s:sign_id . ' line=' . be['line'] . ' name=' . s:sign_name . ' file=' . be['file'] + elseif be['type'] ==# 'func' + if empty(be['func']['SID']) + " search global function and place sign + " PPmsg '\v^\s*fu%[nction]>.*' . be['func']['name'] + let l:lnum = search('\v^\s*fu%[nction]>.*' . be['func']['name'], 'n') + if l:lnum != 0 + execute 'sign place ' . s:sign_id . ' line=' . (l:lnum + be['line']) . ' name=' . s:sign_name . ' file=' . expand('%:p') + " PPmsg 'sign place ' . s:sign_id . ' line=' . l:lnum + be['line'] . ' name=' . s:sign_name . ' file=' . expand('%:p') + endif + elseif be['func']['SID'] !=# scriptease#scriptid('%') + " the script-local function is not of this file + continue + else + " search script-local function and place sign + " PPmsg '\v^\s*fu%[nction]>.*<(s:|\).*' . be['func']['name'] + let l:lnum = search('\v^\s*fu%[nction]>.*<(s:|\).*' . be['func']['name'], 'n') + if l:lnum != 0 + execute 'sign place ' . s:sign_id . ' line=' . (l:lnum + be['line']) . ' name=' . s:sign_name . ' file=' . expand('%:p') + " PPmsg 'sign place ' . s:sign_id . ' line=' . l:lnum + be['line'] . ' name=' . s:sign_name . ' file=' . expand('%:p') + endif + endif + endif + let s:sign_id += 1 + endfor +endfunction + +autocmd BufEnter vim call s:show_breakpoint_signs() + " vim:set et sw=2: