DEV Community

Kristian Quirapas
Kristian Quirapas

Posted on

Neo(Vim) on Steroids: vim-sneak + easymotion = hop.nvim

If you've been using Vim for a while now, you probably stumbled upon some navigation plugins like easymotion and vim-sneak. Unless... you're still stuck inside vim without any idea of how to quit. (SHEESH!)

Kidding aside...

easymotion is used for navigating the buffer by pressing a keystroke and marking the text you can jump to. This is demonstrated below. Github
A GIF demonstrating easymotion motions

vim-sneak, on the other hand, is also used for navigating your buffer. But instead of relying on marking texts with a keystroke like easymotion, it takes 1-2 characters as an input and marks the text that contains those input characters. As seen below. Github
A GIF demonstrating sneak motions

Okay, full disclosure, I lied.

I didn't actually use easymotion and vim-sneak in the GIFs above. I used hop.nvim.

hop.nvim is a navigation plugin that was created in order to solve easymotion's tendency to temporarily manipulate the buffer in order to mark texts and combines vim-sneak motion as a bonus. Github

You can combine the best of both worlds with one plugin and here's my Neovim configuration for it.

-- hop.nvim
require'hop'.setup()

-- normal mode (easymotion-like)
vim.api.nvim_set_keymap("n", "<Leader><Leader>b", "<cmd>HopWordBC<CR>", {noremap=true})
vim.api.nvim_set_keymap("n", "<Leader><Leader>w", "<cmd>HopWordAC<CR>", {noremap=true})
vim.api.nvim_set_keymap("n", "<Leader><Leader>j", "<cmd>HopLineAC<CR>", {noremap=true})
vim.api.nvim_set_keymap("n", "<Leader><Leader>k", "<cmd>HopLineBC<CR>", {noremap=true})

-- visual mode (easymotion-like)
vim.api.nvim_set_keymap("v", "<Leader><Leader>w", "<cmd>HopWordAC<CR>", {noremap=true})
vim.api.nvim_set_keymap("v", "<Leader><Leader>b", "<cmd>HopWordBC<CR>", {noremap=true})
vim.api.nvim_set_keymap("v", "<Leader><Leader>j", "<cmd>HopLineAC<CR>", {noremap=true})
vim.api.nvim_set_keymap("v", "<Leader><Leader>k", "<cmd>HopLineBC<CR>", {noremap=true})


-- normal mode (sneak-like)
vim.api.nvim_set_keymap("n", "s", "<cmd>HopChar2AC<CR>", {noremap=false})
vim.api.nvim_set_keymap("n", "S", "<cmd>HopChar2BC<CR>", {noremap=false})

-- visual mode (sneak-like)
vim.api.nvim_set_keymap("v", "s", "<cmd>HopChar2AC<CR>", {noremap=false})
vim.api.nvim_set_keymap("v", "S", "<cmd>HopChar2BC<CR>", {noremap=false})

Enter fullscreen mode Exit fullscreen mode

vim.api.nvim_set_keymap() is used to bind keystrokes to a command in your init.lua file.

For those using Vimscript / VimL

vim.api.nvim_set_keymap("n", "<Leader><Leader>b", "<cmd>HopWordBC<CR>", {noremap=true})

-- is equivalent to

nnoremap <Leader><Leader>b :HopWordBC<CR>
Enter fullscreen mode Exit fullscreen mode

There are more options for hop.nvim that you can check with :h hop but these are the ones I use.

  • HopWordBC looks for a word Before Cursor
  • HopWordAC looks for a word After Cursor
  • HopLineBC and HopLineAC does the same before and after cursor respectively, but looks for lines instead of words.
  • HopChar2AC takes 2 characters as an input and looks for texts that contain those 2 characters After Cursor
  • HopChar2BC does the same as HopChar2AC, but before the cursor

That's it! It's my first time posting in Dev.to and I'm glad to be part of this community.

Cheers!

Top comments (1)

Collapse
 
pnchinmay profile image
Chinmay Manas • Edited

Thank you
This helped
I'm facing just one problem:
Can't figure out how to make it work with init.vim
I've not yet ported to init.lua