aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.vim/after/plugin/youcompleteme.vim8
-rw-r--r--.vim/plugin/util.vim36
2 files changed, 40 insertions, 4 deletions
diff --git a/.vim/after/plugin/youcompleteme.vim b/.vim/after/plugin/youcompleteme.vim
index b4e30a8..1c30617 100644
--- a/.vim/after/plugin/youcompleteme.vim
+++ b/.vim/after/plugin/youcompleteme.vim
@@ -33,10 +33,10 @@ let g:ycm_filetype_blacklist = {
\ 'vimwiki': 1,
\ }
-nnoremap gd :YcmCompleter GoTo<CR>
-nnoremap gy :YcmCompleter GoToType<CR>
-nnoremap gr :YcmCompleter GoToReferences<CR>
-nnoremap gi :YcmCompleter GoToImplementation<CR>
+nnoremap gd :call PushTagStackOnCommand('YcmCompleter GoTo')<CR>
+nnoremap gy :call PushTagStackOnCommand('YcmCompleter GoToType')<CR>
+nnoremap gr :call PushTagStackOnCommand('YcmCompleter GoToReferences')<CR>
+nnoremap gi :call PushTagStackOnCommand('YcmCompleter GoToImplementation')<CR>
nnoremap <leader>rn :YcmCompleter RefactorRename<space>
nmap <leader>fs <plug>(YCMFindSymbolInDocument)
nmap <leader>fS <plug>(YCMFindSymbolInWorkspace)
diff --git a/.vim/plugin/util.vim b/.vim/plugin/util.vim
new file mode 100644
index 0000000..de2dadd
--- /dev/null
+++ b/.vim/plugin/util.vim
@@ -0,0 +1,36 @@
+function! PushTagStackOnCommand(command_name) abort
+ call s:PushTagStackBefore()
+ exec a:command_name
+ call s:PushTagStackAfter()
+endfunction
+
+function! PushTagStackOnFunction(function_name) abort
+ call s:PushTagStackBefore()
+ call a:function_name()
+ call s:PushTagStackAfter()
+endfunction
+
+function! s:PushTagStackBefore() abort
+ let dotag = &tagstack && exists('*gettagstack') && exists('*settagstack')
+ if dotag
+ let from = [bufnr('%'), line('.'), col('.'), 0]
+ let tagname = expand('<cword>')
+ let stack = gettagstack()
+ if stack.curidx > 1
+ let stack.items = stack.items[0:stack.curidx-2]
+ else
+ let stack.items = []
+ endif
+ let stack.items += [{'from': from, 'tagname': tagname}]
+ let stack.curidx = len(stack.items)
+ call settagstack(win_getid(), stack)
+ endif
+endfunction
+
+function! s:PushTagStackAfter() abort
+ let dotag = &tagstack && exists('*gettagstack') && exists('*settagstack')
+ if dotag
+ let curidx = gettagstack().curidx + 1
+ call settagstack(win_getid(), {'curidx': curidx})
+ endif
+endfunction