web-dev-qa-db-ja.com

emacsを使用してC ++ソースコードをリファクタリングするにはどうすればよいですか?

私は主にC++とメソッド/クラス名/署名の自動変更に興味があります。

45
Łukasz Lew

私はこれをたくさんするので、私は他の返信も待ち望んでいます。

私が知っている唯一のトリックは本当に基本的なものです。コードをリファクタリングするときのEmacsの私の親友は次のとおりです。

M-x query-replace

これにより、グローバルな検索と置換を行うことができます。メソッドと一般的にアクセスされるデータを他のクラスまたは名前空間に移動するときに、これを大量に実行します。

C-x 3

これにより、2つのバッファーが並んで表示されます。次に、それらのファイルに別のファイルをロードし、C-x oを使用してカーソルを一方から他方に移動できます。これはかなり基本的なものですが、次のものをどれほど強力にするかについて言及します...

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

これは、emacsでマクロを定義する方法です。一連のコードに対して同じことを何度も繰り返す必要がある場合(クエリの置換には複雑すぎるため)、これは命の恩人です。失敗した場合は、C-gを押してマクロ定義を停止し、最初に戻るまで(C-_)を元に戻すことができます。マクロを呼び出すキーはC-x eです。何度もやりたい場合は、Escを押して、最初に数値を入力します。例:Esc 100 C-x eは、マクロを100回呼び出そうとします。

(注:Windowsでは、Escキーを押すか、Altキーを押したままにすると、「メタ」を取得できます)。

13
T.E.D.

最近のEmacsバージョン(24)では、Semanticがこれを行うことができます。

  1. おそらくセマンティックモードをアクティブにする M-x semantic-mode RET
  2. Symrefバッファを起動します C-c , g
  3. 押す C-c C-e すべての参照を開きます。
  4. 名前を変更 R
30
muede

Elispでプログラミングできる場合は、cedet + srecodeの組み合わせを調べます CEDETライブラリ -このタスクのすべての計測器を提供します-関数の呼び出し元を検索し、署名を取得します。ただし、次のように作成する必要があります。これらの機器を使用して、自分でリファクタリングツール

26
Alex Ott

Emacs 22以降、リファクタリングツールと単純な正規表現の間のどこかで、置換テキストに任意のelisp式を埋め込むことができるため、非常に強力なテキスト操作を実行できます。 Steve Yeggeがこれについて 良い記事 を書いています。

8
jamesnvc

「-language server protocol」(lsp)を提供する ccls または cquery を使用すると、次のように名前をリファクタリングできます。

M-x lsp-rename

代替:srefactorはemacsセマンティックモードフレームワークを使用します: https://github.com/tuhdo/semantic-refactor/blob/master/srefactor-demos/demos.org

あなたはそれを得ることができます M-x package-install MELPAから、または https://github.com/tuhdo/semantic-refactor/ にあります。

7
TheJJ

私の友人は xrefactory で遊んでいて、かなりうまくいったと言っています。安くはありません。

6
Greg Rogers

Cscopeシンボルを作成します。

リファクタリングするシンボルを検索します。

cscopeウィンドウに入り、最初にカーソルを置いてからマクロを開始します

  • ret
  • c-fシンボル開始
  • シンボルの先頭に移動します
  • wordを変更する
  • c-x o(cscopeに戻る)
  • n (for next cscope symbol)

あなたは今ちょうどc-x c-e

4
Vijayender

検索と置換が正常に機能することに完全に同意します。ただし、セデットの本当に素晴らしい機能は「semantic-symref-list」です。

メソッドにカーソルを合わせてこのコマンドを実行すると、このタグを参照するコード内のすべての場所をリストするバッファが表示されます。

検索と置換のトリックを引き続き使用できます。これにより、すべての参照を変更したことが確認できます。

2
user7957

私はC++の完了にcqueryを使用してきましたが、これはMicrosoft LSPをIDE <->ツール通信に使用します。 cqueryサーバーは、clangバックエンドを使用してLSPプロトコルの要求を満たします。

lsp-emacsは、emacsとcqueryバックエンド(cquery-emacs)の間に位置し、lsp-rename 関数。補完システムとして、cqueryは非常に信頼性が高く高速ですが、強くお勧めします。

試してみて、cquerygithubのスタートガイドに従ってください: https://github.com/cquery-project/cquery/wiki/Emacs

cqueryの設定を取得したら:

  1. 名前を変更する識別子(クラス、変数など)にカーソルを合わせます。
  2. M-x lsp-rename
  3. 識別子のnew名を入力します。
  4. Cx s(savesomebuffers)を実行すると、プロンプトが表示されますリファクタリングによって変更されたすべてのバッファを保存します。

変更されたすべてのバッファを調べ、ツール/言語を使用してリファクタリングした後に何が行われたかを確認する必要があります。

1
nenchev