TeamSpirit Advent Calendar 2020 Day12:Visual Studio Codeに「検索ワード入力中のカーソル移動制御」機能がやってきた!ヤァ!ヤァ!ヤァ!

この記事は チームスピリット Advent Calendar 2020 の12日目の記事です。

adventar.org

こんにちは、SDチームの里石です!
去年のアドベントカレンダーに引き続き、今年もVSCodeネタで記事を書きたいと思います。

今年9月、VSCodeに「検索ワード入力中のカーソル移動制御」機能が追加されました。(find-cursor-move-on-type-control | Visual Studio Code August 2020)

VSCodeでは、Ctrl+Fで実行できるファイル内検索を「Find」、Ctrl+Shift+Fでサイドバーから実行できるgrep検索を「Search」と読んでいます。
Find機能は、検索ワード入力中にその検索結果へ自動でジャンプする、いわゆるインクリメンタルサーチとなっているのですが、これを自動でジャンプしないようにする設定がありませんでした。そのため、検索ワード入力中に勝手にカーソルがどんどん移動して、もと居た場所がわからなくなったり、弊害も多い動作でした。

バージョン1.49で、やっとこのカーソル移動を制御するオプションが追加されました。

  • 設定項目:"editor.find.cursorMoveOnType"
  • 設定値: true(defalut), false
    true:検索キーワード入力時、自動でカーソル移動する。false:しない

自分が待ち望んでいて、一時は自分で改造できないかソースを調べるまでしたことのあった機能だけに、どのような経緯でVSCodeへ実装されるに至ったのか、気になって調べてみました。

Issue起票と投票

発端は2019/11/21にultraGentle氏が起票した。下記のIssueでした。
Issue #85303 | Don't auto-scroll to first "Find" match(最初の「Find」一致に自動スクロールしないでください)

ここから遡ること1年前の2018/10/16、タイトルは異なりますがKeyC0de氏が似たような要望を出しており、
Issue #60977 | Disable Auto Cursor Reveal while typing in Find Widget(Findウィジェットの入力中に自動カーソル移動を無効にする)
また、dwelle氏も同様の要望を出していました。(2018/12/18)
Issue #65286 | Allow to disable incremental search(インクリメンタルサーチを無効にできるようにする)

MicrosoftのRebornix氏がIssue #85303を見つけました。彼は1年前から似たような要望に「feature-request(機能要望)」タグを付け、Issue #60977に集約し始めていた方でした。Rebornix氏がIssue #85303中でIssue #60977を紹介してみると、ultraGentle氏は自分の要望内容と同じであることを発見。Issue #60977へ合流しました。以後、Issue #60977でこの機能の議論は進むことになります。

Rebornix氏はその後、Issue #60977に「Backlog Candidates(バックログ候補)」マイルストーンを付与しました(2020/01/28)
するとvscodebot(ボット)がこのマイルストーンを自動検出し、投票を促しました。(60日中に20票が必要)

ultraGentole氏は、どうやら現在のFindウィジェットの動作が、他のIssueのバグの原因となっているらしいことを発見し、そのようなIssue(Issue #70306など)のコメントにIssue #60977へのリンクを張り、提案をして回りました。このおかげで多くの票が集まり、機能追加が決定しました。

2020/02/14に投票が終わり、vscodebotは「Backlog Candidates(バックログ候補)」マイルストーンを削除し「Backlog(バックログ)」マイルストーンへ付け替えました。また「help wanted(従業員募集)」のラベルを貼り付けました。(他のIssueを見ていると、これでこのIssueのプルリクエストがマージ候補としてきちんと検証・検討されるようになるようです)

プルリクエスト、insiders版への機能リリース

Rebornix氏とultraGentle氏が中心となり、設定名称などの議論が行われ、その後2020/04/10 にプルリクエストが開かれました。
PullRequest #94825 | Adds setting to disable cursor movement while typing into Find Widget(Findウィジェット入力中にカーソルの移動を無効にする設定を追加します)

プルリクエストはRebornix氏がまずレビューし、フォーマッタを指摘。ultraGentle氏が修正してコミットしたもののRebornix氏からは反応がなく、briankendall氏がセカンドレビュー者としてレビューし、いったん終えました。その後もRebornix氏がなんら反応することはなく、このプルリクエストはしばらく放置されることになりました。途中、6月ごろに他のユーザから「このプルリクエストは、いったいいつマージされるのか」といったコメントが付くも、ultraGentle氏も「これが保留中なのかリジェクトされたのかわからない」と回答しています。7月にしびれを切らしたultraGentle氏は「Rebornix氏へメンションを送るも、反応がなくイライラしている」とのコメントを残しています。

2020/08/11、Rebornix氏が少し手直ししたコミットを追加しプルリクエストをmasterへマージしました。どうやらRebornix氏は単純にこのIssueを忘れていたようです。Rebornix氏から、貢献への感謝と今週中(2020/08/10~16)にinsiders版で利用できるようになる旨のコメントが付きました。

なお、各コミット時やマージ時には自動テストが実行され、monacoプロジェクトのコードチェックやAzure Dev OpsのPipelinesでvscodeの自動テスト、MicrosoftのCLA要件チェック(「あなたのコードはMicrosoftからOSSとして人々に提供されます」などの同意書)をパスした後にマージされるようです。

同日、Issue #60977にはいったん「unreleased(未リリース)」のラベルがvscode-triage-bot(ボット)によって付与され、さらにRebornix氏が「Backlog(バックログ)」「August 2020」の2つのマイルストーンを付与します。その3日後の2020/08/14に、同じくvscode-triage-botによって「unreleased(未リリース)」ラベルが「insider-released(insiderリリース)」ラベルに張り替えられます。
(このタイミングでinsiders版のVSCodeへ、機能がリリースされたようです)

stable版への機能リリース

2020/09/08にRebornix氏は「verification-needed(確認が必要)」ラベルを付与し、mjbvz氏が「verified(確認済み)」を付与しました。 これによりinsiders版からstable版へリリースする準備が整ったことを示していると思われます。

2020/09/10、いよいよstable版VSCode 1.49 がリリース!ultraGentle氏が興奮気味に機能がリリースされた旨をコメントし、Issue #60977の起票者であるKeyC0de氏も「2年かかった…」とコメントを残しています。

まとめ

このような道のりを経て、VSCodeの機能は改善されていきます。

忘れられて機能のリリースが遅れたり、多くの人が困っているバグと関連付けられることで対応の機運が高まったりと、なんだか既視感のあるとてもアナログなプロセスで実装されていく様子が見て取れました。

また、botによるラベルの貼り替えや、プルリクエストのクローズとともにリリース対象のラベルが付与されるなど、自動化をふんだんに活用して、Issueやプルリクエストの管理が行われていることもわかりました。

何はなくとも、issueを書かないと始まりません。
欲しい機能があれば、是非Issueを挙げてみましょう。