How to find the callers and callee of a function in C code in vi/vim?

前端 未结 3 1213
小蘑菇
小蘑菇 2020-12-25 08:40

I want to know how can I easily click (or maybe use some easy shortcuts) on a function name and find all its callee or open where it has been defined. Most of the web manual

相关标签:
3条回答
  • 2020-12-25 09:05

    For that, Vim integrates with the cscope tool; see :help cscope for more information.

    0 讨论(0)
  • 2020-12-25 09:11

    cscope minimal example

    Ingo mentioned it, here is an example.

    First you should set on your .vimrc:

    set cscopequickfix=s-,c-,d-,i-,t-,e-
    

    Then to the base directory of your project and run:

    cscope -Rb
    

    This generates a cscope.out file which contains the parsed information. Generation is reasonably fast, even for huge projects like the Linux kernel.

    Open vim and run:

    :cs add cscope.out
    :cs find c my_func
    

    c is a mnemonic for callers. The other cscope provided queries are also possible, mnemonics are listed under:

    help cscope
    

    This adds a list of the callers to the quickfix list, which you can open with:

    :copen
    

    Go to the line that interests you and hit enter to jump there.

    To find callers of the function name currently under the cursor, add to your .vimrc:

    function! Csc()
      cscope find c <cword>
      copen
    endfunction
    command! Csc call Csc()
    

    and enter :Csc<enter> when the cursor is on top of the function.

    TODO:

    • do it for the current function under cursor with a single command. Related: Show function name in status line
    • automatically add the nearest database (parent directories) when you enter a file: how to auto load cscope.out in vim
    • interactively open the call graph like Eclipse. Related: Generate Call-Tree from cscope database

    A word of advice: I love vim, but it is too complicated for me to setup this kind of thing. And it does not take into account classes e.g. in C++. If a project matters enough to you, try to get the project working on some "IDE". It may involve some overhead if the project does not track the IDE configuration files (which are auto-changing blobs that pollute the repo...), but it is worth it to me. For C / C++, my favorite so far was KDevelop 4.

    0 讨论(0)
  • 2020-12-25 09:13

    vi / . --- / is the search function in vi, and . will repeat the same command.

    you could also use sed ( stream editor ) if it is a large file sed grep can get you the line numbers

    read the man page

    0 讨论(0)
提交回复
热议问题