Home

Awesome

<!-- panvimdoc-ignore-start --> <h1 align="center"> hardtime.nvim </h1> <div align="center"> <div>Establish good command workflow and quit bad habit.</div><br /> <img src="https://github.com/m4xshen/hardtime.nvim/assets/74842863/117a8d30-64ba-4ca9-8414-5c493cbe8a70" width="700" /> </div> <!-- panvimdoc-ignore-end -->

✨ Features

Recommended workflow:

  1. Avoid using the mouse and arrow keys if they are not at the home row of your keyboard.
  2. Use relative jump (eg: 5j 12-) for vertical movement within the screen.
  3. Use CTRL-U CTRL-D CTRL-B CTRL-F gg G for vertical movement outside the screen.
  4. Use word-motion (w W b B e E ge gE) for short-distance horizontal movement.
  5. Use f F t T , ; 0 ^ $ for medium to long-distance horizontal movement.
  6. Use operator + motion/text-object (eg: ci{ y5j dap) whenever possible.
  7. Use % and square bracket commands (see :h [) to jump between brackets.

Learn more in this blog post

⚡ Requirements

📦 Installation

  1. Install via your favorite package manager.
-- lazy.nvim
{
   "m4xshen/hardtime.nvim",
   dependencies = { "MunifTanjim/nui.nvim", "nvim-lua/plenary.nvim" },
   opts = {}
},
  1. Setup the plugin in your init.lua. This step is not needed with lazy.nvim if opts is set as above.
require("hardtime").setup()

If you want to see the hint messages in insert and visual mode, set the 'showmode' to false.

But if you want to see both the hint message and current mode you can setup with one of the following methods:

🚀 Usage

hardtime.nvim is enabled by default. You can change its state with the following commands:

You can view the most frequently seen hints with :Hardtime report.

Your log file is at ~/.local/state/nvim/hardtime.nvim.log.

🔧 Configuration

You can pass your config table into the setup() function or opts if you use lazy.nvim.

If the option is a boolean, number, or array, your value will overwrite the default configuration.

Example:

-- Add "oil" to the disabled_filetypes
disabled_filetypes = { "qf", "netrw", "NvimTree", "lazy", "mason", "oil" },

If the option is a table with a key = value pair, your value will overwrite the default if the key exists, and the pair will be appended to the default configuration if the key doesn't exist. You can set key = {} to remove the default key-value pair.

Example:

-- Remove <Up> keys and append <Space> to the disabled_keys
disabled_keys = {
   ["<Up>"] = {},
   ["<Space>"] = { "n", "x" },
},

Options

Option NameTypeDefault ValuaeMeaning
max_timenumber1000Maximum time (in milliseconds) to consider key presses as repeated.
max_countnumber3Maximum count of repeated key presses allowed within the max_time period.
disable_mousebooleantrueDisable mouse support.
hintbooleantrueEnable hint messages for better commands.
notificationbooleantrueEnable notification messages for restricted and disabled keys.
allow_different_keybooleantrueAllow different keys to reset the count.
enabledbooleantrueWhether the plugin is enabled by default or not.
resetting_keystable of strings/table pairSee ConfigKeys in what modes that reset the count.
restricted_keystable of strings/table pairSee ConfigKeys in what modes triggering the count mechanism.
restriction_modestring ("block" or "hint")"block"The behavior when restricted_keys trigger count mechanism.
disabled_keystable of strings/table pairSee ConfigKeys in what modes are disabled.
disabled_filetypestable of stringsSee Confighardtime.nvim is disabled under these filetypes.
hintstableSee Configkey is a string pattern you want to match, value is a table of hint message and pattern length. Learn more about Lua string pattern.
callbackfunction(text)vim.notifycallback function can be used to override the default notification behavior.
force_exit_insert_modebooleanfalseEnable forcing exit Insert mode if user is inactive in Insert mode.
max_insert_idle_msnumber5000Maximum amount of idle time, in milliseconds, allowed in Insert mode.

hints example

These are two default hints:

hints = {
   ["k%^"] = {
      message = function()
         return "Use - instead of k^" -- return the hint message you want to display
      end,
      length = 2, -- the length of actual key strokes that matches this pattern
   },
   ["d[tTfF].i"] = { -- this matches d + {t/T/f/F} + {any character} + i
      message = function(keys) -- keys is a string of key strokes that matches the pattern
         return "Use " .. "c" .. keys:sub(2, 3) .. " instead of " .. keys
         -- example: Use ct( instead of dt(i
      end,
      length = 4,
   },
}

Check out some examples of custom hint in discussion!

Default config

<!-- panvimdoc-ignore-start -->

🦾 Contributing

Please read CONTRIBUTING.md.

👥 Contributors

<a href="https://github.com/m4xshen/hardtime.nvim/graphs/contributors"> <img src="https://contrib.rocks/image?repo=m4xshen/hardtime.nvim" /> </a> <!-- panvimdoc-ignore-end -->