web-dev-qa-db-ja.com

Vimでのリファクタリング

もちろん、IDEでリファクタリングできるという事実は多くの人にとって貴重です。コーディングしているときにはほとんど行いませんが、他のソースを編集するときにやろうとするかもしれません。 Vimの複数のファイル間でこのような簡単なタスクをどのように達成しますか?

Rubyをリファクタリングするための このプラグイン が見つかりましたが、「任意の」言語はどうですか?

80
Helmut Granda

「VimはIDEではない」というパラダイムに同意します。しかし、IDEがない場合があります。これらの状況で使用するものは次のとおりです。

:grep、:vimgrep、:Ag、:Ggrep

定期的な置換に関連するリファクタリング通常、プロジェクトツリーで :grep を使用し、次にリファクタリングを行うために マクロを記録 を使用します-:gおよび:sは簡単ではありません。通常、非常に少ない労力で多数のファイルをすばやく変更できます。正直なところ、私はこの方法を他のどの方法よりも多く使用しています。

ワークフローによっては、組み込みコマンドが遅く/不便になる場合があります。 gitを使用する場合、優れた Fugitive プラグインとその:Ggrepコマンドを使用して、gitにチェックインされたファイルのみを検索します。 Silver Searcher もその速さで気に入っています。

:argdo、:cdo、および:bufdo

:cdo および :argdo は、一連のファイルに対してvimコマンドを実行するのに便利です。

コマンドライン

:vimgrepを使用して変更が必要なファイルのリストを判別するのが難しい場合、コマンドラインのgrep/findコマンドを使用して、リファクタリングする必要があるファイルのリストをより厳密にキュレートします。リストをテキストファイルに保存し、:eとマクロ記録のマッシュアップを使用して、必要な変更を加えます。

マクロ記録スキルの錆びが少ないほど、リファクタリングにVimが役立つことがわかります:レジスタからの快適な保存/復元、レジスタカウンタ変数のインクリメント/デクリメント、後で使用するためにマクロ記録をファイルにクリーニング/保存するなど.


更新

これを書いてから、私が説明する方法のビデオキャストがvimcasts.orgで公開されています( ALL the Vimcasts! )をご覧ください。リファクタリングについては、以下をご覧ください。

Vimgolf も練習するのに最適な方法です。

この回答を書いて以来、Language Server Protocolサーバーの普及は、Vim(および他のエディター)にリファクタリング機能をもたらしました。 IMOは、目的のIDE(私はそれらを使用し、cocとALEを好む)で見られるリファクタリング機能の能力を等しくすることからは長い道のりです。これに関する他の回答を参照してください。詳細については質問!

64
dsummersl

Cファミリー

  1. プラグインを試してください Clighter c-familyの名前変更リファクタリング用。これはclangに基づいていますが、制限があり、プラグインは非推奨としてマークされています。

    Clighterによる推奨マッピングは

    nmap <silent> <Leader>r :call clighter#Rename()<CR>
    

    後継プラグイン clighter8 は、 commit 24927db42 の名前変更機能を削除したことに注意してください。

  2. Neovimを使用する場合は、プラグイン clamp をご覧ください。提案する

    nmap <silent> <Leader>r :call ClampRename()<CR>
    
12
BB Chung

Python

python言語の場合、次のプラグインはvimに「スマート」な名前変更機能を提供します。

  • jedi-vimgithub<leader>r
  • ropevimgithubCTRL-c r r
  • python-modegithub:h pymode-rope-refactoring
10
Hotschke

Language Server Protocol(LSP)

言語サーバープロトコルには、シンボルのスマートな名前変更機能が含まれています。

https://Microsoft.github.io/language-server-protocol/specification#textDocument_rename

たとえば、次の言語サーバーがこれをサポートしています。

Vim内でそれらを使用するには、vimエディタークライアントが必要です。次のオプションがあります。

  1. LanguageClient-neovim (Rustが必要)推奨されるマッピング:

    nnoremap <silent> <F2> :call LanguageClient_textDocument_rename()<CR>
    
  2. coc.nvim (node.jsが必要)推奨されるマッピング:

    " Remap for rename current Word
    nmap <leader>rn <Plug>(coc-rename)
    
  3. vim-lsp は以下のコマンドを提供します

    :LspRename
    

    マッピングは提案されていません。ただし、もちろん次のように定義できます

    nmap <leader>r <plug>(lsp-rename)
    

    <leader>rは選択したものに置き換えられます。ほとんどのプラグインが同意するものは知りません)

  4. vim-lsc デフォルトのマッピング:

    'Rename': 'gR'
    

