It's a feature-rich, but straight-forward Neovim plugin that improves default
f/t
hop abilities.
Additional features:
- Works in multiline;
- Works in
insert
mode; - Has the additional
post
offset; - Has the ability of stable next / previous hops (don't depend on last hop direction).
![](https://private-user-images.githubusercontent.com/17349169/291003237-5619ae36-217d-432b-8af9-6d27502f0965.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg4OTYwMTUsIm5iZiI6MTczODg5NTcxNSwicGF0aCI6Ii8xNzM0OTE2OS8yOTEwMDMyMzctNTYxOWFlMzYtMjE3ZC00MzJiLThhZjktNmQyNzUwMmYwOTY1LmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDAyMzUxNVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWE5MWE2YzFmNzM2ZTI2ZDU2ZTU0ZmIxZmUzODcxNDlmNWUzNDljOWM1N2I5MjNmN2MwZTRlZjg4NWZlZTEyODMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.Z9Yuozu_PTM6ZsOBz6yGx3JEjtz7nzdpVZ00lDQ9baw)
![](https://private-user-images.githubusercontent.com/17349169/291003283-cc761597-745d-421f-844c-1d028258a067.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg4OTYwMTUsIm5iZiI6MTczODg5NTcxNSwicGF0aCI6Ii8xNzM0OTE2OS8yOTEwMDMyODMtY2M3NjE1OTctNzQ1ZC00MjFmLTg0NGMtMWQwMjgyNThhMDY3LmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDAyMzUxNVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTEyMjNhNmVkMTg1ODg0ZGZjOGMyYTYzMGYzNWMyNGMxMDExOTA1NTM1NGM0NzY3NjBkNTg2N2FiZmJiYjYwZjAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.7oLGuqrrFW_loduHziT2ZabNo_XKcQs7XE4ovPC5n4U)
![](https://private-user-images.githubusercontent.com/17349169/291003291-9eca335a-335b-40d7-a0ca-d012b9357aa8.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg4OTYwMTUsIm5iZiI6MTczODg5NTcxNSwicGF0aCI6Ii8xNzM0OTE2OS8yOTEwMDMyOTEtOWVjYTMzNWEtMzM1Yi00MGQ3LWEwY2EtZDAxMmI5MzU3YWE4LmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDAyMzUxNVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWIxMjgyOWQ5NzFlNGIxNWJjYzQ3ZDkxMGJhYjBkYWU1NzY3Y2JmZTJiYTU4N2E3Mjg0YTZiNGRjMDg1NGI5NWUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.gnU46eIdZqTZg_6fk9fKrmz6d_shIgKH2SGhzJOiL5s)
local ft = require("improved-ft")
ft.setup({
-- Maps default f/F/t/T/;/, keys.
-- default: false
use_default_mappings = true,
-- Ignores case of the given characters.
-- default: false
ignore_char_case = true,
-- Takes a last hop direction into account during repetition hops
-- default: false
use_relative_repetition = true,
-- Uses direction-relative offsets during repetition hops.
-- default: false
use_relative_repetition_offsets = true,
})
Basic mappings
local map = function(key, fn, description)
vim.keymap.set({ "n", "x", "o" }, key, fn, {
desc = description,
expr = true,
})
end
map("f", ft.hop_forward_to_char, "Hop forward to a given char")
map("F", ft.hop_backward_to_char, "Hop backward to a given char")
map("t", ft.hop_forward_to_pre_char, "Hop forward before a given char")
map("T", ft.hop_backward_to_pre_char, "Hop backward before a given char")
map(";", ft.repeat_forward, "Repeat hop forward to a last given char")
map(",", ft.repeat_backward, "Repeat hop backward to a last given char")
Post character mappings
local map = function(key, fn, description)
vim.keymap.set({ "n", "x", "o" }, key, fn, {
desc = description,
expr = true,
})
end
map("s", ft.hop_forward_to_post_char, "Hop forward after a given char")
map("S", ft.hop_backward_to_post_char, "Hop backward after a given char")
Insert mode mappings
local imap = function(key, fn, description)
vim.keymap.set("i", key, fn, {
desc = description,
expr = true,
})
end
imap("<M-f>", ft.hop_forward_to_char, "Hop forward to a given char")
imap("<M-F>", ft.hop_backward_to_char, "Hop forward to a given char")
imap("<M-t>", ft.hop_forward_to_pre_char, "Hop forward before a given char")
imap("<M-T>", ft.hop_backward_to_pre_char, "Hop forward before a given char")
imap("<M-;>", ft.repeat_forward, "Repeat hop forward to a last given char")
imap("<M-,>", ft.repeat_backward, "Repeat hop backward to a last given char")