From d94bdb6f88ae73bacce945dac70467a57aedffac Mon Sep 17 00:00:00 2001 From: sisynb Date: Tue, 15 Mar 2022 10:34:54 +0800 Subject: [PATCH] feat(mapping): add `gD` to go to declaration --- autoload/SpaceVim/layers/lang/c.vim | 15 ++++++++++++++- autoload/SpaceVim/mapping.vim | 8 ++++++++ autoload/SpaceVim/mapping/g.vim | 4 +++- autoload/SpaceVim/mapping/g_capital_d.vim | 16 ++++++++++++++++ 4 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 autoload/SpaceVim/mapping/g_capital_d.vim diff --git a/autoload/SpaceVim/layers/lang/c.vim b/autoload/SpaceVim/layers/lang/c.vim index 6f04e4b8d..a7dd9c5e5 100644 --- a/autoload/SpaceVim/layers/lang/c.vim +++ b/autoload/SpaceVim/layers/lang/c.vim @@ -150,6 +150,10 @@ endfunction " config {{{ function! SpaceVim#layers#lang#c#config() abort + call SpaceVim#mapping#g_capital_d#add('c', + \ function('s:go_to_declaration')) + call SpaceVim#mapping#g_capital_d#add('cpp', + \ function('s:go_to_declaration')) call SpaceVim#mapping#gd#add('c', \ function('s:go_to_def')) call SpaceVim#mapping#gd#add('cpp', @@ -309,7 +313,6 @@ function! s:language_specified_mappings() abort \ 'call SpaceVim#lsp#go_to_typedef()', 'type definition', 1) call SpaceVim#mapping#space#langSPC('nnoremap', ['l', 'R'], \ 'call SpaceVim#lsp#refactor()', 'refactor', 1) - " TODO this should be gD call SpaceVim#mapping#space#langSPC('nnoremap', ['l', 'D'], \ 'call SpaceVim#lsp#go_to_declaration()', 'declaration', 1) @@ -452,6 +455,16 @@ function! s:update_neoinclude(argv, fts) abort endfunction " }}} +" local function: go_to_declaration {{{ +function! s:go_to_declaration() abort + if !SpaceVim#layers#lsp#check_filetype(&ft) + execute "norm! g\" + else + call SpaceVim#lsp#go_to_declaration() + endif +endfunction +" }}} + " local function: go_to_def {{{ function! s:go_to_def() abort if !SpaceVim#layers#lsp#check_filetype(&ft) diff --git a/autoload/SpaceVim/mapping.vim b/autoload/SpaceVim/mapping.vim index d7011d165..a402b2f1e 100644 --- a/autoload/SpaceVim/mapping.vim +++ b/autoload/SpaceVim/mapping.vim @@ -106,6 +106,14 @@ function! SpaceVim#mapping#enter() abort return SpaceVim#mapping#enter#i_enter() endfunction +function! SpaceVim#mapping#g_capital_d() abort + if !empty(SpaceVim#mapping#g_capital_d#get()) + call call(SpaceVim#mapping#g_capital_d#get(), []) + else + normal! gD + endif +endfunction + function! SpaceVim#mapping#gd() abort if !empty(SpaceVim#mapping#gd#get()) call call(SpaceVim#mapping#gd#get(), []) diff --git a/autoload/SpaceVim/mapping/g.vim b/autoload/SpaceVim/mapping/g.vim index e89b9b7a0..1a15fd2a4 100644 --- a/autoload/SpaceVim/mapping/g.vim +++ b/autoload/SpaceVim/mapping/g.vim @@ -107,8 +107,10 @@ function! SpaceVim#mapping#g#init() abort nnoremap gv gv let g:_spacevim_mappings_g[''] = ['call feedkeys("g", "n")', 'jump-to-tag-under-cursor'] nnoremap g g + let g:_spacevim_mappings_g['D'] = ['call SpaceVim#mapping#g_capital_d()', 'goto-declaration'] + call SpaceVim#mapping#def('nnoremap ', 'gD', ':call SpaceVim#mapping#g_capital_d()', 'Goto declaration', '') let g:_spacevim_mappings_g['d'] = ['call SpaceVim#mapping#gd()', 'goto-definition'] - call SpaceVim#mapping#def('nnoremap ', 'gd', ':call SpaceVim#mapping#gd()', 'Goto declaration', '') + call SpaceVim#mapping#def('nnoremap ', 'gd', ':call SpaceVim#mapping#gd()', 'Goto definition', '') let g:_spacevim_mappings_g['='] = ['call SpaceVim#mapping#format()', 'format-current-buffer'] call SpaceVim#mapping#def('nnoremap ','g=',':call SpaceVim#mapping#format()','format current buffer','call SpaceVim#mapping#format()') diff --git a/autoload/SpaceVim/mapping/g_capital_d.vim b/autoload/SpaceVim/mapping/g_capital_d.vim new file mode 100644 index 000000000..ad671f5d7 --- /dev/null +++ b/autoload/SpaceVim/mapping/g_capital_d.vim @@ -0,0 +1,16 @@ +"============================================================================= +" g_capital_d.vim --- gD key binding +" Copyright (c) 2016-2022 Wang Shidong & Contributors +" Author: sisynb < bsixxxx at gmail.com > +" URL: https://spacevim.org +" License: GPLv3 +"============================================================================= + +let s:g_capital_d = {} +function! SpaceVim#mapping#g_capital_d#add(ft, func) abort + call extend(s:g_capital_d,{a:ft : a:func}) +endfunction + +function! SpaceVim#mapping#g_capital_d#get() abort + return get(s:g_capital_d, &filetype, '') +endfunction