私は主にC++とメソッド/クラス名/署名の自動変更に興味があります。
私はこれをたくさんするので、私は他の返信も待ち望んでいます。
私が知っている唯一のトリックは本当に基本的なものです。コードをリファクタリングするときの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キーを押したままにすると、「メタ」を取得できます)。
最近のEmacsバージョン(24)では、Semanticがこれを行うことができます。
Elispでプログラミングできる場合は、cedet + srecodeの組み合わせを調べます CEDETライブラリ -このタスクのすべての計測器を提供します-関数の呼び出し元を検索し、署名を取得します。ただし、次のように作成する必要があります。これらの機器を使用して、自分でリファクタリングツール
Emacs 22以降、リファクタリングツールと単純な正規表現の間のどこかで、置換テキストに任意のelisp式を埋め込むことができるため、非常に強力なテキスト操作を実行できます。 Steve Yeggeがこれについて 良い記事 を書いています。
「-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/ にあります。
私の友人は xrefactory で遊んでいて、かなりうまくいったと言っています。安くはありません。
Cscopeシンボルを作成します。
リファクタリングするシンボルを検索します。
cscopeウィンドウに入り、最初にカーソルを置いてからマクロを開始します
あなたは今ちょうどc-x c-e
検索と置換が正常に機能することに完全に同意します。ただし、セデットの本当に素晴らしい機能は「semantic-symref-list」です。
メソッドにカーソルを合わせてこのコマンドを実行すると、このタグを参照するコード内のすべての場所をリストするバッファが表示されます。
検索と置換のトリックを引き続き使用できます。これにより、すべての参照を変更したことが確認できます。
私は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の設定を取得したら:
lsp-rename
変更されたすべてのバッファを調べ、ツール/言語を使用してリファクタリングした後に何が行われたかを確認する必要があります。