より強力なコードベース検索のためのVSコード拡張


JS Powered Search JavaScriptのフルパワーを使用してコードベースを検索できるVSコード拡張機能です.それは強力な、柔軟な、ステキトフル、高速です.今日、私はそれが何をするか、そして、それがどのように働くかを簡単に歩きます.でもまず

なぜ別の検索ツール?
私の心では、コードベースの検索に来ると複雑さの3つのレベルがあります.
レベル1
「スクロールした単語のすべてのインスタンスを見つける必要があります.」
わかりました.検索アイコンをクリックしてテキスト検索を行います.VSコードを使用すると、かなりの出発点であるケースの感度と単語全体の検索を切り替えることができます.
レベル2
「スクロールのモーダル、ロールモーダル、スクロールのmodalcomponent、およびロールリングのmodalcomponentのすべてのインスタンスを見つける必要があります.
あなたのような音は、正規表現が必要です.好きなもの\b(sc)?rollingmodal(component)?\b トリックを行うべきです.コードの検索ペインでRegexトグルをクリックし、正規表現でポップしてください.正規表現は非常に有用であり、通常必要なものを行うが、その論理的能力は非常に限られている.そして、あなたが非常にしばしばそれらを書かないならば、それは正しい構文を理解するのに時間がかかることがありえます.プロのヒント:使用RegExr .)
レベル3
少なくとも100行のファイルシステムを見つける必要があります..filter メソッドを2回以上使用し、ロールモードを使用しません."
おそらく、おそらくあなたはこれのためにregexを理解することができました.そして、もしあなたが熱心なregexゴルファー、多分あなたもしたいです.しかし、我々の大部分のために、これは頭痛のように聞こえます.特にレベル2が既に頭痛であるならば.
正直に言うと、「scrollingmodalcomponent」のためのプレーンテキスト検索を行い、それぞれのファイルを手でチェックすることになるでしょう.検索が10かそこらの結果で戻って来るならば、どんな大きなもありません.しかし、何かまたは何百もの結果があるならば?それは確かにあなたの一日の残りの部分を取るつもりです.
あなたは不思議に思うかもしれない Array.filter ロジックと私のすべてのファイルを介して実行?"
今すぐできます.

JSPは何をしますか?
JSPには2つの主要な操作があります.
足場は、必要な検索機能を定義するために変更できるテンプレートファイルを生成します.次のようになります.
export interface SearchOptions {
  includeFilePatterns?: string[]; // globs to include, e.g. ['**/*.ts']. Searches all files by default.
  excludeFilePatterns?: string[]; // globs to exclude.
  includeNodeModules?: boolean; // (default: false) true if node_modules should be searched. Strongly discouraged.
  maxFileSizeInKB?: number; // (default: 1000) any files larger than this will be skipped.
  onlyTestLinesInMatchingFiles?: boolean; // (default: false) true if searchByLine should only be used on files that pass searchByFile
}

export function getSettings(): SearchOptions {
  return {
    // includeFilePatterns: [],
    // excludeFilePatterns: [],
    // includeNodeModules: false,
    // maxFileSizeInKB: 1000,
    // onlyTestLinesInMatchingFiles: false
  };
}

export interface LineSearchMetadata {
  fileName: string;
  filePath: string;
}

export interface LineSearchOptions {
  // A function that accepts a line of text and determines whether it matches your search.
  // If you only want to search by file, set this method to undefined.
  doesLineMatchSearch?: (line: string, metadata: LineSearchMetadata) => boolean;
}

export function searchByLine(): LineSearchOptions {
  return {
    doesLineMatchSearch: (line, metadata) => {
      return line.includes("exactly what I'm looking for");
    },
  };
}

export interface FileSearchMetadata {
  fileName: string;
  filePath: string;
  lines: string[]; // The file text as an array of lines
}

export interface FileSearchOptions {
  // A function that accepts a file (as a text string) and determines whether the file matches your search.
  // If you only want to search by line, set this method to undefined.
  doesFileMatchSearch?: (
    fileContents: string,
    metadata: FileSearchMetadata
  ) => boolean;
}

