Max Nardit
Beetroot

Beetroot v1.5.1:ML コード検出と、ちゃんと動く検索

Beetroot v1.5.1: VS Code の TensorFlow.js モデルが 54 言語を検出。検索エンジンを書き直し。「local v」が 98 件ではなく 9 件を返します。

Beetroot について、しばらく気になっていたことが 2 つあります。1 つ目: Rust の struct をコピーしてプレビューを開くと、C としてハイライトされる。あるいはもっと悪いことにプレーンテキストとして。コード検出は、5 言語ほどしか知らず、それ以外の何でも間違えて推測する正規表現パターンの寄せ集めでした。

2 つ目: 1,100 件のクリップボードエントリで「local v」を検索すると 98 件が返ってきました。「port 80」は「import」にマッチしました。「port」が「import」の部分文字列だからです。ファジー検索ライブラリは、まさにファジー検索がやることをやっていました。ただ、データの種類が間違っていただけです。

v1.5.1 はその両方を修正します。

ひと目で:

  • ML 言語検出:54 のプログラミング言語、VS Code と同じモデル
  • 検索の書き直し:「local v」→ 98 件ではなく 9 件
  • Unicode 単語境界:「port」が「import」内にマッチしなくなる
  • フラグメントプレビュー:長いクリップは最初の 100 文字ではなく、マッチした位置を表示
  • バグ修正:ソースアプリ追跡、オブジェクトリテラル検出

あなたの Rust コードは C としてハイライトされるべきではない

旧来の検出は looksLikeCode() という関数で、functionconstclassdef などのキーワードのリストでした。あなたのコードにそれらのいずれかが含まれていればハイライトされ、含まれていなければプレーンテキストでした。これは JavaScript と Python では機能しました。それ以外では失敗しました。

fn main のない Rust ? プレーンテキスト。Go のインターフェース ? 時々誤認識。Swift ? プレーンテキスト。Ruby ? プレーンテキスト。先頭に <?php のない PHP ? お察しのとおりです。

新しい検出は @vscode/vscode-languagedetection を使います。VS Code が Untitled ファイルを開いたときにあなたが書いている言語を推測するのと同じ TensorFlow.js モデルです。何百万もの GitHub ファイルでトレーニングされ、54 のプログラミング言語を識別します。

言語以前以後
RustC またはプレーンテキストRust
Go誤認識Go
SwiftプレーンテキストSwift
RubyプレーンテキストRuby
PHP (<?php なし)プレーンテキストPHP
{ key: value }JSONJavaScript

モデルは 1 MB 未満で、アプリ内で完全にローカルに動作します。クラウド呼び出しも API キーもなし。最初の実行で読み込みに約 200 ms、その後はキャッシュ付きで検出ごとに 10〜50 ms です。

Beetroot のプレビューで Rust コードが正しいシンタックスハイライトと「rust」言語ラベル付きで表示。ML モデルによる検出

予想していなかったこと: { name: "foo", count: 42 }。これは JSON か、それとも JavaScript か ? 旧正規表現は JSON だと言いました。中括弧とコロンがあるからです。ML モデルは JavaScript のオブジェクト構文を認識します。小さなことですが、これによってあなたの JS スニペットがついに正しい色を得ます。

すべてを返さない検索

検索の書き直しについて記事まるごと書きました。8 回のイテレーション、すべての回り道を記録しました。短く言うと:

Fuse.js は素晴らしいファジー検索ライブラリです。短い文字列、つまりファイル名、連絡先、メニュー項目には。クリップボードエントリは違います。コードブロック、スタックトレース、URL、しばしば 200 文字以上です。それほど長い文字列では、クエリの文字がテキストのどこかに散らばって出現することは 統計的に起こりやすい のです。Fuse.js はそれをマッチとしてカウントします。だから「local v」が 98 件を返したのです。

修正は 5 段階のスコアリングシステムです。クリップボードのコンテンツでの完全部分文字列マッチが最高ランクです。単語境界マッチが次。ウィンドウタイトルとアプリ名はそれより低いランクです。ファジーマッチング (タイポ用) は最後です。すべて重複排除され、各アイテムは最高スコアだけを保持します。

クエリ以前以後
local v989
port 80131〜2
lm st711〜2
timeout〜40〜8

「port」は「import」の中でマッチしなくなりました。検索は今、Unicode を意識した単語境界を使っているからです。「import」の中の「port」は単語の先頭ではないと認識して無視します。同じロジックがキリル文字、camelCase、アンダースコアでも機能します。

そして長いクリップでは、プレビューがマッチが どこに あるかを表示します。マッチするフラグメントへ表示ウィンドウをシフトすることで、最初の 100 文字を常に表示してマッチが見えないままになることはなくなりました。

バグ修正

ソースアプリ追跡:スリープから復帰した後、すべての新しいクリップが、実際にコピーしたウィンドウではなく Beetroot をソースアプリとして表示していました。クリップボードモニタが同じ内容を「新しい」イベントとして再発火し、ソースをリセットしていたのです。コンテンツの重複排除で修正しました。

JS/TS オブジェクトリテラル{ name: "foo", count: 42 } がコードとして全く認識されていませんでした (functionclass キーワードがないため)。今は正しく検出してハイライトします。

アップデート方法

Beetroot は自動でアップデートを提案します。または GitHub から v1.5.1 をダウンロード してください。

ディスカッション

コメント欄はありません。議論は X で行っています。

Max Nardit

Max Nardit

@mnardit

ほかの記事

Beetroot v1.6.6:Office 修正

Excel と Word のセルが値ではなくスクリーンショットとしてキャプチャされていました。Microsoft Store の自動起動が密かに壊れていました。画像サムネイルがギガバイト単位の RAM を消費していました。v1.6.6 はこの 3 つに加え、大型の 1.6.5 AI Vision リリース後のセキュリティと信頼性の作業を修正します。

Beetroot v1.5.1:TensorFlow.js コード検出、Rust 検索