{"id":29483539,"url":"https://github.com/samiulsami/fftt-highlights.nvim","last_synced_at":"2026-05-14T12:34:09.640Z","repository":{"id":304417578,"uuid":"1017429722","full_name":"samiulsami/fFtT-highlights.nvim","owner":"samiulsami","description":"A highly customizable highlighter for the f/F/t/T motions in Neovim.","archived":false,"fork":false,"pushed_at":"2025-08-10T11:28:31.000Z","size":18268,"stargazers_count":24,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-08-10T13:14:55.334Z","etag":null,"topics":["neovim","neovim-lua-plugin","neovim-plugin"],"latest_commit_sha":null,"homepage":"","language":"Lua","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/samiulsami.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-07-10T14:16:27.000Z","updated_at":"2025-08-10T11:28:34.000Z","dependencies_parsed_at":null,"dependency_job_id":"a126a96c-9384-4d7e-a6f5-f15238dcd3ee","html_url":"https://github.com/samiulsami/fFtT-highlights.nvim","commit_stats":null,"previous_names":["samiulsami/fftt-highlights.nvim"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/samiulsami/fFtT-highlights.nvim","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/samiulsami%2FfFtT-highlights.nvim","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/samiulsami%2FfFtT-highlights.nvim/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/samiulsami%2FfFtT-highlights.nvim/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/samiulsami%2FfFtT-highlights.nvim/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/samiulsami","download_url":"https://codeload.github.com/samiulsami/fFtT-highlights.nvim/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/samiulsami%2FfFtT-highlights.nvim/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278692925,"owners_count":26029406,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-06T02:00:05.630Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["neovim","neovim-lua-plugin","neovim-plugin"],"created_at":"2025-07-15T04:00:36.408Z","updated_at":"2026-05-14T12:34:09.632Z","avatar_url":"https://github.com/samiulsami.png","language":"Lua","funding_links":[],"categories":[],"sub_categories":[],"readme":"# fFtT-highlights.nvim\n\nA highly configurable and opinionated highlighter for `f/F/t/T` motions, that borrows and improves upon features from [similar plugins](#-acknowledgements).\nExtremely minimalistic by default, but can be effortlessly configured to support any and all of the features mentioned below.\n\n---\n\n### ✨ Features\n- \u003cb\u003eSmart motions\u003c/b\u003e: Use `f/F/t/T` to jump to the next/previous occurence of the current character.\n- \u003cb\u003eUnique character indicators\u003c/b\u003e: Highlight characters that require 1-2 jumps to get to.\n- \u003cb\u003eNumbered matches\u003c/b\u003e: Show the number of jumps required to get to each matching character\n- \u003cb\u003eMacro \u0026 dot-repeat support.\u003c/b\u003e\n- \u003cb\u003eMulti-line support.\u003c/b\u003e\n- \u003cb\u003eSmart-case/No-case matching.\u003c/b\u003e\n\n⚠️ \u003cu\u003e\u003ci\u003eMost of the above are disabled by default, and must be enabled manually\u003c/i\u003e\u003c/u\u003e\n\n---\n\n### 📸 Showcase\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eDefault config\u003c/b\u003e\u003c/summary\u003e\n\n  ```lua\n  {}\n  ```\n\u003c/details\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./demo/default.gif\" alt=\"demo0\" /\u003e\n\u003c/p\u003e\n\n---\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eMultiline enabled\u003c/b\u003e\u003c/summary\u003e\n\n  ```lua\n  {\n\t  multi_line = {\n\t\t  enable = true,\n\t  }\n  }\n  ```\n\u003c/details\u003e\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./demo/Multiline.gif\" alt=\"demo1\" /\u003e\n\u003c/p\u003e\n\n---\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eJumpable chars highlighting:\u003c/b\u003e\u003c/summary\u003e\n\n  ```lua\n  {\n\t  multi_line = {\n\t\t  enable = true,\n\t  },\n\t  match_highlight = {\n\t\t  style = \"full\",\n\t  },\n\t  backdrop = {\n\t\t  style = {\n\t\t\t  on_key_press = \"full\",\n\t\t\t  show_in_motion = \"full\",\n\t\t  },\n\t  },\n\t  jumpable_chars = {\n\t\t  show_instantly_jumpable = \"always\",\n\t\t  show_multiline_jumpable = \"on_key_press\",\n\t  }\n  }\n  ``````\n\u003c/details\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./demo/Jumpable.gif\" alt=\"demo3\" /\u003e\n\u003c/p\u003e\n\n---\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eJump numbers next to each match:\u003c/b\u003e\u003c/summary\u003e\n\n  ```lua\n  {\n\t  multi_line = {\n\t\t  enable = true,\n\t  },\n\t  match_highlight = {\n\t\t  style = \"full\",\n\t\t  show_jump_numbers = true,\n\t  },\n\t  backdrop = {\n\t\t  style = {\n\t\t\t  on_key_press = \"full\",\n\t\t\t  show_in_motion = \"full\",\n\t\t  },\n\t  },\n  }\n  ```\n\u003c/details\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./demo/Jump numbers.gif\" alt=\"demo4\" /\u003e\n\u003c/p\u003e\n\n---\n### 🔍 Why make another highlighter?\n\u003cb\u003eBecause I wanted:\u003c/b\u003e\n- Macro/dot-repeat support.\n- A minimalistic highlighter that highlights no more than is necessary.\n- A feature-rich highlighter that lights up my entire buffer upon a keypress.\n- A near-native vi-like experience, then switching to a bloaty mess the next day, then switching back again.\n- Multiline searching/highlighting, but I didn't want to highlight the entire buffer with irrelevant matches.\n- A multiline version of `eyeliner.nvim` / `quick-scope.`\n- To localize the search to my current window, or a configurable range of lines.\n- It fun 👍.\n\n---\n### ⚙️ Requirements\n- Tested on Neovim \u003e= 0.11.0\n---\n### 🧰 Setup\n#### Lazy.nvim\n```lua\n{\n\t\"samiulsami/fFtT-highlights.nvim\",\n\tconfig = function()\n\t\t---@module \"fFtT-highlights\"\n\t\t---@type fFtT_highlights.opts\n\t\trequire(\"fFtT-highlights\"):setup({\n\t\t\t---See below for default configuration options\n\t\t})\n\tend,\n}\n```\n#### 🛠️ Default options\n```lua\n---@type fFtT_highlights.opts\nlocal default_opts = {\n\tf = \"f\", -- forward search key\n\tF = \"F\", -- backward search key\n\tt = \"t\", -- forward till key\n\tT = \"T\", -- backward till key\n\tnext = \";\", -- next key\n\tprev = \",\", -- previous key\n\treset_key = \"\u003cEsc\u003e\", -- key to reset highlights and cancel character-pending state\n\n\ton_reset = nil, -- callback to run when reset_key is pressed\n\n\tsmart_motions = false, -- whether to use f/F/t/T to go to next/previous characters\n\n\tfixed_direction = false, -- if true, next key (;) always searches right, prev key (,) always searches left (ignores case of last motion)\n\n\t-- options: \"default\" | \"smart_case\" | \"ignore_case\"\n\tcase_sensitivity = \"default\", -- case sensitivity\n\n\tmax_highlighted_lines_around_cursor = 300, -- max number of lines to consider above/below cursor for highlighting. Doesn't prevent jumps outside the range.\n\n\tmatch_highlight = {\n\t\tenable = true, -- enable/disable matching chars highlight.\n\n\t\t-- options: \"full\" | \"minimal\" | \"none\"\n\t\t-- \"full\": highlights all matches until the top/bottom border or multi_line.max_lines.\n\t\t-- \"minimal\": highlights the prefix/suffix matches in the current line, and upto exactly ONE match above/below the cursor if it exists.\n\t\t-- \"none\": disables highlighting for matching characters.\n\t\tstyle = \"minimal\", -- match highlighting style.\n\t\tpersist_matches = 0, -- number of matches to keep highlighted that the cursor passed over.\n\t\thighlight_radius = 500, -- consider at most this many characters for highlighting around the cursor.\n\t\tshow_jump_numbers = false, -- show the number of jumps required to get to each matching character.\n\t\tpriority = 1200, -- match highlight priority.\n\t},\n\n\tmulti_line = {\n\t\tenable = false, -- enable/disable multi-line search\n\t\tmax_lines = 300, -- max lines to consider for jumping/highlights above/below cursor if multi-line search is enabled.\n\t},\n\n\tbackdrop = {\n\t\tstyle = {\n\t\t\t-- options: \"full\" | \"minimal\" | \"none\"\n\t\t\t-- \"full\": highlights from the cursor line upto the top/bottom border.\n\t\t\t-- \"current_line\": highlights from the until the last matching character in the cursor line.\n\t\t\t-- \"none\": disables backdrop highlighting on keypress.\n\t\t\ton_key_press = \"full\", -- highlight backdrop on keypress.\n\n\t\t\t-- options: \"full\" | \"upto_next_line\" | \"current_line\" | \"none\"\n\t\t\t-- \"full\": highlights from the cursor line upto the top/bottom border.\n\t\t\t-- \"current_line\": highlights from the until the last matching character in the cursor line.\n\t\t\t-- \"upto_next_line\": highlights from the cursor line upto the next matching character in another line.\n\t\t\t-- \"none\": disables backdrop highlighting while in motion.\n\t\t\tshow_in_motion = \"upto_next_line\", -- highlight backdrop while in motion.\n\n\t\t\tpersist_backdrop = true, -- whether to persist backdrop highlight for persisted matches.\n\t\t},\n\t\tborder_extend = 0, -- extend backdrop border horizontally by this many characters.\n\t\tpriority = 800, -- backdrop highlight priority.\n\t},\n\n\tjumpable_chars = {\n\t\t-- options: \"always\" | \"on_key_press\" | \"never\"\n\t\tshow_instantly_jumpable = \"never\", -- when to highlight characters that can be jumped to in 1 step (options below have no effect when this is disabled).\n\t\tshow_secondary_jumpable = \"never\", -- when to highlight characters that can be jumped to in 2 steps.\n\t\tshow_all_jumpable_in_words = \"never\", -- when to highlight all characters that can be jumped to in 1 or 2 steps. Highlights one char per word by default.\n\t\tshow_multiline_jumpable = \"never\", -- when to highlight jumpable characters in other lines.\n\t\tmin_gap = 1, -- minimum gap between two jumpable characters.\n\t\tpriority = 1100, -- jumpable chars highlight priority.\n\t\tpriority_secondary = 1000, -- secondary jumpable chars highlight priority.\n\t},\n\n\tdisabled_filetypes = {}, -- disable the plugin for these filetypes (falls back to default keybindings)\n\n\tdisabled_buftypes = { \"nofile\" }, -- disable the plugin for these buftypes (falls back to default keybindings)\n}\n```\n---\n### 🖌️ Highlight groups\n| Name                   | Description                                              |\n| --------------------------------- | -------------------------------------------------------- |\n| `fFtTBackDropHighlight`           | Used for backdrop shading                                |\n| `fFtTMatchHighlight`              | Highlight for matched characters                         |\n| `fFtTJumpNumHighlight`            | Highlight for jump numbers (multi-digit)                 |\n| `fFtTJumpNumHighlightSingleDigit` | Highlight for jump numbers (single-digit only)           |\n| `fFtTUniqueHighlight`             | Highlight for unique jumpable characters                 |\n| `fFtTUniqueHighlightSecondary`    | Highlight for secondary unique characters (2-step jumps) |\n---\n### 💎 Acknowledgements\nThanks to the following plugins for their inspiration, and especially to `mini.jump` for solving macro compatibility and multi-line search in an elegant way.\n- [mini-jump](https://github.com/echasnovski/mini.nvim/blob/main/readmes/mini-jump.md) \n- [flash-nvim](https://github.com/folke/flash.nvim)\n- [clever-f](https://github.com/rhysd/clever-f.vim)\n- [jinh0/eyeliner.nvim](https://github.com/jinh0/eyeliner.nvim)\n- [quick-scope](https://github.com/unblevable/quick-scope)\n- [nvim-fFHighlight](https://github.com/kevinhwang91/nvim-fFHighlight)\n---\n#### 📋 TODO\n- [ ] Optimize highlighting performance and fault tolerance.\n- [ ] Fix redundancies.\n- [ ] Tests and/or ci.\n- [ ] Continue resisting the urge to add more useless features.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsamiulsami%2Ffftt-highlights.nvim","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsamiulsami%2Ffftt-highlights.nvim","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsamiulsami%2Ffftt-highlights.nvim/lists"}