世界を動かす技術を、日本語で。

Show HN: Hardtime.nvim – 悪習を断ち切り、Vimの動作をマスターする

2025年5月18日原文(github.com)

概要

  • hardtime.nvim はVim操作の悪習慣を防止し、効率的な移動を習得するためのNeovimプラグインです。
  • キーの連打制限や、より良い操作方法のヒント表示、行動レポート機能を提供します。
  • 推奨ワークフローや主な機能、インストール・設定方法について解説します。
  • カスタマイズ性が高く、ユーザー独自の設定やヒント追加も可能です。
  • プラグインの有効・無効切り替えや、レポート閲覧方法も紹介します。

hardtime.nvim:Vim操作の悪習慣を断ち切るNeovimプラグイン

主な特徴

  • 短時間内のキー連打をブロック し、無駄な操作を防止すること
  • より効率的なVimモーションのヒント を表示すること
  • よくある悪習慣のレポート を確認すること

推奨ワークフロー

  • hjklや矢印キー、マウスだけに頼るのではなく、以下の操作を推奨すること
    • 画面内の垂直移動: 相対ジャンプ (例: 5j, 12-)を使うこと
    • 画面外の垂直移動: CTRL-U, CTRL-D, CTRL-B, CTRL-F, gg, G を活用すること
    • 短距離の水平移動: 単語移動(w, W, b, B, e, E, ge, gE) を使うこと
    • 中・長距離の水平移動: f, F, t, T, ,, ;, 0, ^, $ を使うこと
    • operator + motion/text-object(例: ci{, y5j, dap)を多用すること
    • 括弧間のジャンプ: %や角括弧コマンド(:h [) を活用すること
  • 詳細は公式ブログ記事で確認すること

必要要件

  • Neovim v0.10.0以上 をインストールすること

インストール方法

  • お好みのパッケージマネージャーでインストールすること
    • 例:
      { "m4xshen/hardtime.nvim", lazy = false, dependencies = { "MunifTanjim/nui.nvim" }, opts = {}, },
      
  • init.luaでプラグインをセットアップすること
    • lazy.nvimを使い、optsを指定している場合は不要
      • 例: require("hardtime").setup()

ヒント表示設定

  • 挿入モードやビジュアルモードでヒントを表示したい場合、'showmode'をfalseに設定すること
  • モード表示も同時に見たい場合、以下の方法を検討すること
    • ステータスラインプラグイン(例: lualine.nvim)でモード表示し、'showmode'をfalseにすること
    • 'cmdheight'を2に設定し、ヒントとモード両方を表示すること
    • nvim-notifyでヒントを右上に通知として表示すること

使い方

  • Hardtimeは デフォルトで有効
  • 状態変更コマンド
    • :Hardtime enable:有効化すること
    • :Hardtime disable:無効化すること
    • :Hardtime toggle:切り替えること
  • よく表示されたヒントは:Hardtime reportで確認すること
    • ログファイル:~/.local/state/nvim/hardtime.nvim.log

設定例と主なオプション

  • 設定テーブルをsetup()またはoptsに渡してカスタマイズすること
  • デフォルト値を無効化したい場合、値をfalseに設定すること
    • 例:
      disabled_keys = { ["<Up>"] = false, ["<Space>"] = { "n", "x" }, },
      disabled_filetypes = { lazy = false, ["dapui*"] = false, },
      
  • 主なオプション一覧
    • max_time:連打とみなす最大時間(ms)を指定すること
    • max_count:最大連打回数を指定すること
    • disable_mouse:マウスサポートを無効化すること
    • hint:ヒント表示を有効化すること
    • notification:通知メッセージを有効化すること
    • timeout:通知表示時間(ms)またはfalseで無効化すること
    • allow_different_key:異なるキーでカウントをリセットすること
    • enabled:デフォルト有効・無効を切り替えること
    • resetting_keys:カウントをリセットするモードを指定すること
    • restricted_keys:カウント機構を発動するキーとモードを指定すること
    • restriction_mode:制限発動時の挙動("block"または"hint")を選択すること
    • disabled_keys:無効化するキーとモードを指定すること
    • disabled_filetypes:無効にするファイルタイプを指定すること
    • hints:ヒントパターンとメッセージを指定すること
    • callback:通知動作をカスタマイズする関数を指定すること
    • force_exit_insert_mode:挿入モードでの無操作時に強制終了すること
    • max_insert_idle_ms:挿入モードで許容する最大無操作時間(ms)を指定すること
    • ui:Hardtimeレポート用のポップアップUIをカスタマイズすること

ヒントカスタマイズ例

  • デフォルトヒント例
    • ["k%^"] = { message = function() return "Use - instead of k^" end, length = 2, }
    • ["d[tTfF].i"] = { message = function(keys) return "Use " .. "c" .. keys:sub(2, 3) .. " instead of " .. keys end, length = 4, }
  • 独自ヒントの追加方法は公式ディスカッションを参照すること

貢献・コントリビューション

  • 詳細は CONTRIBUTING.md を参照すること
  • コントリビューター一覧は公式リポジトリで確認すること

このプラグインを活用し、Vim操作の効率化と悪習慣の改善を実現すること。

Hackerたちの意見

これめっちゃいいね!こんなのが一般的な最適化エンジンにできるかな?つまり、使われているコマンドに対して利用可能な動きのコマンドのセットを一般化できれば、どんなプラットフォームにも適用できるってことだよね。ヘリックスでこれが見られたら最高だな。俺もカスタムエディタをいじってるんだけど、利用可能なコマンドの可視性は俺にとって優先事項だから、ここでの一般的な解決策はすごくエレガントだと思う。新しい機能にもスムーズに適応できそうだし。

ちょっと「完全」な解決策で、ヒントをくれない(だからvimの膨大な機能のプラグインサポートに頼らない)けど、直感を鍛えてくれるやつだね:全体のターミナルのレイテンシを上げる(参照:https://unix.stackexchange.com/questions/778196/how-to-add-d...)(コメントも見てね)っていうのを、ProxyCommandを使って自分のマシンにsshセッションでターミナルセッションを実行することで実現する。

ほら、同じ効果を得るためにemacsを使ってるだけだよ。

これ使っててめっちゃ助かってる!まとめてくれてありがとう。いくつかの小さな点で、悪い習慣だと思うことには同意できないな。例えば、Home/Endは編集モードの時は使えるべきだと思う。他のテキスト入力(エディタだけじゃなくて、ウェブサイトのテキスト入力エリアも)と調和するからね。

ありがとう!実はHardtimeのデフォルト設定ではHome/Endは許可されてるよ。君が使ってるのはAstroNvimだと思うけど、そのコミュニティのデフォルト設定ではそれが無効になってるんだよね:https://github.com/AstroNvim/astrocommunity/blob/main/lua/as...

これすごい!これがあれば、恐竜みたいな使い方をやめてneovimに切り替えられるかも。

vimとneovimを20年以上使ってるけど、ナビゲーションに関してはまだまだ原始人みたいだ。これが俺の悪い習慣を指摘してくるのは好きでもあり嫌いでもある。「Hardtime Report」は素晴らしい機能で、俺の悪い習慣がどれだけ根深いかを見せてくれる。これが改善の手助けになるか、怒ってアンインストールする羽目になるかのどっちかだな。

10年以上vimを使ってるけど、正直言ってhやjを繰り返して上下に移動することのデメリットが見えないんだよね(キーリピートの遅延を小さく調整すれば)。15jみたいに画面の数字を認識して、それからキーボードを見て打つよりも直感的だと思うし、上の数字の列は簡単にタッチタイピングできないからね。

これにはずっと悩まされてきたよ。タッチタイピングできるテンキーがあるけど、ホームポジションから手を離すなら、その時点でマウスを使った方がいいかもね。

へぇ、数字の列をタッチタイピングするのはそんなに難しくないと思うけど。まぁ、私の指が長いからかな。

テキストを移動するのに実用的な良いツールがあるのはいいよね。画面上をジャンプするのには、'easymotion'(「2文字押すだけで画面のどこにでもジャンプ」)やそのバリエーションが、使いやすさに対して素早くナビゲートできるから一番だと思う。

同意だね。これがクリエイターの思考プロセスを少し表しているのかなって思う。私にとって、カーソルが別の行から数行離れているとき、そこに行く一番簡単な方法はhやjを数回使うか、絶対行番号を見てggで行くことなんだ。相対的なジャンプはマクロの中でしか役に立たない。自分で相対的なジャンプを計算するのは、ただ数行上下したいだけの流れから完全に引き離されると思う。証拠はないけど、このパターンのクリエイターは同じようには感じていなかったんじゃないかな。

Hacker Newsで議論の続きを見る