export function searchByFile(): FileSearchOptions {
  return {
    doesFileMatchSearch: (file, metadata) => {
      return file.includes("another thing I'm looking for");
    },
  };
}
つの関数がエクスポートされます.一つは、あなたの希望の検索設定を返します、1つはラインによってマッチするために機能を返します、そして、1はファイルによってマッチするために機能を返します.
ですから、コードベースの"ScrollingModulalComponent "のすべてのインスタンスを見つけたいなら、3ステッププロセスです.
  • 削除するdoesFileMatchSearch 関数.ここでは必要ありません.
  • 更新doesLineMatchSearch 次に示す
  • doesLineMatchSearch: (line, metadata) => {
      return line.includes("ScrollingModalComponent");
    },
    
    3 .JSP検索コマンドを実行します.
    すべての検索設定は、賢明なデフォルトを持っているので、ほとんどの場合、単純な検索のためにそれらを変更する必要はありません.秒では、検索結果の完全なリストがあります.それらのいずれかをクリックすると、ファイルと行の質問にジャンプできます.
    そのレベル3の検索を再訪しましょう.

    I need to find every TypeScript file that's at least 100 lines long, exports a ScrollingModalComponent, uses a .filter method two or more times, and does not contain the term RollingModal.


    JSPは汗をかくせずにできる.以下に検索定義がどのようになるかを示します.
    export interface SearchOptions {
      includeFilePatterns?: string[]; // globs to include, e.g. ['**/*.ts']. Searches all files by default.
      excludeFilePatterns?: string[]; // globs to exclude.
      includeNodeModules?: boolean; // (default: false) true if node_modules should be searched. Strongly discouraged.
      maxFileSizeInKB?: number; // (default: 1000) any files larger than this will be skipped.
      onlyTestLinesInMatchingFiles?: boolean; // (default: false) true if searchByLine should only be used on files that pass searchByFile
    }
    
    export function getSettings(): SearchOptions {
      return {
        includeFilePatterns: ["**/*.ts"],
        // excludeFilePatterns: [],
        // includeNodeModules: false,
        // maxFileSizeInKB: 1000,
        onlyTestLinesInMatchingFiles: true,
      };
    }
    
    export interface LineSearchMetadata {
      fileName: string;
      filePath: string;
    }
    
    export interface LineSearchOptions {
      // A function that accepts a line of text and determines whether it matches your search.
      // If you only want to search by file, set this method to undefined.
      doesLineMatchSearch?: (line: string, metadata: LineSearchMetadata) => boolean;
    }
    
    export function searchByLine(): LineSearchOptions {
      return {
        doesLineMatchSearch: (line, metadata) => {
          return line.startsWith("export") && line.includes('ScrollingModalComponent');
        },
      };
    }
    
    export interface FileSearchMetadata {
      fileName: string;
      filePath: string;
      lines: string[]; // The file text as an array of lines
    }
    
    export interface FileSearchOptions {
      // A function that accepts a file (as a text string) and determines whether the file matches your search.
      // If you only want to search by line, set this method to undefined.
      doesFileMatchSearch?: (
        fileContents: string,
        metadata: FileSearchMetadata
      ) => boolean;
    }
    
    export function searchByFile(): FileSearchOptions {
      return {
        doesFileMatchSearch: (file, metadata) => {
          return (
            metadata.lines.length >= 100 &&
            metadata.lines.filter((l) => l.includes(".filter")).length >= 2 &&
            !file.includes("RollingModal")
          );
        },
      };
    }
    
    これをJSPの検索として実行するとどうなりますか

    もう一度、あなたが必要な結果を持っているすべてのあなたがしなければならなかった文字列のロジックのビットを書いていたregexが必要としませんでした(ケース感度が問題であるならば、あなたは語境界のために若干のregexを必要とするかもしれません).
    JSPの最終的な低キースーパーパワーは、検索定義ファイルが完全に使用可能で再利用可能であるということです.あなたは、新しい開発者のための“目次”としてあなたのレポにいくつかをコミットすることができますあなたはVSコードライブ共有で1つで共同作業することができますあなたのチームに大きなリファクタの影響を示すためにJSPファイルを送信することができますあなたが後でそれらを必要とする場合には、ハードドライブ上の高度な検索を保つことができます.それは全くあなた次第です.

    動作方法
    VSのコードは非常に開発者フレンドリーextension API 上記の平均ドキュメント(私はそのGoogleabilityについて若干の苦情を持ちます、しかし、それは後日の話題です).テンプレートに基づいてファイルを作成するには、かなりのHAMのものvscode.window とTextDocument APIは、scaffoldingの部分を設定するには長いかかりませんでした.
    検索コマンドは、より困難でした.JSPは現在のエディタウィンドウの全文を取得し、JavaScriptに移行し、動的なJavaScriptモジュールにコンパイルします.オンザフライのトランスミッションは、基本的な特徴ですtypescript パッケージですが、JavaScriptモジュールへの文字列のコンパイルは、基本的な機能ではありません.そのために、私は文書の未ドキュメントの特徴を使用していますModule パッケージ(ノードに組み込まれている)はrequire-from-string NPMパッケージそれは最高の練習ではないが、それは動作します-私はかなり確信している警告でimport 検索定義ファイルでは動作しません.それはroadmap 後で見る.
    その点から、すべてのJSPはあなたの検索定義を検証します.そして、提供されるものと一致するワークスペースのファイルを見つけますinclude and exclude Globs(これは簡単です、VSコードAPIに感謝)、そしてあなたが書いた関数を使用してそれぞれをテストします.
    もちろん、このような検索ユーティリティは、UIとエラー報告のニーズがたくさんあります.幸いにも、VSコードAPIのUI機能のトンから選択する必要があります.

    次は何ですか.
    いくつかあるknown issues JSPでは、この数日間で私のテストからかなりよく動作します.私はそれを精製して、しばらくの間エッジケースを固定するつもりですofficial GitHub repo ) プレビューの前にバージョン1.0を公開する前に.
    一方、私はあなたのフィードバックを持っている.パフォーマンスやUXを改善する機会がありますか?特定のOSやファイルの特定の種類で中断しますか?どのような機能を追加表示されますか?
    長期的には、JSPS検索の力を活用した検索と置換機能が、多くの意味をなすと思います.
    私は、あなたのコードベース検索がパワーブーストを必要とするとき、JSPが役に立つことを望みます.楽しむ!