diff --git a/autoload/doge.vim b/autoload/doge.vim index 97ac69c2..297c592a 100644 --- a/autoload/doge.vim +++ b/autoload/doge.vim @@ -108,5 +108,29 @@ function! doge#command_complete(...) abort return filter(copy(get(b:, 'doge_supported_doc_standards', [])), "v:val =~ '^'.a:1") endfunction +"" +" @public +" This function will be triggered on the FileType autocmd and will remove +" conflicting doc standards from the previous filetype. +function! doge#on_filetype_change() abort + if !exists('b:doge_prev_supported_doc_standards') && exists('b:doge_supported_doc_standards') + " Save the current supported doc standards + let b:doge_prev_supported_doc_standards = copy(get(b:, 'doge_supported_doc_standards', [])) + elseif exists('b:doge_prev_supported_doc_standards') && exists('b:doge_supported_doc_standards') + " Remove all the doc standards from the previous filetype. + for l:doc in get(b:, 'doge_prev_supported_doc_standards', []) + if has_key(get(b:, 'doge_patterns', {}), l:doc) + unlet b:doge_patterns[l:doc] + endif + + let l:doc_idx = index(get(b:, 'doge_supported_doc_standards', []), l:doc) + if l:doc_idx >= 0 + call remove(b:doge_supported_doc_standards, l:doc_idx) + endif + endfor + let b:doge_prev_supported_doc_standards = copy(b:doge_supported_doc_standards) + endif +endfunction + let &cpoptions = s:save_cpo unlet s:save_cpo diff --git a/doc/doge.txt b/doc/doge.txt index df4ce7a7..bbf71ca7 100644 --- a/doc/doge.txt +++ b/doc/doge.txt @@ -110,6 +110,10 @@ doge#deactivate() *doge#deactivate()* doge#command_complete() *doge#command_complete()* Return a list of supported doc standards for the current buffer. +doge#on_filetype_change() *doge#on_filetype_change()* + This function will be triggered on the FileType autocmd and will remove + conflicting doc standards from the previous filetype. + doge#buffer#get_supported_doc_standards({defaults}) *doge#buffer#get_supported_doc_standards()* 'defaults': A list of supported doc standards that should be allowed. diff --git a/doc/tags b/doc/tags index 3cc34e56..0fc0208d 100644 --- a/doc/tags +++ b/doc/tags @@ -19,6 +19,7 @@ doge#helpers#keyseq() doge.txt /*doge#helpers#keyseq()* doge#helpers#placeholder() doge.txt /*doge#helpers#placeholder()* doge#helpers#trim() doge.txt /*doge#helpers#trim()* doge#indent#add() doge.txt /*doge#indent#add()* +doge#on_filetype_change() doge.txt /*doge#on_filetype_change()* doge#pattern#custom() doge.txt /*doge#pattern#custom()* doge#pattern#generate() doge.txt /*doge#pattern#generate()* doge#python#file() doge.txt /*doge#python#file()* diff --git a/plugin/doge.vim b/plugin/doge.vim index 408ae799..f38c3ece 100644 --- a/plugin/doge.vim +++ b/plugin/doge.vim @@ -171,6 +171,7 @@ augroup doge autocmd TextChangedI * call doge#comment#update_interactive_comment_info() autocmd InsertLeave * call doge#comment#deactivate_when_done() autocmd TextChanged * call doge#comment#deactivate_when_done() + autocmd FileType * call doge#on_filetype_change() augroup END let &cpoptions = s:save_cpo diff --git a/test/autocmd-filetype.vader b/test/autocmd-filetype.vader new file mode 100644 index 00000000..db375c1d --- /dev/null +++ b/test/autocmd-filetype.vader @@ -0,0 +1,26 @@ +# ============================================================================== +# Switch from PHP to JavaScript and make sure doc standards of PHP get removed. +# ============================================================================== + +Execute (switch from PHP to JavaScript): + setfiletype php + AssertEqual exists('b:doge_prev_supported_doc_standards'), 1 + AssertEqual has_key(b:doge_patterns, 'phpdoc'), 1 + AssertEqual has_key(b:doge_patterns, 'jsdoc'), 0 + + Assert index(b:doge_supported_doc_standards, 'phpdoc') >= 0 + Assert index(b:doge_supported_doc_standards, 'jsdoc') < 0 + + Assert index(b:doge_prev_supported_doc_standards, 'phpdoc') >= 0 + Assert index(b:doge_prev_supported_doc_standards, 'jsdoc') < 0 + +# Change to JavaScript and make sure the phpdoc gets removed. + setfiletype javascript + AssertEqual 0, has_key(b:doge_patterns, 'phpdoc') + AssertEqual 1, has_key(b:doge_patterns, 'jsdoc') + + Assert index(b:doge_supported_doc_standards, 'phpdoc') < 0 + Assert index(b:doge_supported_doc_standards, 'jsdoc') >= 0 + + Assert index(b:doge_prev_supported_doc_standards, 'phpdoc') < 0 + Assert index(b:doge_prev_supported_doc_standards, 'jsdoc') >= 0