2

簡単な Visual Studio 2012 拡張機能を作成しようとしています。拡張テンプレートを生成し、ツール メニューからダイアログ ボックスを表示できます。

現在開いているプロジェクト内のすべてのファイルを列挙し、いくつかのルールに従ってそれらをフィルター処理したいと思います。私が探しているのは、IEnumerable を返すコード スニペットです。FileHandle には、次のインターフェイスまたは類似のインターフェイスが必要です。

interface IFileHandle {
        // Return the string 
        string Path;
        // Open the file in the editor
        void OpenEditorFor();
}

参考までに、ビジュアルスタジオ用のファジーファイルファインダーを構築しようとしています。完全に一致する必要があるため、現在のファイル検索は適切ではありません。インデクサーとファジー サーチャーの記述は処理できますが、Visual Studio 拡張機能の記述へのインターフェイスは、現時点では少し不可解です。

4

1 に答える 1

9

これは簡単な答えのようです。Visual Studio 拡張機能のコンテキストでは、すべてのファイルが返されます。

public IEnumerable<ProjectItem> Recurse(ProjectItems i)
{
    if (i!=null)
    {
        foreach (ProjectItem j in i)
        {
            foreach (ProjectItem k in Recurse(j))
            {
                yield return k;
            }
        }

    }
}
public IEnumerable<ProjectItem> Recurse(ProjectItem i)
{
    yield return i;
    foreach (ProjectItem j in Recurse(i.ProjectItems ))
    {
        yield return j;
    }
}

public IEnumerable<ProjectItem> SolutionFiles()
{
    Solution2 soln = (Solution2)_applicationObject.Solution;
    foreach (Project project in soln.Projects)
    {
        foreach (ProjectItem item in Recurse(project.ProjectItems))
        {
            yield return item;
        }
    }
}

次に、CommandT クローンのコアに検索機能を実装するなど、巧妙なトリックを実行できます。

private static string Pattern(string src)
{
    return ".*" + String.Join(".*", src.ToCharArray());
}

private static bool RMatch(string src, string dest)
{
    try
    {
        return Regex.Match(dest, Pattern(src), RegexOptions.IgnoreCase).Success;
    }
    catch (Exception e)
    {
        return false;
    }
}

private static List<string> RSearch(
string word,
IEnumerable<string> wordList,
double fuzzyness)
{
    // Tests have prove that the !LINQ-variant is about 3 times
    // faster!
    List<string> foundWords =
        (
            from s in wordList
            where RMatch(word, s) == true
            orderby s.Length ascending 
            select s
        ).ToList();

    return foundWords;
}

のように使用されます

var list = RSearch("bnd", SolutionFiles().Select(x=>x.Name))
于 2012-11-14T08:09:04.890 に答える