On 2007-05-22, Natesh Kedlaya <[EMAIL PROTECTED]> wrote:
> Hi Gary,
> I apologize for my earlier email. I should have given the full details.
> I would like to provide it now.
>
> I have tried your suggestion of setting the cscopeprg to a script that
> contained
> /usr/local/bin/cscope "$@" | sed s@/dir1/@/dir2/@
> But the cscope results still contained the directory /dir1 reference.
>
> While doing this test, I have observed a strange behavior. If the cscopeprg
> is set to anything other than /usr/bin/cscope and /usr/local/bin/cscope,
> somewhow
> the vim resets them back to /usr/bin/cscope.
> So, I tried replacing the /usr/bin/cscope itself with the script mentioned
> above and
> got the following errors while opening any source files.
>
> Error detected while processing /etc/vimrc:
> line 35:
> cs_read_prompt EOF: Interrupted system call
> Interrupted
> Error detected while processing /home/myname/.vimrc:
> line 1:
> Interrupted
> Interrupt: Hit ENTER or type command to continue
That is indeed strange behavior. Let's take one behavior at a time.
If setting 'cscopeprg' to the name of your script left the /dir1
references unchanged, then either that setting is being overwritten
or the sed command is failing. You can check the former by
executing
:verbose set cscopeprg?
which will return the current value of 'cscopeprg' and where it was
set last. You can check the sed script by changing it to
cat "$@" | sed s@/dir1/@/dir2/@
and executing it from a shell prompt with the name of your cscope
database (cscope.out?) as the only argument. This will ensure that
the sed command is being executed in the same environment as when it
filters the output of cscope, helps catch quoting issues and avoids
copy-and-paste issues.
>From what you said about the errors and the renaming of 'cscopeprg',
though, it looks more like something changing 'cscopeprg' than a
problem with the sed command.
I don't have an explanation for the errors from /etc/vimrc or
/home/myname/.vimrc yet. I don't know how the contents of
/usr/bin/cscope would affect the behavior of vim so early in vim's
startup. Unless, of course, either of those files executed a
:cscope command, which would also be unusual. You might take a look
at the lines where those errors are reported for a clue to what's
happening.
> Out of the three solutions that you have suggested, would you please
> elaborate on the third one, ie. "execute cscope as a quickfix command
> (instead of using the :cs
> commands) and filter its output before being read by vim." This looks
> very promising to me.
When the cscope feature was first added to vim, its results could
not be sent to the quickfix error list as they can now. I really
wanted to use the quickfix interface with cscope, so I wrote a
function to behave just like ":cs find" but to send the cscope
output to the quickfix list by setting 'grepprg' to "cscope" plus
some arguments. I've attached the function (actually a pair of
functions) to this message. You can invoke it from the command line
as, e.g.,
:Csfind g somevar
or bind it to a mapping, e.g.,
map <silent> ,g :Csfind g <C-R><C-W><CR>zv
to search for the definition of the symbol under the cursor.
Regards,
Gary
--
Gary Johnson | Agilent Technologies
[EMAIL PROTECTED] | Mobile Broadband Division
| Spokane, Washington, USA
if v:version < 602
" Csfind
"
" Usage:
"
" :Csfind {querytype} {name}
"
" Example:
"
" :Csfind s myvar
"
" finds all occurrences of the C symbol "myvar".
command! -nargs=+ Csfind call Csfind(<f-args>)
function! Csfind(querytype, name)
" Check the validity of the querytype argument.
"
if strlen(a:querytype) != 1 || stridx("01234678sgdctefi", a:querytype)
== -1
echohl ErrorMsg
echo "Usage: :Csfind {querytype} {name}"
echo "See \":help cs\""
echohl None
return
endif
" Save previous 'grep' options.
"
let gf = &grepformat
let gp = &grepprg
" Set new 'grep' options for running cscope.
"
set grepformat=%f\ %[%^\ ]%#\ %l\ %m
let &grepprg = &csprg . " -L -f " . s:cscope_database
" Find the numerical form of the querytype.
"
if a:querytype =~ '\d'
let num = a:querytype
else
let num = stridx("sgdct?efi", a:querytype)
endif
" Do it.
"
execute "grep -" . num . a:name
" Restore previous 'grep' options.
"
let &grepprg = gp
let &grepformat = gf
endfunction
else
" Csfind()
"
" This function uses :try and related commands which were first introduced
" at vim-6.2, so any application should check for v:version >= 602 before
" calling it.
"
" When errors occur within a function, vim prints the function name and
" line number as well as the error message from the command that failed.
" The user doesn't care about this, so this function catches _all_ errors
" from :cscope so that the user will see only the error messages from
" :cscope itself.
command! -nargs=+ Csfind call Csfind("cscope", <f-args>)
command! -nargs=+ SCsfind call Csfind("scscope", <f-args>)
function! Csfind(cmd, querytype, name)
try
execute a:cmd . " find " . a:querytype . " " . a:name
catch /E567/ " 'no cscope connections'
try
execute "cscope add " . s:cscope_database
catch /.*/
" Note: The perror() message
" cs_read_prompt EOF: Error 0
" currently (2004-02-20) hides the more-informative message
" E609: Cscope error: cscope: cannot read file version from
file cscope.out
"
call s:EchoException()
return
endtry
try
execute a:cmd . " find " . a:querytype . " " . a:name
catch /.*/ " Any error.
call s:EchoException()
endtry
catch /.*/ " Any other error.
call s:EchoException()
endtry
endfunction
function! s:EchoException()
if &errorbells
normal \<Esc> " Generate a bell
endif
echohl ErrorMsg
echo matchstr(v:exception, ':\zs.*')
echohl None
endfunction
endif