diff --git a/editors/vim/README.md b/editors/vim/README.md index 1bfc3e3..db72549 100644 --- a/editors/vim/README.md +++ b/editors/vim/README.md @@ -56,6 +56,12 @@ Use `DCDclearCache` to clear the DCD server cache. When the server is running, use `CTRL`+`x` `CTRL`+`o` in a D buffer to use DCD completion. +When the server is running, use the `DCDdoc` to print the doc-string of symbol +under the cursor. + +When the server is running, use the `DCDsymbolLocation` to print jump to the +declaration of the symbol under the cursor. + Conflicts ========= This plugin conflicts with the DScanner plugin, as both use the `dcomplete` diff --git a/editors/vim/autoload/dcomplete.vim b/editors/vim/autoload/dcomplete.vim index 0d337e7..333c775 100644 --- a/editors/vim/autoload/dcomplete.vim +++ b/editors/vim/autoload/dcomplete.vim @@ -1,6 +1,8 @@ "The completion function function! dcomplete#Complete(findstart,base) if a:findstart + "Vim temporarily deletes the current identifier from the file + let b:currentLineText=getline('.') "We might need it for paren completion: let b:closingParenExists=getline('.')[col('.')-1:-1]=~'^\s*)' @@ -15,7 +17,7 @@ function! dcomplete#Complete(findstart,base) let parenPos=searchpos("(","bn",line('.')) if parenPos[0] if getline('.')[parenPos[1]:col('.')-2]=~'^\s*\w*$' - let b:completionColumn=parenPos[1] + let b:completionColumn=parenPos[1]+1 return parenPos[1] endif endif @@ -35,7 +37,10 @@ function! dcomplete#Complete(findstart,base) else let b:base=a:base "Run DCD + let l:prevCurrentLineText=getline('.') + call setline('.',b:currentLineText) let scanResult=s:runDCDToGetAutocompletion() + call setline('.',l:prevCurrentLineText) "Split the result text to lines. let resultLines=split(scanResult,"\n") let b:res=resultLines @@ -94,15 +99,48 @@ endfunction "Run DCD to get autocompletion results function! s:runDCDToGetAutocompletion() + return s:runDCDOnBufferBytePosition(line2byte('.')+b:completionColumn-2,'') +endfunction +"Run DCD on the current position in the buffer +function! dcomplete#runDCDOnCurrentBufferPosition(args) + return s:runDCDOnBufferBytePosition(line2byte('.')+col('.')-1,a:args) +endfunction + +"Find where the symbol under the cursor is declared and jump there +function! dcomplete#runDCDtoJumpToSymbolLocation() + let l:scanResult=split(s:runDCDOnBufferBytePosition(line2byte('.')+col('.')-1,'--symbolLocation'),"\n")[0] + let l:resultParts=split(l:scanResult,"\t") + if 2!=len(l:resultParts) + echo 'Not found!' + return + endif + + if l:resultParts[0]!='stdin' + execute 'edit '.l:resultParts[0] + endif + + let l:symbolByteLocation=str2nr(l:resultParts[1]) + if l:symbolByteLocation<1 + echo 'Not found!' + return + endif + + execute 'goto '.(l:symbolByteLocation+1) +endfunction + +"Run DCD on the current buffer with the supplied position +function! s:runDCDOnBufferBytePosition(bytePosition,args) let l:tmpFileName=tempname() "Save the temp file in unix format for better reading of byte position. let l:oldFileFormat=&fileformat set fileformat=unix - let l:bytePosition=line2byte('.')+b:completionColumn-1 - exec "write ".l:tmpFileName + silent exec "write ".l:tmpFileName let &fileformat=l:oldFileFormat - let scanResult=system(dcomplete#DCDclient().' --cursorPos '.l:bytePosition.' <'.shellescape(l:tmpFileName)) + let scanResult=system(dcomplete#DCDclient().' '.a:args.' --cursorPos='.a:bytePosition.' <'.shellescape(l:tmpFileName)) + if v:shell_error + throw scanResult + endif call delete(l:tmpFileName) return scanResult endfunction diff --git a/editors/vim/ftplugin/d.vim b/editors/vim/ftplugin/d.vim index ba5bc2e..222de1d 100644 --- a/editors/vim/ftplugin/d.vim +++ b/editors/vim/ftplugin/d.vim @@ -8,6 +8,10 @@ else \ ' '.dcomplete#globImportPath([]).' > /dev/null &' endif command! -buffer -nargs=? DCD execute '!'.dcomplete#DCDclient().' '. +command! -buffer -nargs=? DCDonCurrentBufferPosition echo dcomplete#runDCDOnCurrentBufferPosition() command! -buffer DCDstopServer DCD --shutdown command! -buffer -nargs=+ -complete=dir DCDaddPath execute 'DCD '.dcomplete#globImportPath([]) command! -buffer DCDclearCache DCD --clearCache + +command! -buffer DCDdoc DCDonCurrentBufferPosition --doc +command! -buffer DCDsymbolLocation call dcomplete#runDCDtoJumpToSymbolLocation()