Neovim はすぐにlspをサポートするための保留中(2019年4月)のプルリクエストを持っています:

https://github.com/neovim/neovim/pull/6856

クラス構造の変更、メソッド/関数へのパラメーターの追加、メソッドの別のクラスへの移動など、より複雑なリファクタリングをサポートするlspプロトコルの計画があるかどうかはわかりません。リファクタリングのリストについては、 https://refactoring.com/catalog/ を参照してください。

6
Hotschke

私は このプラグイン を汎用リファクタリング用に書きました。まだ多くの改善が必要です。将来的には、C&C++リファクタリング用のclangを優先してctagsを放棄しようとします。

5
Luc Hermitte

最もエレガントなソリューションではないかもしれませんが、非常に便利だと思います: [〜#〜] eclim [〜#〜] を使用してVIMとEclipse。Ofもちろん、ソースコードの編集はすべてVIMで行われますが、リファクタリングを行うときは、この点でEclipseの優れた機能を利用できます。

試してみる。

4
fjrg76

プラグインFactorus

factorusと呼ばれるリファクタリング専用の別のvimプラグインがあり、これは github で利用できます。

現在(2017-12)、言語をサポートしています

  • c、
  • Java、および
  • python。
3
Hotschke

プラグイン YouCompleteMe(YCM) (githubの15kスター)

:h RefactorRename-new-name

RefactorRename <new name>サブコマンド

サポートされているファイルタイプでは、このコマンドはカーソルの下の識別子のセマンティックな名前変更を実行しようとします。これには、宣言の名前変更、識別子の定義と使用法、またはその他の言語に適したアクションが含まれます。特定の動作は、使用中のセマンティックエンジンによって定義されます。

| FixIt |と同様に、このコマンドはソースファイルに自動修正を適用します。名前変更操作には、複数のファイルへの変更が含まれる場合があります。これらのファイルは、その時点でVimバッファーで開いている場合と開いていない場合があります。 YouCompleteMeは、これらすべてを自動的に処理します。動作については、次のセクションで説明します。

ファイルタイプでサポート:「javascript」(変数のみ)、「TypeScript」

デフォルトでは、マッピングはありません。ただし、必要に応じて定義できます。

2
Hotschke

Vimで多くのC/C++コードを作成します。私が行う最も一般的なリファクタリングは、変数、クラス名などの名前変更です。通常、:bufdo :%s/source/dest/gファイルの検索/置換を実行します。これは、大きなIDEが提供する名前変更とほぼ同じです。
[。 -case」検索/置換、ホストされています ここ 。これはコマンドラインユーティリティであり、vimのプラグインではありません。役に立つと思います。

1
dkrikun

リファクタリングのために、 nite を使用している場合は(そうすべきです) vim-qfreplace を使用すると、非常に簡単になります。これを確認してください video それがどのように機能するかを示しています。ワークフローを設定したら、(ビデオのようなほとんどのものを入力する代わりに)いくつかのマッピングを作成して最適化できます。

0
BenC

2つのプラグインの組み合わせ: vim-ripgrep 、ファイル全体を検索し、クイックフィックスウィンドウに結果を表示します。 quickfix-reflector クイックフィックスウィンドウに変更を保存し、ファイル全体の各変更を自動的に保存します。

0
Jason

Emacsのspacemacsバージョンの使用を検討します。 Vimと同じモードとほとんどのキーストロークを使用しますが、LISPの性質により多くのアドオンがあります。 C++でプログラムしたい場合は、c ++レイヤーを追加するだけで、ほとんどのIDEが既にセットアップされています。pythonまた、テキスト内で直接コードのブロックを実行する方法もあり、コードとデータが同じファイルにあるリテラシープログラミングや再現可能なプログラミングに最適です。テキストとして。

Spacemacsは初期ロードでははるかに重いですが、それでできる追加の作業は数秒の起動コストの価値があります。 1層の組織モードは、チェックする価値があります。それは私が今まで使った中で最高のアウトライナー、プログラマー、デイタイマー/ todoリストです。

0
C. Kelly Osborn