操作をコードのセクションに制限する


10

日常業務の中で、特定の関数(変数の強調表示や検索など)を操作する必要があることがよくありますが、編集/検索の範囲を制限することはできませんでした。

vimで、$colorこれらの中括弧のセットへのすべての参照、またはこの折り目などを選択的に言う方法があります。可能であれば、これは比較的一般的で、テキストの編集/置換に適用できるのが理想的です。

例として:

$color = "#fff";
function PickColor () {
  $color = "#bbb";
  $newColors = ["#000", "#fbf", $color];
  foreach ($newColors as $c) {
    if ($c == "#fff") {
       break;
    }
  }
}
$differentColor = $color;

このコードは比較的悪い例ですが、$ colorのすべてのインスタンスを置き換える必要がある場合、PickColor関数のコンテキストでこれをどのように行うのでしょうか。別の例として、使用する#と、*あなたはそのテキストオブジェクトの次のインスタンスに移動することができ、どのように(基本的には、検索をラップする)だけで、この機能の検索のための範囲を制限する行の数千人に及ぶ可能性がファイル全体に反対して負けあなたの場所、またはあなたが持ってはならない別の機能の何かを誤って置き換えますか?

回答:


15

いくつかの方法があります。

1  | $color = "#fff";
2  | function PickColor () {
3  |     $color = "#bbb";
4  |     $newColors = ["#000", "#fbf", $color];
5  |     foreach ($newColors as $c) {
6  |         if ($c == "#fff") {
7  |             break;
8  |         }
9  |     }
10 | }
11 | $differentColor = $color;

行番号を含めるように例を変更しました。

したがって、次のように$colorして$newColor、のインスタンスをと置き換えることができます。

行番号の範囲

:1,11s/\$color/$newColor/g

これにより、1行目から11行目までの範囲で置換が行われます。

相対線範囲

カーソルを1行目に置いて、...

:.,11s/\$color/$newColor/g

これは、範囲が現在の行から始まり、行11で終わることを示しています。

ビジュアル選択範囲

1行目に移動しShift+V、次にを押しGます。これは視覚的に1行目を選択します。そして...

:'<,'>:s/\$color/$newColor/g

これにより、選択がカバーする範囲に置換が制限されます。アクティブな選択で'<,'>を押す:と、Vimは自動的に範囲を挿入します。


私はvimが大好きです。人生をより簡単に、毎日のように学ぶために、発見することが常にあります:)
カイル・マギル

6

プラグインのルートに慣れている場合は、NrrwRgnがあります。

ブロックを視覚的に選択してから、:NRコマンドを実行すると、選択したテキストで新しいバッファーが(分割して)開きます。このバッファを変更することができ、保存すると、元のファイルにも保存されます。

私の意見では、このプラグインは問題を非常によく解決し、特定の範囲に適用する方法を再考することなく、実行したい操作に集中できます。


これは、私が誓うプラグインの1つです。これは、通常のコードファイルにコミットできる小さなスクラッチバッファーがあるようなものです。
craigp 2015

3

ビジュアルラインモード(Shift + V)に関心のあるブロックを選択して:から、ブロックに適用するコマンドを入力します。

したがって、選択で置き換えたい場合は、実行できます :s/string/replacement_string


正しい; 例VaB:s/\$color/replaced/g
wchargin 2015

ちょうどそれを追加しました、良い点:)
Stefan Dorunga

0

中かっこテキストオブジェクト '}'を使用し、中かっこ内を 'i}'で選択します

関数の開始中括弧が付いている行:

$<C-V>i}:s/\$color/$newColor/g

最初に行の終わり(左中かっこの上または中)に移動し、次にビジュアル選択に入り、次に中かっこテキストオブジェクトを使用して選択します。'i}'は中括弧の内側 'a}'は中括弧の内側です。

中括弧がない言語の場合、Vim Text Object:The Definitive Guideはいくつかのプラグインを提案しています:

  • PythonやCoffeeScriptなどの言語の場合、インデントオブジェクトはインデントレベルに基づいてテキストオブジェクトを提供します。ai現在のインデントレベルと上の行が含まれます。ii上記の行を除く現在のインデントレベルを含みます。
  • Rubyブロックは、キーワードの存在に基づいて、テキストオブジェクトarとのサポートを追加します。irend
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.