diff --git a/autoload/tagbar.vim b/autoload/tagbar.vim index 25a3b34..b65d358 100644 --- a/autoload/tagbar.vim +++ b/autoload/tagbar.vim @@ -999,11 +999,12 @@ function! s:MapKeys() abort \ ['nextfold', 'GotoNextFold()'], \ ['prevfold', 'GotoPrevFold()'], \ - \ ['togglesort', 'ToggleSort()'], - \ ['toggleautoclose', 'ToggleAutoclose()'], - \ ['zoomwin', 'ZoomWindow()'], - \ ['close', 'CloseWindow()'], - \ ['help', 'ToggleHelp()'], + \ ['togglesort', 'ToggleSort()'], + \ ['togglecaseinsensitive', 'ToggleCaseInsensitive()'], + \ ['toggleautoclose', 'ToggleAutoclose()'], + \ ['zoomwin', 'ZoomWindow()'], + \ ['close', 'CloseWindow()'], + \ ['help', 'ToggleHelp()'], \ ] for [map, func] in maps @@ -2616,7 +2617,8 @@ function! s:CompareByKind(tag1, tag2) abort let name2 = a:tag2.name endif - if name1 <=# name2 + let ci = g:tagbar_case_insensitive + if (((!ci) && (name1 <=# name2)) || (ci && (name1 <=? name2))) return -1 else return 1 @@ -2927,6 +2929,7 @@ function! s:PrintHelp() abort silent put ='\"' silent put ='\" ---------- Misc -----------' silent put ='\" ' . s:get_map_str('togglesort') . ': Toggle sort' + silent put ='\" ' . s:get_map_str('togglecaseinsensitive') . ': Toggle case insensitive sort option' silent put ='\" ' . s:get_map_str('toggleautoclose') . ': Toggle autoclose option' silent put ='\" ' . s:get_map_str('zoomwin') . ': Zoom window in/out' silent put ='\" ' . s:get_map_str('close') . ': Close window' @@ -3880,6 +3883,35 @@ function! s:ToggleHideNonPublicTags() abort endif endfunction +" s:ToggleCaseInsensitive() {{{2 +function! s:ToggleCaseInsensitive() abort + let fileinfo = s:known_files.getCurrent(0) + if empty(fileinfo) + return + endif + + " Save the tag the cursor is currently on + let curline = line('.') + let taginfo = s:GetTagInfo(curline, 0) + + match none + + let g:tagbar_case_insensitive = !g:tagbar_case_insensitive + + call fileinfo.sortTags() + + call s:RenderKeepView() + call s:SetStatusLine('current') + + " If we were on a tag before sorting then jump to it, otherwise restore + " the cursor to the current line + if !empty(taginfo) + execute taginfo.tline + else + execute curline + endif +endfunction + " s:ToggleAutoclose() {{{2 function! s:ToggleAutoclose() abort let g:tagbar_autoclose = !g:tagbar_autoclose @@ -3950,6 +3982,7 @@ function! s:SetStatusLine(current) let flags = [] let flags += exists('w:autoclose') && w:autoclose ? ['c'] : [] let flags += g:tagbar_autoclose ? ['C'] : [] + let flags += (g:tagbar_sort && g:tagbar_case_insensitive) ? ['i'] : [] let flags += g:tagbar_hide_nonpublic ? ['v'] : [] if exists('g:tagbar_status_func') diff --git a/doc/tagbar.txt b/doc/tagbar.txt index 898cdcc..b9a11d6 100644 --- a/doc/tagbar.txt +++ b/doc/tagbar.txt @@ -481,6 +481,18 @@ Example: let g:tagbar_sort = 0 < + *g:tagbar_case_insensitive* +g:tagbar_case_insensitive~ +Default: 0 + +If this option is set a case-insensitive comparison is used when the tags +are sorted according to their name. If it is unset a case-sensitive +comparison is used. + +Example: +> + let g:tagbar_case_insensitive = 1 +< *g:tagbar_compact* g:tagbar_compact~ Default: 0 diff --git a/plugin/tagbar.vim b/plugin/tagbar.vim index a852357..d2cd175 100644 --- a/plugin/tagbar.vim +++ b/plugin/tagbar.vim @@ -59,6 +59,7 @@ function! s:setup_options() abort \ ['autofocus', 0], \ ['autopreview', 0], \ ['autoshowtag', 0], + \ ['case_insensitive', 0], \ ['compact', 0], \ ['expand', 0], \ ['foldlevel', 99], @@ -109,11 +110,12 @@ function! s:setup_keymaps() abort \ ['nextfold', 'zj'], \ ['prevfold', 'zk'], \ - \ ['togglesort', 's'], - \ ['toggleautoclose', 'c'], - \ ['zoomwin', 'x'], - \ ['close', 'q'], - \ ['help', ['', '?']], + \ ['togglesort', 's'], + \ ['togglecaseinsensitive', 'i'], + \ ['toggleautoclose', 'c'], + \ ['zoomwin', 'x'], + \ ['close', 'q'], + \ ['help', ['', '?']], \ ] for [map, key] in keymaps