Generate call graph for c/c++ functions.
How many times have you had this feeling that why can't we have this in emacs when you see the fancy function call hierarchy in "modern" IDEs? I hope one day, with this library, we won't have to envy those "modern" IDEs for this again.
Clone the repo, then in your Emacs init file:
(add-to-list 'load-path "/path/to/repo")
(require 'call-graph)
(call-graph) ;; to launch it
Or install from melpa.
GNU Global
hierarchy
tree-mode
ivy
anaconda-mode
For C++, call-graph
will recursively call Global
to find caller of
current function and eventually build up a call-graph
tree.
For python, call-graph
rely on anaconda-mode
to provide caller of
current function and eventually build up a call-graph
tree.
Place your cursor in the c/c++ function which you want to generate call-graph for and execute call-graph. You could bind it to C-c g.
(global-set-key (kbd "C-c g") 'call-graph)
(define-key map (kbd "e") 'cg-widget-expand-all)
(define-key map (kbd "c") 'cg-widget-collapse-all)
(define-key map (kbd "p") 'widget-backward)
(define-key map (kbd "n") 'widget-forward)
(define-key map (kbd "q") 'cg-quit)
(define-key map (kbd "+") 'cg-expand)
(define-key map (kbd "_") 'cg-collapse)
(define-key map (kbd "o") 'cg-goto-file-at-point)
(define-key map (kbd "g") 'cg-at-point)
(define-key map (kbd "d") 'cg-remove-caller)
(define-key map (kbd "l") 'cg-select-caller-location)
(define-key map (kbd "r") 'cg-reset-caller-cache)
(define-key map (kbd "t") 'cg-toggle-show-func-args)
(define-key map (kbd "f") 'cg-toggle-invalid-reference)
(define-key map (kbd "<RET>") 'cg-goto-file-at-point)
Customize the location of the GNU GLOBAL binary.
(setq cg-path-to-global "/home/huming/private/gtags-6.5.7/bin/")
Specify the parse depth of the call-graph. default is 2, the more the depth is, the longer it takes.
(setq cg-initial-max-depth 3)
Avoid truncating Imenu entries.
(setq imenu-max-item-length "Unlimited")
Exclude UT/CT directories like /Dummy_SUITE/ /Dummy_Test/.
(dolist (filter '("grep -v \"Test/\""
"grep -v \"_SUITE/\""
"grep -v \"/test-src/\""
"grep -v \"/TestPkg/\""))
(add-to-list 'cg-search-filters filter))
Save caller-relations in .emacs.desktop
(setq desktop-globals-to-save
(append '((cg-persist-caller-cache . 1000)
tags-file-name
tags-table-list)))
Currently when parsing calling relations, header files is excluded. Lots more need to be improved.
- Navigate to the caller file location.
- Support cache when searching for callers.
- Incrementally generate sub caller.
- Support manually remove wrong callers.
- Support persistence of call-graph cache data.
- Toggle show function args in call-graph.
- Add basic python support.
Yes, please do! See CONTRIBUTING for guidelines.
See LICENSE. Copyright (c) 2018-2021 Huming Chen chenhuming@gmail.com