Skip to content

Show next key clues. Part of 'mini.nvim' library.

License

Notifications You must be signed in to change notification settings

echasnovski/mini.clue

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

40 Commits
 
 
 
 
 
 
 
 

Repository files navigation

GitHub license

Show next key clues

See more details in Features and help file.


⦿ This is a part of mini.nvim library. Please use this link if you want to mention this module.

⦿ All contributions (issues, pull requests, discussions, etc.) are done inside of 'mini.nvim'.

⦿ See the repository page to learn about common design principles and configuration recipes.


If you want to help this project grow but don't know where to start, check out contributing guides of 'mini.nvim' or leave a Github star for 'mini.nvim' project and/or any its standalone Git repositories.

Demo

demo-clue.mp4

Features

  • Implement custom key query process to reach target key combination:

    • Starts after customizable opt-in triggers (mode + keys).

    • Each key press narrows down set of possible targets.

      Pressing <BS> removes previous user entry.

      Pressing <Esc> or <C-c> leads to an early stop.

      Doesn't depend on 'timeoutlen' and has basic support for 'langmap'.

    • Ends when there is at most one target left or user pressed <CR>. Results into emulating pressing all query keys plus possible postkeys.

  • Show window (after configurable delay) with clues. It lists available next keys along with their descriptions (auto generated from descriptions present keymaps and user-supplied clues; preferring the former).

  • Configurable "postkeys" for key combinations - keys which will be emulated after combination is reached during key query process.

  • Provide customizable sets of clues for common built-in keys/concepts:

    • g key.
    • z key.
    • Window commands.
    • Built-in completion.
    • Marks.
    • Registers.
  • Lua functions to disable/enable triggers globally or per buffer.

For more details see these tags in help:

  • *MiniClue-key-query-process*.
  • *MiniClue-examples*.
  • *MiniClue.config*.
  • *MiniClue.gen_clues*.

Notes:

  • Works on all supported versions but using Neovim>=0.9 is recommended.

  • There is no functionality to create mappings in order to clearly separate two different tasks.

    The best suggested practice is to manually create mappings with descriptions (desc field in options), as they will be automatically used inside clue window.

  • Triggers are implemented as special buffer-local mappings. This leads to several caveats:

    • They will override same regular buffer-local mappings and have precedence over global one.

      Example: having set <C-w> as Normal mode trigger means that there should not be another <C-w> mapping.

    • They need to be the latest created buffer-local mappings or they will not function properly. Most common indicator of this is that some mapping starts to work only after clue window is shown.

      Example: g is set as Normal mode trigger, but gcc from 'mini.comment' doesn't work right away. This is probably because there are some other buffer-local mappings starting with g which were created after mapping for g trigger. Most common places for this are in LSP server's on_attach or during tree-sitter start in buffer.

      To check if trigger is the most recent buffer-local mapping, execute :<mode-char>map <trigger-keys> (like :nmap g for previous example). Mapping for trigger should be the first listed.

      This module makes the best effort to work out of the box and cover most common cases, but it is not foolproof. The solution here is to ensure that triggers are created after making all buffer-local mappings: run either MiniClue.setup() or MiniClue.ensure_buf_triggers().

  • Descriptions from existing mappings take precedence over user-supplied clues. This is to ensure that information shown in clue window is as relevant as possible. To add/customize description of an already existing mapping, use MiniClue.set_mapping_desc().

  • Due to technical difficulties, there is no foolproof support for Operator-pending mode triggers (like a/i from 'mini.ai'):

    • Doesn't work as part of a command in "temporary Normal mode" (like after <C-o> in Insert mode) due to implementation difficulties.
    • Can have unexpected behavior with custom operators.
  • Has (mostly solved) issues with macros:

    • All triggers are disabled during macro recording due to technical reasons.
    • The @ and Q keys are specially mapped inside MiniClue.setup() to temporarily disable triggers.

Config quick start

local miniclue = require('mini.clue')
miniclue.setup({
  triggers = {
    -- Leader triggers
    { mode = 'n', keys = '<Leader>' },
    { mode = 'x', keys = '<Leader>' },

    -- Built-in completion
    { mode = 'i', keys = '<C-x>' },

    -- `g` key
    { mode = 'n', keys = 'g' },
    { mode = 'x', keys = 'g' },

    -- Marks
    { mode = 'n', keys = "'" },
    { mode = 'n', keys = '`' },
    { mode = 'x', keys = "'" },
    { mode = 'x', keys = '`' },

    -- Registers
    { mode = 'n', keys = '"' },
    { mode = 'x', keys = '"' },
    { mode = 'i', keys = '<C-r>' },
    { mode = 'c', keys = '<C-r>' },

    -- Window commands
    { mode = 'n', keys = '<C-w>' },

    -- `z` key
    { mode = 'n', keys = 'z' },
    { mode = 'x', keys = 'z' },
  },

  clues = {
    -- Enhance this by adding descriptions for <Leader> mapping groups
    miniclue.gen_clues.builtin_completion(),
    miniclue.gen_clues.g(),
    miniclue.gen_clues.marks(),
    miniclue.gen_clues.registers(),
    miniclue.gen_clues.windows(),
    miniclue.gen_clues.z(),
  },
})

Installation

This plugin can be installed as part of 'mini.nvim' library (recommended) or as a standalone Git repository.

There are two branches to install from:

  • main (default, recommended) will have latest development version of plugin. All changes since last stable release should be perceived as being in beta testing phase (meaning they already passed alpha-testing and are moderately settled).
  • stable will be updated only upon releases with code tested during public beta-testing phase in main branch.

Here are code snippets for some common installation methods (use only one):

With mini.deps
Github repo Branch Code snippet
'mini.nvim' library Main Follow recommended 'mini.deps' installation
Stable
Standalone plugin Main add('echasnovski/mini.clue')
Stable add({ source = 'echasnovski/mini.clue', checkout = 'stable' })
With folke/lazy.nvim
Github repo Branch Code snippet
'mini.nvim' library Main { 'echasnovski/mini.nvim', version = false },
Stable { 'echasnovski/mini.nvim', version = '*' },
Standalone plugin Main { 'echasnovski/mini.clue', version = false },
Stable { 'echasnovski/mini.clue', version = '*' },
With junegunn/vim-plug
Github repo Branch Code snippet
'mini.nvim' library Main Plug 'echasnovski/mini.nvim'
Stable Plug 'echasnovski/mini.nvim', { 'branch': 'stable' }
Standalone plugin Main Plug 'echasnovski/mini.clue'
Stable Plug 'echasnovski/mini.clue', { 'branch': 'stable' }

Important: don't forget to call require('mini.clue').setup() to enable its functionality. Needs to have triggers configured.

Note: if you are on Windows, there might be problems with too long file paths (like error: unable to create file <some file name>: Filename too long). Try doing one of the following:

  • Enable corresponding git global config value: git config --system core.longpaths true. Then try to reinstall.

Default config

-- No need to copy this inside `setup()`. Will be used automatically.
{
  -- Array of extra clues to show
  clues = {},

  -- Array of opt-in triggers which start custom key query process.
  -- **Needs to have something in order to show clues**.
  triggers = {},

  -- Clue window settings
  window = {
    -- Floating window config
    config = {},

    -- Delay before showing clue window
    delay = 1000,

    -- Keys to scroll inside the clue window
    scroll_down = '<C-d>',
    scroll_up = '<C-u>',
  },
}

Similar plugins

About

Show next key clues. Part of 'mini.nvim' library.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •  

Languages