もちろん、IDEでリファクタリングできるという事実は多くの人にとって貴重です。私がコーディングしているときはほとんどそうしませんが、他の誰かのソースを編集しているときはそうするかもしれません。Vimの複数のファイルにまたがって、このような簡単なタスクをどのように達成しますか
Rubyをリファクタリングするためのこのプラグインを見つけましたが、「任意の」言語はどうですか?
もちろん、IDEでリファクタリングできるという事実は多くの人にとって貴重です。私がコーディングしているときはほとんどそうしませんが、他の誰かのソースを編集しているときはそうするかもしれません。Vimの複数のファイルにまたがって、このような簡単なタスクをどのように達成しますか
Rubyをリファクタリングするためのこのプラグインを見つけましたが、「任意の」言語はどうですか?
回答:
「VimはIDEではない」というパラダイムに同意します。ただし、IDEがない場合もあります。ここでは、これらの状況で使用するものを示します。
定期的な置換に関連するリファクタリング私は通常、プロジェクトツリーで:grepを使用してから、マクロを記録してリファクタリングを実行します-:gと:sは簡単です。通常は、ほとんど手間をかけずに多数のファイルをすばやく変更できます。正直なところ、私は他のどの方法よりもこの方法を使用しています。
ワークフローによっては、組み込みコマンドが遅くなるか不便になる場合があります。gitを使用する場合は、優れたFugitiveプラグインとその:Ggrep
コマンドを使用して、gitにチェックインされたファイルのみを検索します。シルバーサーチャーのスピード感も気に入っています。
:cdoと:argdoは、一連のファイルに対してvimコマンドを実行するのに便利です。
変更が必要なファイルのリストを特定するのが難しい場合:vimgrep
は、コマンドラインのgrep / findコマンドを使用して、リファクタリングが必要なファイルのリストをより厳密にキュレートします。リストをテキストファイルに保存し、:e
マクロ記録のマッシュアップを使用して、必要な変更を加えます。
さびしくないほど、マクロ記録スキルを維持する方が、Vimのリファクタリングに役立ちます。レジスタからの保存/復元、レジスタカウンタ変数のインクリメント/デクリメント、マクロ記録のクリーニング/ファイルへの保存など、後で使用できるようになります。
更新
この記事を書いて以来、私が説明する方法のビデオキャストはvimcasts.orgで公開されています(すべてのVimcastを視聴することをお勧めします!)。リファクタリングについては、これらを監視します。
Vimgolfも練習するのに最適な方法です。
私がこの回答を書いて以来、Language Server Protocolサーバーが広く普及していることで、Vim(およびその他のエディター)にもリファクタリング機能が提供されました。IMOそれらは、専用のIDEで見られるリファクタリング機能の同等化とはかなり異なります(私はそれらを使用しており、cocとALEを好みます)。詳細については、この質問の他の回答をご覧ください。
言語サーバープロトコルには、プロジェクト全体のシンボルのスマートな名前変更機能が含まれています。
たとえば、次の言語サーバーはこれをサポートしています。
https://langserver.org/で他の言語サーバーを見つけることができます。
vim内でそれらを使用するには、vimエディタークライアントが必要です。次のオプションがあります。
LanguageClient-neovim(錆が必要)はマッピングを提案します:
nnoremap <silent> <F2> :call LanguageClient_textDocument_rename()<CR>
coc.nvim(node.jsが必要)は、マッピングを提案します。
" Remap for rename current word
nmap <leader>rn <Plug>(coc-rename)
エールは
nnoremap <silent> <Plug>(ale_rename) :ALERename<Return>
エールはキーバインドを定義していません。これはユーザーが行う必要があります。
vim-lspは次のコマンドを提供します
:LspRename
エールと同様に、マッピングは提案されていません。ただし、もちろん次のように定義できます。
nmap <leader>r <plug>(lsp-rename)
(<leader>r
あなたの選択に置き換えられるべきです;ほとんどのプラグインが同意するものは知りません)
vim-lscにはデフォルトのマッピングがあります。
'Rename': 'gR'
LSPを容易にするYouCompleteMeも参照してください。
Neovimは、2019年11月13日以降、lspの最初の組み込みサポートを備えています。
LSPの一般的な構成については、https://github.com/neovim/nvim-lspを参照してください。
しかし、スマートな名前変更がどのように機能するのか理解できませんでした。誰かがこれを知っている場合は、このセクションを更新してください。
クラス構造の変更、メソッド/関数へのパラメーターの追加、メソッドの別のクラスへの移動など、より複雑なリファクタリングをサポートするLSPプロトコルの計画があるかどうかはわかりません。リファクタリングのリストについては、https: //refactoring.com/catalog/を参照してください。
coc-rename
は現在のバッファでのみ機能します。プロジェクト内でグローバルに(ファイル全体で)エクスポートされた名前の使用が更新されませんでした。
Cファミリの名前変更リファクタリングにプラグインClighterを試してください。これはclangに基づいていますが、制限があり、プラグインは非推奨としてマークされています。
Clighterによる推奨マッピングは
nmap <silent> <Leader>r :call clighter#Rename()<CR>
後継プラグインclighter8は、コミット24927db42の名前変更機能を削除したことに注意してください。
あなたがneovimを使用する場合は、プラグインを見てとることができ、クランプ。それは示唆している
nmap <silent> <Leader>r :call ClampRename()<CR>
私が書いたこのプラグインを、一般的なリファクタリングのために。それでも多くの改善が必要です。将来的には、C&C ++リファクタリングのためにclangを優先してctagsを放棄することを試みます。
http://ycm-core.github.io/YouCompleteMe/#the-refactorrename-new-name-subcommand
:h RefactorRename-new-name
サポートされているファイルタイプでは、このコマンドはカーソルの下にある識別子のセマンティックリネームを実行しようとします。これには、識別子の名前変更宣言、定義、使用法、またはその他の言語に適したアクションが含まれます。特定の動作は、使用中のセマンティックエンジンによって定義されます。
と同様に
FixIt
、このコマンドはソースファイルに自動変更を適用します。名前の変更操作には、複数のファイルへの変更が含まれる場合があり、その時点ではVimバッファーで開いている場合と開いていない場合があります。YouCompleteMeがこれをすべて処理します。この動作については、次のセクションで説明します。ファイルタイプでサポート:c、cpp、objc、objcpp、cuda、java、javascript、typescript、rust、cs
デフォルトではマッピングはありません。
vimで多くのC / C ++コードを記述しています。私が行う最も一般的なリファクタリングは、変数、クラス名などの名前を変更することです。通常、:bufdo :%s/source/dest/g
ファイル内で検索/置換を行うために使用します。これは、大きなIDEによって提供される名前変更とほぼ同じです。
ただし、私の場合、通常は同じエンティティの名前を変更し、さまざまなケース(CamelCase、snake_caseなど)で綴ったため、この種の「スマートケース」検索を支援する小さなユーティリティを作成することにしました/置き換え、それはここでホストされています。これはコマンドラインユーティリティであり、vimのプラグインではありません。役立つことを願っています。
リファクタリングについては、Uniteを使用している場合(そして使用する必要がある場合)、vim-qfreplaceを使用して非常に簡単にすることができます。それがどのように機能するかを示すこのビデオをチェックしてください。ワークフローが設定されたら、マッピングを作成して最適化できます(ビデオのようにほとんどのものを入力する代わりに)。
2つのプラグインの組み合わせ:vim-ripgrepは、ファイル全体を検索して結果をQuickFixウィンドウに表示し、QuickFix- ReflectorはQuickFixウィンドウに変更を保存し、ファイル全体の各変更を自動的に保存します。
emacsのspacemacsバージョンの使用を検討します。Vimと同じモードとほとんどのキーストロークを使用しますが、Lispの性質のため、アドオンはさらに多くあります。C ++でプログラミングする場合は、c ++レイヤーを追加するだけで、ほとんどのIDEがすでに設定されています。pythonやbashなどの他のインタープリター型言語の場合、それらを使用するためにspacemacsを離れる必要はありません。テキスト内でコードのブロックを直接実行する方法さえあります。これは、読み書き可能なプログラミングや、コードとデータが同じファイルにある再現可能なプログラミングに最適です。どちらもテキストとして行われます。
Spacemacsは、初期ロードの方がはるかに重いですが、それを使用して実行できる追加機能には、数秒の起動コストの価値があります。1つのレイヤーの組織モードは、チェックする価値があります。それは私が今まで使った中で最高のアウトライナー、プログラマー、デイタイマー/ ToDoリストです。
- 名前を変更
- 関数の抽出
- ローカル変数を抽出
- 変数を切り替え⇔:=
- Godocスタブを追加する
それらを利用可能にするvimプラグインhttps://github.com/godoctor/godoctor.vimがあります
名前を変更するものにカーソルがある場合:
:Rename <newname>
抽出するブロックを強調表示:
:Refactor extract newfunc
:GoRename
。言語サーバー gopls