Fixed a bug with completion of "free" identifiers.
Turn out that when doing autocomple, Vim temporarily erases the completed part from the buffer lines, so when I'm trying to write to buffer lines to a temporary file the get written without that part, and DCD can't read it. Worked around it by storing that line beforehand(in the first call to the completion function) and resetting the buffer before writing it to the temp file.
This commit is contained in:
parent
5077cd49d3
commit
d6930becc6
|
@ -1,6 +1,8 @@
|
||||||
"The completion function
|
"The completion function
|
||||||
function! dcomplete#Complete(findstart,base)
|
function! dcomplete#Complete(findstart,base)
|
||||||
if a:findstart
|
if a:findstart
|
||||||
|
"Vim temporarily deletes the current identifier from the file
|
||||||
|
let b:currentLineText=getline('.')
|
||||||
|
|
||||||
"We might need it for paren completion:
|
"We might need it for paren completion:
|
||||||
let b:closingParenExists=getline('.')[col('.')-1:-1]=~'^\s*)'
|
let b:closingParenExists=getline('.')[col('.')-1:-1]=~'^\s*)'
|
||||||
|
@ -15,7 +17,7 @@ function! dcomplete#Complete(findstart,base)
|
||||||
let parenPos=searchpos("(","bn",line('.'))
|
let parenPos=searchpos("(","bn",line('.'))
|
||||||
if parenPos[0]
|
if parenPos[0]
|
||||||
if getline('.')[parenPos[1]:col('.')-2]=~'^\s*\w*$'
|
if getline('.')[parenPos[1]:col('.')-2]=~'^\s*\w*$'
|
||||||
let b:completionColumn=parenPos[1]
|
let b:completionColumn=parenPos[1]+1
|
||||||
return parenPos[1]
|
return parenPos[1]
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
@ -35,7 +37,10 @@ function! dcomplete#Complete(findstart,base)
|
||||||
else
|
else
|
||||||
let b:base=a:base
|
let b:base=a:base
|
||||||
"Run DCD
|
"Run DCD
|
||||||
|
let l:prevCurrentLineText=getline('.')
|
||||||
|
call setline('.',b:currentLineText)
|
||||||
let scanResult=s:runDCDToGetAutocompletion()
|
let scanResult=s:runDCDToGetAutocompletion()
|
||||||
|
call setline('.',l:prevCurrentLineText)
|
||||||
"Split the result text to lines.
|
"Split the result text to lines.
|
||||||
let resultLines=split(scanResult,"\n")
|
let resultLines=split(scanResult,"\n")
|
||||||
let b:res=resultLines
|
let b:res=resultLines
|
||||||
|
@ -94,15 +99,23 @@ endfunction
|
||||||
|
|
||||||
"Run DCD to get autocompletion results
|
"Run DCD to get autocompletion results
|
||||||
function! s:runDCDToGetAutocompletion()
|
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
|
||||||
|
|
||||||
|
"Run DCD on the current buffer with the supplied position
|
||||||
|
function! s:runDCDOnBufferBytePosition(bytePosition,args)
|
||||||
let l:tmpFileName=tempname()
|
let l:tmpFileName=tempname()
|
||||||
"Save the temp file in unix format for better reading of byte position.
|
"Save the temp file in unix format for better reading of byte position.
|
||||||
let l:oldFileFormat=&fileformat
|
let l:oldFileFormat=&fileformat
|
||||||
set fileformat=unix
|
set fileformat=unix
|
||||||
let l:bytePosition=line2byte('.')+b:completionColumn-1
|
silent exec "write ".l:tmpFileName
|
||||||
exec "write ".l:tmpFileName
|
|
||||||
let &fileformat=l:oldFileFormat
|
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))
|
||||||
call delete(l:tmpFileName)
|
call delete(l:tmpFileName)
|
||||||
return scanResult
|
return scanResult
|
||||||
endfunction
|
endfunction
|
||||||
|
|
|
@ -8,6 +8,7 @@ else
|
||||||
\ ' '.dcomplete#globImportPath([<f-args>]).' > /dev/null &'
|
\ ' '.dcomplete#globImportPath([<f-args>]).' > /dev/null &'
|
||||||
endif
|
endif
|
||||||
command! -buffer -nargs=? DCD execute '!'.dcomplete#DCDclient().' '.<q-args>
|
command! -buffer -nargs=? DCD execute '!'.dcomplete#DCDclient().' '.<q-args>
|
||||||
|
command! -buffer -nargs=? DCDonCurrentBufferPosition echo dcomplete#runDCDOnCurrentBufferPosition(<q-args>)
|
||||||
command! -buffer DCDstopServer DCD --shutdown
|
command! -buffer DCDstopServer DCD --shutdown
|
||||||
command! -buffer -nargs=+ -complete=dir DCDaddPath execute 'DCD '.dcomplete#globImportPath([<f-args>])
|
command! -buffer -nargs=+ -complete=dir DCDaddPath execute 'DCD '.dcomplete#globImportPath([<f-args>])
|
||||||
command! -buffer DCDclearCache DCD --clearCache
|
command! -buffer DCDclearCache DCD --clearCache
|
||||||
|
|
Loading…
Reference in New Issue