diff --git a/autoload/magit/sign.vim b/autoload/magit/sign.vim index f979d8b118fc60176d35121f6f4fcc94f06ad0bb..646347a938d2d11cd0daf162a793dda10c5a8d25 100644 --- a/autoload/magit/sign.vim +++ b/autoload/magit/sign.vim @@ -19,11 +19,22 @@ let s:bufnr = bufnr(g:magit_buffer_name) function! magit#sign#remove_signs(sign_ids) let bufnr = magit#utils#bufnr() for sign in values(a:sign_ids) - echom "sign unplace" sign.id execute "sign unplace" sign.id endfor endfunction +function! magit#sign#add_sign(line, type, bufnr) + let id = <SID>get_next_sign_id() + execute ":sign place " . id . + \ " line=" . a:line . " name=" . s:magit_mark_signs[a:type] . + \ " buffer=" . a:bufnr + return id +endfunction + +function! magit#sign#remove_sign(id) + execute ":sign unplace " . a:id +endfunction + " s:get_next_sign_id: helper function to increment sign ids function! s:get_next_sign_id() let next_id = s:next_sign_id @@ -65,31 +76,32 @@ endfunction " param[in] startline,endline: range of lines " return Dict of marked lines function! magit#sign#find_stage_signs(startline, endline) - return magit#sign#find_signs(s:magit_mark_sign, a:startline, a:endline) + return magit#sign#find_signs(s:magit_mark_signs.M, a:startline, a:endline) endfunction " s:magit_mark_sign: string of the sign for lines to be staged -let s:magit_mark_sign='MagitMark' +let s:magit_mark_signs = {'M': 'MagitTBS', 'S': 'MagitBS', 'E': 'MagitBE'} " magit#sign#init: initializer function for signs function! magit#sign#init() - execute "sign define " . s:magit_mark_sign . " text=S> linehl=Visual" + execute "sign define " . s:magit_mark_signs.M . " text=S> linehl=Visual" + execute "sign define " . s:magit_mark_signs.S + execute "sign define " . s:magit_mark_signs.E endfunction " magit#sign#toggle_signs: toggle marks for range of lines " marked lines are unmarked, non marked are marked +" param[in] type; type of sign to toggle (see s:magit_mark_signs) " param[in] startline,endline: range of lines -function! magit#sign#toggle_signs(startline, endline) +function! magit#sign#toggle_signs(type, startline, endline) let bufnr = magit#utils#bufnr() - let current_signs = magit#sign#find_signs(s:magit_mark_sign, a:startline, a:endline) + let current_signs = magit#sign#find_signs(s:magit_mark_signs[a:type], a:startline, a:endline) let line = a:startline while ( line <= a:endline ) if ( has_key(current_signs, line) == 0 ) - execute ":sign place " . <SID>get_next_sign_id() . - \ " line=" . line . " name=" . s:magit_mark_sign . - \ " buffer=" . bufnr + call magit#sign#add_sign(line, a:type, bufnr) else - execute ":sign unplace " . current_signs[line].id + call magit#sign#remove_sign(current_signs[line].id) endif let line += 1 endwhile diff --git a/plugin/magit.vim b/plugin/magit.vim index 30314494705aedff505f3534ea096d7d517199ec..192dc27d9ae6f01e6deae96de09006f9abef50a2 100644 --- a/plugin/magit.vim +++ b/plugin/magit.vim @@ -489,7 +489,7 @@ function! s:mg_mark_lines_in_hunk(start_select_line, end_select_line) if ( a:start_select_line < starthunk || a:end_select_line > endhunk ) throw 'out of hunk selection' endif - return magit#sign#toggle_signs(a:start_select_line, a:end_select_line) + return magit#sign#toggle_signs('M', a:start_select_line, a:end_select_line) endfunction " s:mg_get_section: helper function to get the current section, according to