hadronized / hop.nvim

Neovim motions on speed!
Other
2.49k stars 140 forks source link
                                          __
                                         / /_  ____  ____
                                        / __ \/ __ \/ __ \
                                       / / / / /_/ / /_/ /
                                      /_/ /_/\____/ .___/
                                                 /_/
                                  · Neovim motions on speed! ·

Install · Wiki · Screenshots · Discuss

Hop is an EasyMotion-like plugin allowing you to jump anywhere in a document with as few keystrokes as possible. It does so by annotating text in your buffer with hints, short string sequences for which each character represents a key to type to jump to the annotated text. Most of the time, those sequences’ lengths will be between 1 to 3 characters, making every jump target in your document reachable in a few keystrokes.

Deprecation notice

The project is unmaintained for probably forever. No more commits will be made, and since Neovim continues to be updated, it is very likely that this plugin will break / have bugs.

If you enjoyed phaazon/hop.nvim, you should really head over to the fork of @smoka7, smoka7/hop.nvim. Many bugs were fixed and new features added.

Thank you for being such a supportive and passionate community! ❤️

Motivation

Hop is a complete from-scratch rewrite of EasyMotion, a famous plugin to enhance the native motions of Vim. Even though EasyMotion is usable in Neovim, it suffers from a few drawbacks making it not comfortable to use with Neovim version >0.5 – at least at the time of writing these lines:

Hop is a modern take implementing this concept for the latest versions of Neovim.

Features

Getting started

This section will guide you through the list of steps you must take to be able to get started with Hop.

This plugin was written against Neovim 0.5, which is currently a nightly version. This plugin will not work:

Installation

Whatever solution / package manager you are using, you need to ensure that the setup Lua function is called at some point, otherwise the plugin will not work. If your package manager doesn’t support automatic calling of this function, you can call it manually after your plugin is installed:

require'hop'.setup()

To get a default experience. Feel free to customize later the setup invocation (:h hop.setup). If you do, then you will probably want to ensure the configuration is okay by running :checkhealth. Various checks will be performed by Hop to ensure everything is all good.

Important note about versioning

This plugin implements SemVer via git branches and tags. Versions are prefixed with a v, and only patch versions are git tags. Major and minor versions are git branches. You are very strongly advised to use a major version dependency to be sure your config will not break when Hop gets updated.

Using vim-plug

Plug 'phaazon/hop.nvim'

Using packer

use {
  'phaazon/hop.nvim',
  branch = 'v2', -- optional but strongly recommended
  config = function()
    -- you can configure Hop the way you like here; see :h hop-config
    require'hop'.setup { keys = 'etovxqpdygfblzhckisuran' }
  end
}

Nightly users

Hop supports nightly releases of Neovim. However, keep in mind that if you are on a nightly version, you must be on the last one. If you are not, then you are exposed to compatibility issues / breakage.

Usage

See the wiki.

Keybindings

Hop doesn’t set any keybindings; you will have to define them by yourself.

If you want to create a key binding from within Lua:

-- place this in one of your configuration file(s)
local hop = require('hop')
local directions = require('hop.hint').HintDirection
vim.keymap.set('', 'f', function()
  hop.hint_char1({ direction = directions.AFTER_CURSOR, current_line_only = true })
end, {remap=true})
vim.keymap.set('', 'F', function()
  hop.hint_char1({ direction = directions.BEFORE_CURSOR, current_line_only = true })
end, {remap=true})
vim.keymap.set('', 't', function()
  hop.hint_char1({ direction = directions.AFTER_CURSOR, current_line_only = true, hint_offset = -1 })
end, {remap=true})
vim.keymap.set('', 'T', function()
  hop.hint_char1({ direction = directions.BEFORE_CURSOR, current_line_only = true, hint_offset = 1 })
end, {remap=true})

Chat

Join the discussion on the official Matrix room!