diff options
author | Tom Ryder <tom@sanctum.geek.nz> | 2018-06-25 13:53:32 +1200 |
---|---|---|
committer | Tom Ryder <tom@sanctum.geek.nz> | 2018-06-25 13:53:32 +1200 |
commit | 5f73fa74a27145830177d4c9e24223efd70c222c (patch) | |
tree | 99472dc35e4d7a329ba36a76b61fdbeff7009b93 /vim/autoload | |
parent | Upgrade fixed_join.vim, define map explicitly (diff) | |
download | dotfiles-5f73fa74a27145830177d4c9e24223efd70c222c.tar.gz dotfiles-5f73fa74a27145830177d4c9e24223efd70c222c.zip |
Clear local leader maps on filetype change
Iterate through all the buffer-local mappings each time the filetype
changes, and clear any that begin with the local leader, using two
autoloaded functions and one autoload variable for :redir.
I really don't think it should be this hard. I hope I haven't missed
something in the documentation that makes this easier. I thought
maparg() or mapcheck() might do it, but no such luck.
Maybe I can refactor this later.
Diffstat (limited to 'vim/autoload')
-rw-r--r-- | vim/autoload/vimrc.vim | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/vim/autoload/vimrc.vim b/vim/autoload/vimrc.vim new file mode 100644 index 00000000..eaeefd5d --- /dev/null +++ b/vim/autoload/vimrc.vim @@ -0,0 +1,39 @@ +" Get all buffer-local mappings into a string variable +function! vimrc#GetBufferLocalMaps() abort + redir => l:out + map <buffer> + redir END + let g:vimrc#buffer_local_maps = l:out +endfunction + +" Clear all buffer-local mappings beginning with <LocalLeader> +function! vimrc#ClearLocalLeaderMaps() 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 vimrc#GetBufferLocalMaps() + let l:mappings = split(g:vimrc#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 |