-
Gitの自動修正機能が速すぎる理由
- Gitの自動修正機能は、誤って入力したコマンドを実行する前に0.1秒待つ。
- これは人間がまばたきする時間とほぼ同じで、反応するのが難しい時間である。
- この機能は、Gitメンテナーが提案した時間単位の誤解と誤った設定に由来する。
-
この機能はどのように設計されたのか?
- デフォルトでは、Gitは誤ったコマンドを実行しない。
- 似たコマンドを提示して終了するのが基本動作である。
- 2008年に、Johannes Schindelinが似たコマンドを見つけて実行するパッチを導入した。
- Alex Riesenが
help.autocorrect設定によってこれを構成可能にした。
help.autocorrectを1に設定すると、0.1秒後にコマンドを実行する。
-
適切な設定値は何か?
10に設定すると1秒間待つ。
- ドキュメントによると、設定可能な値は次のとおりである:
0: 提案されたコマンドを表示する。
- 正の値: 指定された0.1秒単位の待機後にコマンドを実行する。
immediate: 即座にコマンドを実行する。
prompt: 提案されたコマンドを表示し、実行するかどうかを尋ねるプロンプトを表示する。
never: 提案されたコマンドを実行も表示もしない。
prompt設定が最も合理的かもしれない。
-
Gitはどのように推測するのか?
- Gitは、単純化された修正版Levenshtein距離アルゴリズムを使ってコマンドを推測する。
- 一定の距離を超えると推測しない。
- たとえば、
git bassはrebaseと推測されるが、bassaは推測されない。
-
私の小さな修正
1という値を「即時」と解釈する小さなパッチを書いた。
- Gitメンテナーは、すべてのブール文字列値を正しく解釈するよう求めた。
- このパッチが適用されれば、将来のGitバージョンではもはや反応速度を試されることはなくなる。
1件のコメント
Hacker Newsのコメント
Hal Finneyが70年代にMattel Intellivisionシステム向けのBASICインタープリタを書いた際、エラーメッセージを
EH?まで短縮したという逸話が面白い設定名が明確でないために問題が起きている。
help.autocorrect_enabledのような分かりやすい名前が必要だったint timeoutではなくint timeout_msecと命名すべき設計ミスに見える。既存の設定値を再解釈して変更するのは避けるべき
help.autocorrectの設定引数が非標準の単位で測られているのはよくない。真偽値と小数で設定できるのが望ましいcreeping featurismの良い例。不必要な複雑さを招いているdecisecondsという単位の使用が議論されていない。xmobarも似た問題を抱えている
help.autocorrectを1に設定すると、100ms待ってから続行する。新しい設定を追加すべきだったinnodb_flush_log_at_trx_commitにも似た失敗があるautocorrectを3秒に設定すると、危険な動作と安全な動作を区別できず、タイプミスしたコマンドでシェル履歴が汚染される
コマンドを打ち間違えたときは、すぐにCtrl-Cを押せば100msのタイムアウト前に取り消せる
decisecondsは非標準の単位。遅延時間をミリ秒や秒で指定するほうが一般的
反応時間は刺激の種類によって異なる。聴覚は視覚より速く、触覚が最も速い(90〜180 ms)