Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I refactor C++ source code using emacs?

I'm interested mostly in C++ and method/class name/signature automatic changes.

like image 388
Łukasz Lew Avatar asked Mar 23 '09 14:03

Łukasz Lew


4 Answers

In recent Emacs versions (24), Semantic is able to this.

  1. Possibly activate semantic mode M-x semantic-mode RET.
  2. Bring up the Symref buffer with C-c , g.
  3. Press C-c C-e to open all references.
  4. Rename with R.
like image 119
muede Avatar answered Oct 16 '22 16:10

muede


If you can program in elisp, you can look to combination of cedet + srecode from CEDET libraries - it provide all instruments for this task - find callers of functions, get signature, etc. But you need to create refactory tool yourself, using these instruments

like image 30
Alex Ott Avatar answered Oct 16 '22 15:10

Alex Ott


I do this a lot, so I'm axiously awaiting other replies too.

The only tricks I know are really basic. Here are my best friends in Emacs when refactoring code:

M-x query-replace

This allows you to do a global search and replace. You'll be doing this a ton when you move methods and commonly-accessed data to other classes or namespaces.

C-x 3

This gives you a display with two buffers side-by side. You can then proceed to load different files in them, and move your cursor from one to the other with C-x o. This is pretty basic stuff, but I mention it because of how powerful it makes the next one...

C-x (
(type any amount of stuff and/or emacs commands here)
C-x )

This is how you define a macro in emacs. Any time you find yourself needing to do the same thing over and over to a bunch of code (and it is too complex for query-replace), this is a lifesaver. If you mess up, you can hit C-g to stop the macro definition, and then undo (C-_) until you are back to where you started. The keys to invoke the macro are C-x e. If you want to do it a bunch of times, you can hit Esc and type in a number first. Eg: Esc 100 C-x e will try to invoke your macro 100 times.

(Note: On Windows you can get "Meta" by hitting the Esc key, or holding down Alt).

like image 13
T.E.D. Avatar answered Oct 16 '22 17:10

T.E.D.


The current (2022) state of the art is, I would say, using emacs lsp-mode with a suitable language server.

With the clangd or ccls, which provide the "language server protocol" (lsp) and connect to lsp-mode, you can refactor names with:

M-x lsp-rename

To simplify this setup, I'd recommend using Spacemacs with c-c++ and lsp layers (and using clangd).

like image 9
TheJJ Avatar answered Oct 16 '22 17:10

TheJJ