diff options
Diffstat (limited to 'autoload/clear_local_maps.vim')
-rw-r--r-- | autoload/clear_local_maps.vim | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/autoload/clear_local_maps.vim b/autoload/clear_local_maps.vim new file mode 100644 index 0000000..1668dfb --- /dev/null +++ b/autoload/clear_local_maps.vim @@ -0,0 +1,44 @@ +" Get all buffer-local mappings into a string variable +function! clear_local_maps#GetBufferLocalMaps() abort + redir => l:out + map <buffer> + redir END + let g:clear_local_maps#buffer_local_maps = l:out +endfunction + +" Clear all buffer-local mappings beginning with <LocalLeader> +function! clear_local_maps#ClearBufferLocalLeaderMaps() abort + + " Do nothing if there isn't a defined local leader + if !exists('g:maplocalleader') + return + endif + + " Get all the buffer-local mappings into a list + silent call clear_local_maps#GetBufferLocalMaps() + let l:mappings = split(g:clear_local_maps#buffer_local_maps, '\n') + + " Iterate through the mappings + for l:mapping in l:mappings + + " Match the list mapping and mode; skip if no match + let l:matchlist = matchlist(l:mapping, '\m\C^\(.\)\s\+\(\S\+\)') + if !len(l:matchlist) + continue + endif + let l:mode = l:matchlist[1] + let l:sequence = l:matchlist[2] + + " If the mapping starts with our local leader, clear it + if stridx(l:sequence, g:maplocalleader) == 0 + execute l:mode.'unmap <buffer> '.l:sequence + endif + + endfor + +endfunction + +" Wrapper around ClearLocalMaps with a shorter name +function! clear_local_maps#Clear() abort + call clear_local_maps#ClearBufferLocalLeaderMaps() +endfunction |