retrovim 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.conda/retrovim.yaml +259 -0
- package/.conda/terax.icns +0 -0
- package/.conda/terax.ico +0 -0
- package/.conda/terax.png +0 -0
- package/.github/workflows/release.yml +95 -0
- package/.gitmodules +3 -0
- package/.npm/kanata_touchcursor.js +28 -0
- package/.npm/nvim.js +26 -0
- package/.npm/yazi.js +26 -0
- package/.npm/zsh.js +17 -0
- package/.pip/kanata_touchcursor/__init__.py +28 -0
- package/.pip/nvim/__init__.py +31 -0
- package/.pip/yazi/__init__.py +31 -0
- package/.pip/zsh/__init__.py +22 -0
- package/CHANGELOG.md +26 -0
- package/LICENSE +674 -0
- package/README.md +336 -0
- package/kanata/touchcursor.kbd +164 -0
- package/nvim/init.lua +813 -0
- package/nvim/plugins/mini.nvim/.github/DISCUSSION_TEMPLATE/q-a.yml +72 -0
- package/nvim/plugins/mini.nvim/.github/ISSUE_TEMPLATE/bug-report.yml +136 -0
- package/nvim/plugins/mini.nvim/.github/ISSUE_TEMPLATE/config.yml +5 -0
- package/nvim/plugins/mini.nvim/.github/ISSUE_TEMPLATE/feature-request.yml +75 -0
- package/nvim/plugins/mini.nvim/.github/PULL_REQUEST_TEMPLATE.md +2 -0
- package/nvim/plugins/mini.nvim/.github/workflows/quality-control.yml +150 -0
- package/nvim/plugins/mini.nvim/.pre-commit-config.yaml +20 -0
- package/nvim/plugins/mini.nvim/.stylua.toml +7 -0
- package/nvim/plugins/mini.nvim/.styluaignore +1 -0
- package/nvim/plugins/mini.nvim/CHANGELOG.md +1894 -0
- package/nvim/plugins/mini.nvim/CODE_OF_CONDUCT.md +132 -0
- package/nvim/plugins/mini.nvim/CONTRIBUTING.md +331 -0
- package/nvim/plugins/mini.nvim/LICENSE +21 -0
- package/nvim/plugins/mini.nvim/MAINTAINING.md +330 -0
- package/nvim/plugins/mini.nvim/Makefile +51 -0
- package/nvim/plugins/mini.nvim/README.md +261 -0
- package/nvim/plugins/mini.nvim/TESTING.md +1011 -0
- package/nvim/plugins/mini.nvim/benchmarks/starter/README.md +35 -0
- package/nvim/plugins/mini.nvim/benchmarks/starter/benchmark.sh +56 -0
- package/nvim/plugins/mini.nvim/benchmarks/starter/init-files/init_dashboard-alpha.lua +21 -0
- package/nvim/plugins/mini.nvim/benchmarks/starter/init-files/init_dashboard-original.lua +17 -0
- package/nvim/plugins/mini.nvim/benchmarks/starter/init-files/init_dashboard-starter.lua +18 -0
- package/nvim/plugins/mini.nvim/benchmarks/starter/init-files/init_empty.lua +4 -0
- package/nvim/plugins/mini.nvim/benchmarks/starter/init-files/init_starter-default.lua +7 -0
- package/nvim/plugins/mini.nvim/benchmarks/starter/init-files/init_startify-alpha.lua +10 -0
- package/nvim/plugins/mini.nvim/benchmarks/starter/init-files/init_startify-original.lua +7 -0
- package/nvim/plugins/mini.nvim/benchmarks/starter/init-files/init_startify-starter.lua +20 -0
- package/nvim/plugins/mini.nvim/benchmarks/starter/install.sh +10 -0
- package/nvim/plugins/mini.nvim/benchmarks/starter/make_summary.py +68 -0
- package/nvim/plugins/mini.nvim/benchmarks/starter/startup-summary.md +10 -0
- package/nvim/plugins/mini.nvim/colors/miniautumn.lua +55 -0
- package/nvim/plugins/mini.nvim/colors/minicyan.lua +95 -0
- package/nvim/plugins/mini.nvim/colors/minischeme.lua +95 -0
- package/nvim/plugins/mini.nvim/colors/minispring.lua +53 -0
- package/nvim/plugins/mini.nvim/colors/minisummer.lua +49 -0
- package/nvim/plugins/mini.nvim/colors/miniwinter.lua +51 -0
- package/nvim/plugins/mini.nvim/colors/randomhue.lua +16 -0
- package/nvim/plugins/mini.nvim/doc/mini-ai.txt +889 -0
- package/nvim/plugins/mini.nvim/doc/mini-align.txt +923 -0
- package/nvim/plugins/mini.nvim/doc/mini-animate.txt +937 -0
- package/nvim/plugins/mini.nvim/doc/mini-base16.txt +285 -0
- package/nvim/plugins/mini.nvim/doc/mini-basics.txt +359 -0
- package/nvim/plugins/mini.nvim/doc/mini-bracketed.txt +622 -0
- package/nvim/plugins/mini.nvim/doc/mini-bufremove.txt +123 -0
- package/nvim/plugins/mini.nvim/doc/mini-clue.txt +760 -0
- package/nvim/plugins/mini.nvim/doc/mini-cmdline.txt +392 -0
- package/nvim/plugins/mini.nvim/doc/mini-colors.txt +880 -0
- package/nvim/plugins/mini.nvim/doc/mini-comment.txt +230 -0
- package/nvim/plugins/mini.nvim/doc/mini-completion.txt +477 -0
- package/nvim/plugins/mini.nvim/doc/mini-cursorword.txt +105 -0
- package/nvim/plugins/mini.nvim/doc/mini-deps.txt +590 -0
- package/nvim/plugins/mini.nvim/doc/mini-diff.txt +661 -0
- package/nvim/plugins/mini.nvim/doc/mini-doc.txt +434 -0
- package/nvim/plugins/mini.nvim/doc/mini-extra.txt +856 -0
- package/nvim/plugins/mini.nvim/doc/mini-files.txt +1018 -0
- package/nvim/plugins/mini.nvim/doc/mini-fuzzy.txt +160 -0
- package/nvim/plugins/mini.nvim/doc/mini-git.txt +425 -0
- package/nvim/plugins/mini.nvim/doc/mini-hipatterns.txt +489 -0
- package/nvim/plugins/mini.nvim/doc/mini-hues.txt +420 -0
- package/nvim/plugins/mini.nvim/doc/mini-icons.txt +508 -0
- package/nvim/plugins/mini.nvim/doc/mini-indentscope.txt +485 -0
- package/nvim/plugins/mini.nvim/doc/mini-input.txt +932 -0
- package/nvim/plugins/mini.nvim/doc/mini-jump.txt +202 -0
- package/nvim/plugins/mini.nvim/doc/mini-jump2d.txt +525 -0
- package/nvim/plugins/mini.nvim/doc/mini-keymap.txt +449 -0
- package/nvim/plugins/mini.nvim/doc/mini-map.txt +717 -0
- package/nvim/plugins/mini.nvim/doc/mini-misc.txt +431 -0
- package/nvim/plugins/mini.nvim/doc/mini-move.txt +181 -0
- package/nvim/plugins/mini.nvim/doc/mini-notify.txt +434 -0
- package/nvim/plugins/mini.nvim/doc/mini-nvim.txt +431 -0
- package/nvim/plugins/mini.nvim/doc/mini-operators.txt +472 -0
- package/nvim/plugins/mini.nvim/doc/mini-pairs.txt +346 -0
- package/nvim/plugins/mini.nvim/doc/mini-pick.txt +1535 -0
- package/nvim/plugins/mini.nvim/doc/mini-sessions.txt +239 -0
- package/nvim/plugins/mini.nvim/doc/mini-snippets.txt +1291 -0
- package/nvim/plugins/mini.nvim/doc/mini-splitjoin.txt +536 -0
- package/nvim/plugins/mini.nvim/doc/mini-starter.txt +618 -0
- package/nvim/plugins/mini.nvim/doc/mini-statusline.txt +361 -0
- package/nvim/plugins/mini.nvim/doc/mini-surround.txt +863 -0
- package/nvim/plugins/mini.nvim/doc/mini-tabline.txt +151 -0
- package/nvim/plugins/mini.nvim/doc/mini-test.txt +966 -0
- package/nvim/plugins/mini.nvim/doc/mini-trailspace.txt +91 -0
- package/nvim/plugins/mini.nvim/doc/mini-visits.txt +937 -0
- package/nvim/plugins/mini.nvim/logo.png +0 -0
- package/nvim/plugins/mini.nvim/lua/mini/ai.lua +2244 -0
- package/nvim/plugins/mini.nvim/lua/mini/align.lua +2076 -0
- package/nvim/plugins/mini.nvim/lua/mini/animate.lua +2127 -0
- package/nvim/plugins/mini.nvim/lua/mini/base16.lua +1752 -0
- package/nvim/plugins/mini.nvim/lua/mini/basics.lua +772 -0
- package/nvim/plugins/mini.nvim/lua/mini/bracketed.lua +2013 -0
- package/nvim/plugins/mini.nvim/lua/mini/bufremove.lua +283 -0
- package/nvim/plugins/mini.nvim/lua/mini/clue.lua +2096 -0
- package/nvim/plugins/mini.nvim/lua/mini/cmdline.lua +1182 -0
- package/nvim/plugins/mini.nvim/lua/mini/colors.lua +2483 -0
- package/nvim/plugins/mini.nvim/lua/mini/comment.lua +586 -0
- package/nvim/plugins/mini.nvim/lua/mini/completion.lua +2094 -0
- package/nvim/plugins/mini.nvim/lua/mini/cursorword.lua +311 -0
- package/nvim/plugins/mini.nvim/lua/mini/deps.lua +1660 -0
- package/nvim/plugins/mini.nvim/lua/mini/diff.lua +1938 -0
- package/nvim/plugins/mini.nvim/lua/mini/doc.lua +1371 -0
- package/nvim/plugins/mini.nvim/lua/mini/extra.lua +2290 -0
- package/nvim/plugins/mini.nvim/lua/mini/files.lua +3145 -0
- package/nvim/plugins/mini.nvim/lua/mini/fuzzy.lua +356 -0
- package/nvim/plugins/mini.nvim/lua/mini/git.lua +1737 -0
- package/nvim/plugins/mini.nvim/lua/mini/hipatterns.lua +1042 -0
- package/nvim/plugins/mini.nvim/lua/mini/hues.lua +2088 -0
- package/nvim/plugins/mini.nvim/lua/mini/icons.lua +2254 -0
- package/nvim/plugins/mini.nvim/lua/mini/indentscope.lua +1158 -0
- package/nvim/plugins/mini.nvim/lua/mini/init.lua +427 -0
- package/nvim/plugins/mini.nvim/lua/mini/input.lua +2183 -0
- package/nvim/plugins/mini.nvim/lua/mini/jump.lua +609 -0
- package/nvim/plugins/mini.nvim/lua/mini/jump2d.lua +1244 -0
- package/nvim/plugins/mini.nvim/lua/mini/keymap.lua +880 -0
- package/nvim/plugins/mini.nvim/lua/mini/map.lua +1709 -0
- package/nvim/plugins/mini.nvim/lua/mini/misc.lua +969 -0
- package/nvim/plugins/mini.nvim/lua/mini/move.lua +509 -0
- package/nvim/plugins/mini.nvim/lua/mini/notify.lua +938 -0
- package/nvim/plugins/mini.nvim/lua/mini/operators.lua +1349 -0
- package/nvim/plugins/mini.nvim/lua/mini/pairs.lua +657 -0
- package/nvim/plugins/mini.nvim/lua/mini/pick.lua +3876 -0
- package/nvim/plugins/mini.nvim/lua/mini/sessions.lua +689 -0
- package/nvim/plugins/mini.nvim/lua/mini/snippets.lua +2828 -0
- package/nvim/plugins/mini.nvim/lua/mini/splitjoin.lua +1132 -0
- package/nvim/plugins/mini.nvim/lua/mini/starter.lua +1599 -0
- package/nvim/plugins/mini.nvim/lua/mini/statusline.lua +686 -0
- package/nvim/plugins/mini.nvim/lua/mini/surround.lua +2388 -0
- package/nvim/plugins/mini.nvim/lua/mini/tabline.lua +564 -0
- package/nvim/plugins/mini.nvim/lua/mini/test.lua +2516 -0
- package/nvim/plugins/mini.nvim/lua/mini/trailspace.lua +215 -0
- package/nvim/plugins/mini.nvim/lua/mini/visits.lua +1577 -0
- package/nvim/plugins/mini.nvim/readmes/mini-ai.md +190 -0
- package/nvim/plugins/mini.nvim/readmes/mini-align.md +203 -0
- package/nvim/plugins/mini.nvim/readmes/mini-animate.md +214 -0
- package/nvim/plugins/mini.nvim/readmes/mini-base16.md +198 -0
- package/nvim/plugins/mini.nvim/readmes/mini-basics.md +184 -0
- package/nvim/plugins/mini.nvim/readmes/mini-bracketed.md +193 -0
- package/nvim/plugins/mini.nvim/readmes/mini-bufremove.md +139 -0
- package/nvim/plugins/mini.nvim/readmes/mini-clue.md +260 -0
- package/nvim/plugins/mini.nvim/readmes/mini-cmdline.md +183 -0
- package/nvim/plugins/mini.nvim/readmes/mini-colors.md +169 -0
- package/nvim/plugins/mini.nvim/readmes/mini-comment.md +183 -0
- package/nvim/plugins/mini.nvim/readmes/mini-completion.md +217 -0
- package/nvim/plugins/mini.nvim/readmes/mini-cursorword.md +137 -0
- package/nvim/plugins/mini.nvim/readmes/mini-deps.md +271 -0
- package/nvim/plugins/mini.nvim/readmes/mini-diff.md +289 -0
- package/nvim/plugins/mini.nvim/readmes/mini-doc.md +198 -0
- package/nvim/plugins/mini.nvim/readmes/mini-extra.md +158 -0
- package/nvim/plugins/mini.nvim/readmes/mini-files.md +247 -0
- package/nvim/plugins/mini.nvim/readmes/mini-fuzzy.md +134 -0
- package/nvim/plugins/mini.nvim/readmes/mini-git.md +168 -0
- package/nvim/plugins/mini.nvim/readmes/mini-hipatterns.md +176 -0
- package/nvim/plugins/mini.nvim/readmes/mini-hues.md +285 -0
- package/nvim/plugins/mini.nvim/readmes/mini-icons.md +183 -0
- package/nvim/plugins/mini.nvim/readmes/mini-indentscope.md +191 -0
- package/nvim/plugins/mini.nvim/readmes/mini-input.md +163 -0
- package/nvim/plugins/mini.nvim/readmes/mini-jump.md +161 -0
- package/nvim/plugins/mini.nvim/readmes/mini-jump2d.md +197 -0
- package/nvim/plugins/mini.nvim/readmes/mini-keymap.md +205 -0
- package/nvim/plugins/mini.nvim/readmes/mini-map.md +191 -0
- package/nvim/plugins/mini.nvim/readmes/mini-misc.md +145 -0
- package/nvim/plugins/mini.nvim/readmes/mini-move.md +163 -0
- package/nvim/plugins/mini.nvim/readmes/mini-notify.md +175 -0
- package/nvim/plugins/mini.nvim/readmes/mini-operators.md +193 -0
- package/nvim/plugins/mini.nvim/readmes/mini-pairs.md +158 -0
- package/nvim/plugins/mini.nvim/readmes/mini-pick.md +340 -0
- package/nvim/plugins/mini.nvim/readmes/mini-sessions.md +164 -0
- package/nvim/plugins/mini.nvim/readmes/mini-snippets.md +373 -0
- package/nvim/plugins/mini.nvim/readmes/mini-splitjoin.md +194 -0
- package/nvim/plugins/mini.nvim/readmes/mini-starter.md +176 -0
- package/nvim/plugins/mini.nvim/readmes/mini-statusline.md +155 -0
- package/nvim/plugins/mini.nvim/readmes/mini-surround.md +190 -0
- package/nvim/plugins/mini.nvim/readmes/mini-tabline.md +156 -0
- package/nvim/plugins/mini.nvim/readmes/mini-test.md +175 -0
- package/nvim/plugins/mini.nvim/readmes/mini-trailspace.md +137 -0
- package/nvim/plugins/mini.nvim/readmes/mini-visits.md +243 -0
- package/nvim/plugins/mini.nvim/scripts/dual_log.sh +13 -0
- package/nvim/plugins/mini.nvim/scripts/dual_push.sh +15 -0
- package/nvim/plugins/mini.nvim/scripts/dual_release.sh +102 -0
- package/nvim/plugins/mini.nvim/scripts/dual_sync.sh +115 -0
- package/nvim/plugins/mini.nvim/scripts/init-deps-example.lua +59 -0
- package/nvim/plugins/mini.nvim/scripts/lint-filename-length.sh +16 -0
- package/nvim/plugins/mini.nvim/scripts/lintcommit-ci.sh +18 -0
- package/nvim/plugins/mini.nvim/scripts/lintcommit.lua +393 -0
- package/nvim/plugins/mini.nvim/scripts/minidoc.lua +57 -0
- package/nvim/plugins/mini.nvim/scripts/minimal_init.lua +28 -0
- package/nvim/plugins/mini.nvim/scripts/minitest.lua +4 -0
- package/package.json +16 -0
- package/pyproject.toml +43 -0
- package/yazi/init.lua +12 -0
- package/yazi/keymap.toml +114 -0
- package/yazi/lesskey +5 -0
- package/yazi/plugins/bookmarks.yazi/main.lua +86 -0
- package/yazi/plugins/cd-git-root.yazi/main.lua +31 -0
- package/yazi/plugins/smart-enter.yazi/main.lua +11 -0
- package/yazi/theme.toml +26 -0
- package/yazi/yazi.toml +15 -0
- package/zsh/.zshrc +145 -0
- package/zsh/starship.toml +20 -0
- package/zsh/zsh-patina.toml +2 -0
|
@@ -0,0 +1,609 @@
|
|
|
1
|
+
--- *mini.jump* Jump to next/previous single character
|
|
2
|
+
---
|
|
3
|
+
--- MIT License Copyright (c) 2021 Evgeni Chasnovski, Adam Blažek
|
|
4
|
+
|
|
5
|
+
--- Features:
|
|
6
|
+
--- - Extend f, F, t, T to work on multiple lines.
|
|
7
|
+
---
|
|
8
|
+
--- - Repeat jump by pressing f, F, t, T again. It is reset when cursor moved
|
|
9
|
+
--- as a result of not jumping or timeout after idle time (duration
|
|
10
|
+
--- customizable).
|
|
11
|
+
---
|
|
12
|
+
--- - Highlight (after customizable delay) all possible target characters and
|
|
13
|
+
--- stop it after some (customizable) idle time.
|
|
14
|
+
---
|
|
15
|
+
--- - Normal, Visual, and Operator-pending (with dot-repeat as in clean Neovim)
|
|
16
|
+
--- modes are supported.
|
|
17
|
+
---
|
|
18
|
+
--- This module follows vim's |'ignorecase'| and |'smartcase'| options. When
|
|
19
|
+
--- |'ignorecase'| is set, f, F, t, T will match case-insensitively. When
|
|
20
|
+
--- |'smartcase'| is also set, f, F, t, T will only match lowercase
|
|
21
|
+
--- characters case-insensitively.
|
|
22
|
+
---
|
|
23
|
+
--- # Setup ~
|
|
24
|
+
---
|
|
25
|
+
--- This module needs a setup with `require('mini.jump').setup({})`
|
|
26
|
+
--- (replace `{}` with your `config` table). It will create global Lua table
|
|
27
|
+
--- `MiniJump` which you can use for scripting or manually (with
|
|
28
|
+
--- `:lua MiniJump.*`).
|
|
29
|
+
---
|
|
30
|
+
--- See |MiniJump.config| for `config` structure and default values.
|
|
31
|
+
---
|
|
32
|
+
--- You can override runtime config settings locally to buffer inside
|
|
33
|
+
--- `vim.b.minijump_config` which should have same structure as
|
|
34
|
+
--- `MiniJump.config`. See |mini.nvim-buffer-local-config| for more details.
|
|
35
|
+
---
|
|
36
|
+
--- To stop module from showing non-error feedback, set `config.silent = true`.
|
|
37
|
+
---
|
|
38
|
+
--- # Highlight groups ~
|
|
39
|
+
--- *MiniJump-hl-groups*
|
|
40
|
+
---
|
|
41
|
+
--- - `MiniJump` - all possible cursor positions.
|
|
42
|
+
---
|
|
43
|
+
--- To change any highlight group, set it directly with |nvim_set_hl()|.
|
|
44
|
+
---
|
|
45
|
+
--- # Disabling ~
|
|
46
|
+
---
|
|
47
|
+
--- To disable core functionality, set `vim.g.minijump_disable` (globally) or
|
|
48
|
+
--- `vim.b.minijump_disable` (for a buffer) to `true`. Considering high number of
|
|
49
|
+
--- different scenarios and customization intentions, writing exact rules for
|
|
50
|
+
--- disabling module's functionality is left to user. See
|
|
51
|
+
--- |mini.nvim-disabling-recipes| for common recipes.
|
|
52
|
+
---@tag MiniJump
|
|
53
|
+
|
|
54
|
+
--- To allow user customization and integration of external tools, certain |User|
|
|
55
|
+
--- autocommand events are triggered under common circumstances:
|
|
56
|
+
---
|
|
57
|
+
--- - `MiniJumpGetTarget` - before asking user for the target. Use |MiniJump.state|
|
|
58
|
+
--- for more information about the upcoming jump.
|
|
59
|
+
--- - `MiniJumpStart` - after jumping has started.
|
|
60
|
+
--- - `MiniJumpJump` - after performing a jump.
|
|
61
|
+
--- - `MiniJumpStop` - after jumping is stopped.
|
|
62
|
+
---@tag MiniJump-events
|
|
63
|
+
|
|
64
|
+
---@alias __jump_target string|nil The string to jump to.
|
|
65
|
+
---@alias __jump_backward boolean|nil Whether to jump backward.
|
|
66
|
+
---@alias __jump_till boolean|nil Whether to jump just before/after the match instead of
|
|
67
|
+
--- exactly on target. This includes positioning cursor past the end of
|
|
68
|
+
--- previous/current line. Note that with backward jump this might lead to
|
|
69
|
+
--- cursor being on target if can't be put past the line.
|
|
70
|
+
---@alias __jump_n_times number|nil Number of times to perform consecutive jumps.
|
|
71
|
+
|
|
72
|
+
-- Module definition ==========================================================
|
|
73
|
+
local MiniJump = {}
|
|
74
|
+
local H = {}
|
|
75
|
+
|
|
76
|
+
--- Module setup
|
|
77
|
+
---
|
|
78
|
+
---@param config table|nil Module config table. See |MiniJump.config|.
|
|
79
|
+
---
|
|
80
|
+
---@usage >lua
|
|
81
|
+
--- require('mini.jump').setup() -- use default config
|
|
82
|
+
--- -- OR
|
|
83
|
+
--- require('mini.jump').setup({}) -- replace {} with your config table
|
|
84
|
+
--- <
|
|
85
|
+
MiniJump.setup = function(config)
|
|
86
|
+
-- TODO: Remove after Neovim=0.9 support is dropped
|
|
87
|
+
if vim.fn.has('nvim-0.10') == 0 then
|
|
88
|
+
vim.notify(
|
|
89
|
+
'(mini.jump) Neovim<0.10 is soft deprecated (module works but is not supported).'
|
|
90
|
+
.. " It will be deprecated after the next 'mini.nvim' release (module might not work)."
|
|
91
|
+
.. ' Please update your Neovim version.'
|
|
92
|
+
)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
-- Export module
|
|
96
|
+
_G.MiniJump = MiniJump
|
|
97
|
+
|
|
98
|
+
-- Setup config
|
|
99
|
+
config = H.setup_config(config)
|
|
100
|
+
|
|
101
|
+
-- Apply config
|
|
102
|
+
H.apply_config(config)
|
|
103
|
+
|
|
104
|
+
-- Define behavior
|
|
105
|
+
H.create_autocommands()
|
|
106
|
+
|
|
107
|
+
-- Create default highlighting
|
|
108
|
+
H.create_default_hl()
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
--- Defaults ~
|
|
112
|
+
---@eval return MiniDoc.afterlines_to_code(MiniDoc.current.eval_section)
|
|
113
|
+
MiniJump.config = {
|
|
114
|
+
-- Module mappings. Use `''` (empty string) to disable one.
|
|
115
|
+
mappings = {
|
|
116
|
+
forward = 'f',
|
|
117
|
+
backward = 'F',
|
|
118
|
+
forward_till = 't',
|
|
119
|
+
backward_till = 'T',
|
|
120
|
+
repeat_jump = ';',
|
|
121
|
+
},
|
|
122
|
+
|
|
123
|
+
-- Delay values (in ms) for different functionalities. Set any of them to
|
|
124
|
+
-- a very big number (like 10^7) to virtually disable.
|
|
125
|
+
delay = {
|
|
126
|
+
-- Delay between jump and highlighting all possible jumps
|
|
127
|
+
highlight = 250,
|
|
128
|
+
|
|
129
|
+
-- Delay between jump and automatic stop if idle (no jump is done)
|
|
130
|
+
idle_stop = 10000000,
|
|
131
|
+
},
|
|
132
|
+
|
|
133
|
+
-- Whether to disable showing non-error feedback
|
|
134
|
+
-- This also affects (purely informational) helper messages shown after
|
|
135
|
+
-- idle time if user input is required.
|
|
136
|
+
silent = false,
|
|
137
|
+
}
|
|
138
|
+
--minidoc_afterlines_end
|
|
139
|
+
|
|
140
|
+
-- Module data ================================================================
|
|
141
|
+
--- Data about jumping state
|
|
142
|
+
---
|
|
143
|
+
--- It stores various information used in this module. All elements, except
|
|
144
|
+
--- `jumping`, is about the latest jump. They are used as default values for
|
|
145
|
+
--- similar arguments.
|
|
146
|
+
---
|
|
147
|
+
---@usage This can be used to define mappings which depend on state; either as
|
|
148
|
+
--- a standalone mapping or part of |MiniKeymap.map_multistep()|. For example: >lua
|
|
149
|
+
---
|
|
150
|
+
--- -- Stop jumping after pressing `<Esc>`
|
|
151
|
+
--- local jump_stop = function()
|
|
152
|
+
--- if not MiniJump.state.jumping then return '<Esc>' end
|
|
153
|
+
--- MiniJump.stop_jumping()
|
|
154
|
+
--- end
|
|
155
|
+
--- local opts = { expr = true, desc = 'Stop jumping' }
|
|
156
|
+
--- vim.keymap.set({ 'n', 'x', 'o' }, '<Esc>', jump_stop, opts)
|
|
157
|
+
--- <
|
|
158
|
+
---@class JumpingState
|
|
159
|
+
---
|
|
160
|
+
---@field target __jump_target
|
|
161
|
+
---@field backward __jump_backward
|
|
162
|
+
---@field till __jump_till
|
|
163
|
+
---@field n_times __jump_n_times
|
|
164
|
+
---@field mode string Mode of latest jump (output of |mode()| with non-zero argument).
|
|
165
|
+
---@field jumping boolean Whether module is currently in "jumping mode": usage of
|
|
166
|
+
--- |MiniJump.smart_jump()| and all mappings won't require target.
|
|
167
|
+
---@text
|
|
168
|
+
--- Initial values:
|
|
169
|
+
---@eval return MiniDoc.afterlines_to_code(MiniDoc.current.eval_section)
|
|
170
|
+
MiniJump.state = {
|
|
171
|
+
target = nil,
|
|
172
|
+
backward = false,
|
|
173
|
+
till = false,
|
|
174
|
+
n_times = 1,
|
|
175
|
+
mode = nil,
|
|
176
|
+
jumping = false,
|
|
177
|
+
}
|
|
178
|
+
--minidoc_afterlines_end
|
|
179
|
+
|
|
180
|
+
-- Module functionality =======================================================
|
|
181
|
+
--- Jump to target
|
|
182
|
+
---
|
|
183
|
+
--- Takes a string and jumps to its first occurrence in desired direction.
|
|
184
|
+
---
|
|
185
|
+
--- All default values are taken from |MiniJump.state| to emulate latest jump.
|
|
186
|
+
---
|
|
187
|
+
---@param target __jump_target
|
|
188
|
+
---@param backward __jump_backward
|
|
189
|
+
---@param till __jump_till
|
|
190
|
+
---@param n_times __jump_n_times
|
|
191
|
+
MiniJump.jump = function(target, backward, till, n_times)
|
|
192
|
+
if H.is_disabled() then return end
|
|
193
|
+
|
|
194
|
+
-- Dot-repeat should not change the state, so save it to later restore
|
|
195
|
+
local expr_mode, is_dot_repeat = MiniJump._expr_mode, MiniJump._expr_mode ~= nil and not MiniJump._is_expr_init
|
|
196
|
+
MiniJump._expr_mode, MiniJump._is_expr_init = nil, nil
|
|
197
|
+
local state_snapshot = is_dot_repeat and vim.deepcopy(MiniJump.state) or nil
|
|
198
|
+
|
|
199
|
+
-- Cache inputs for future use
|
|
200
|
+
H.update_state(target, backward, till, n_times)
|
|
201
|
+
|
|
202
|
+
if MiniJump.state.target == nil then return H.message('Can not jump because there is no recent `target`.') end
|
|
203
|
+
|
|
204
|
+
-- Construct search and highlight pattern data
|
|
205
|
+
local pattern, hl_pattern, flags = H.make_search_data()
|
|
206
|
+
|
|
207
|
+
-- Delay highlighting after stopping previous one
|
|
208
|
+
-- Update highlighting immediately if any highlighting is already present
|
|
209
|
+
local config = H.get_config()
|
|
210
|
+
H.timers.highlight:stop()
|
|
211
|
+
local hl = vim.schedule_wrap(function() H.highlight(hl_pattern) end)
|
|
212
|
+
H.timers.highlight:start(H.is_highlighting() and 0 or config.delay.highlight, 0, hl)
|
|
213
|
+
|
|
214
|
+
-- Start idle timer after stopping previous one
|
|
215
|
+
H.timers.idle_stop:stop()
|
|
216
|
+
H.timers.idle_stop:start(config.delay.idle_stop, 0, vim.schedule_wrap(function() MiniJump.stop_jumping() end))
|
|
217
|
+
|
|
218
|
+
-- Force charwise selection in Operator-pending expression mapping
|
|
219
|
+
if expr_mode ~= nil then vim.cmd('normal! ' .. expr_mode) end
|
|
220
|
+
|
|
221
|
+
-- Make jump(s)
|
|
222
|
+
H.cache.n_cursor_moved = 0
|
|
223
|
+
local was_jumping = MiniJump.state.jumping
|
|
224
|
+
MiniJump.state.jumping = true
|
|
225
|
+
if not was_jumping then H.trigger_event('MiniJumpStart') end
|
|
226
|
+
H.trigger_event('MiniJumpJump')
|
|
227
|
+
|
|
228
|
+
local has_jumped = false
|
|
229
|
+
for _ = 1, MiniJump.state.n_times do
|
|
230
|
+
local row = vim.fn.search(pattern, flags)
|
|
231
|
+
has_jumped = has_jumped or row > 0
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
-- Open enough folds to show jump
|
|
235
|
+
if has_jumped then vim.cmd('normal! zv') end
|
|
236
|
+
|
|
237
|
+
-- Track cursor position to account for movement not caught by `CursorMoved`
|
|
238
|
+
H.cache.latest_cursor = H.get_cursor_data()
|
|
239
|
+
|
|
240
|
+
-- Restore the state if needed. The jumping state is applied if there was jump
|
|
241
|
+
-- or if it is possible to jump in other direction (i.e. target is present).
|
|
242
|
+
MiniJump.state = is_dot_repeat and state_snapshot or MiniJump.state
|
|
243
|
+
local search_pattern = '\\V' .. vim.fn.escape(MiniJump.state.target, '\\')
|
|
244
|
+
MiniJump.state.jumping = has_jumped or vim.fn.search(search_pattern, 'wn') ~= 0
|
|
245
|
+
|
|
246
|
+
-- Nothing else to do if there was a jump
|
|
247
|
+
if has_jumped then return end
|
|
248
|
+
|
|
249
|
+
-- Ensure to stop jumping on next non-jump movement
|
|
250
|
+
if MiniJump.state.jumping then H.cache.n_cursor_moved = H.cache.n_cursor_moved + 1 end
|
|
251
|
+
|
|
252
|
+
-- When in Operator-pending mapping, disable selection to prevent a character
|
|
253
|
+
-- from being consumed (due to selection of a cursor cell)
|
|
254
|
+
if expr_mode ~= nil then vim.cmd('normal! ' .. expr_mode) end
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
--- Make smart jump
|
|
258
|
+
---
|
|
259
|
+
--- If the last movement was a jump, perform another jump with the same target.
|
|
260
|
+
--- Otherwise, wait for a target input (via |getcharstr()|). Respects |v:count|.
|
|
261
|
+
---
|
|
262
|
+
--- All default values are taken from |MiniJump.state| to emulate latest jump.
|
|
263
|
+
---
|
|
264
|
+
---@param backward __jump_backward
|
|
265
|
+
---@param till __jump_till
|
|
266
|
+
MiniJump.smart_jump = function(backward, till)
|
|
267
|
+
if H.is_disabled() then return end
|
|
268
|
+
|
|
269
|
+
-- Jumping should stop after mode change (use `mode(1)` to track 'omap' case)
|
|
270
|
+
-- or if cursor has moved after latest jump
|
|
271
|
+
local has_changed_mode = MiniJump.state.mode ~= vim.fn.mode(1)
|
|
272
|
+
local has_changed_cursor = not vim.deep_equal(H.cache.latest_cursor, H.get_cursor_data())
|
|
273
|
+
if has_changed_mode or has_changed_cursor then MiniJump.stop_jumping() end
|
|
274
|
+
|
|
275
|
+
H.update_state(nil, backward, till, vim.v.count1)
|
|
276
|
+
|
|
277
|
+
-- Ask for target only when needed
|
|
278
|
+
local target
|
|
279
|
+
if not MiniJump.state.jumping or MiniJump.state.target == nil then
|
|
280
|
+
target = H.get_target()
|
|
281
|
+
-- Stop if user supplied invalid target
|
|
282
|
+
if target == nil then return end
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
H.update_state(target)
|
|
286
|
+
|
|
287
|
+
MiniJump.jump()
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
--- Stop jumping
|
|
291
|
+
---
|
|
292
|
+
--- Removes highlights (if any) and forces the next smart jump to prompt for
|
|
293
|
+
--- the target. Automatically called on appropriate Neovim |events|.
|
|
294
|
+
MiniJump.stop_jumping = function()
|
|
295
|
+
H.timers.highlight:stop()
|
|
296
|
+
H.timers.idle_stop:stop()
|
|
297
|
+
|
|
298
|
+
local was_jumping = MiniJump.state.jumping
|
|
299
|
+
MiniJump.state.jumping = false
|
|
300
|
+
|
|
301
|
+
H.cache.n_cursor_moved = 0
|
|
302
|
+
H.cache.latest_cursor = nil
|
|
303
|
+
H.cache.msg_shown = false
|
|
304
|
+
|
|
305
|
+
H.unhighlight()
|
|
306
|
+
|
|
307
|
+
-- Trigger relevant event only if there was jumping
|
|
308
|
+
if was_jumping then H.trigger_event('MiniJumpStop') end
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
-- Helper data ================================================================
|
|
312
|
+
-- Module default config
|
|
313
|
+
H.default_config = vim.deepcopy(MiniJump.config)
|
|
314
|
+
|
|
315
|
+
-- Cache for various operations
|
|
316
|
+
H.cache = {
|
|
317
|
+
-- Counter of number of CursorMoved events
|
|
318
|
+
n_cursor_moved = 0,
|
|
319
|
+
|
|
320
|
+
-- Latest cursor position data
|
|
321
|
+
latest_cursor = nil,
|
|
322
|
+
|
|
323
|
+
-- Whether helper message was shown
|
|
324
|
+
msg_shown = false,
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
-- Timers for different delay-related functionalities
|
|
328
|
+
H.timers = { highlight = vim.loop.new_timer(), idle_stop = vim.loop.new_timer() }
|
|
329
|
+
|
|
330
|
+
-- Information about last match highlighting (stored *per window*):
|
|
331
|
+
-- - Key: windows' unique buffer identifiers.
|
|
332
|
+
-- - Value: table with:
|
|
333
|
+
-- - `id` field for match id (from `vim.fn.matchadd()`).
|
|
334
|
+
-- - `pattern` field for highlighted pattern.
|
|
335
|
+
H.window_matches = {}
|
|
336
|
+
|
|
337
|
+
-- Helper functionality =======================================================
|
|
338
|
+
-- Settings -------------------------------------------------------------------
|
|
339
|
+
H.setup_config = function(config)
|
|
340
|
+
H.check_type('config', config, 'table', true)
|
|
341
|
+
config = vim.tbl_deep_extend('force', vim.deepcopy(H.default_config), config or {})
|
|
342
|
+
|
|
343
|
+
H.check_type('delay', config.delay, 'table')
|
|
344
|
+
H.check_type('delay.highlight', config.delay.highlight, 'number')
|
|
345
|
+
H.check_type('delay.idle_stop', config.delay.idle_stop, 'number')
|
|
346
|
+
|
|
347
|
+
H.check_type('mappings', config.mappings, 'table')
|
|
348
|
+
H.check_type('mappings.forward', config.mappings.forward, 'string')
|
|
349
|
+
H.check_type('mappings.backward', config.mappings.backward, 'string')
|
|
350
|
+
H.check_type('mappings.forward_till', config.mappings.forward_till, 'string')
|
|
351
|
+
H.check_type('mappings.backward_till', config.mappings.backward_till, 'string')
|
|
352
|
+
H.check_type('mappings.repeat_jump', config.mappings.repeat_jump, 'string')
|
|
353
|
+
|
|
354
|
+
H.check_type('silent', config.silent, 'boolean')
|
|
355
|
+
|
|
356
|
+
return config
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
H.apply_config = function(config)
|
|
360
|
+
MiniJump.config = config
|
|
361
|
+
|
|
362
|
+
--stylua: ignore start
|
|
363
|
+
H.map('n', config.mappings.forward, '<Cmd>lua MiniJump.smart_jump(false, false)<CR>', { desc = 'Jump forward' })
|
|
364
|
+
H.map('n', config.mappings.backward, '<Cmd>lua MiniJump.smart_jump(true, false)<CR>', { desc = 'Jump backward' })
|
|
365
|
+
H.map('n', config.mappings.forward_till, '<Cmd>lua MiniJump.smart_jump(false, true)<CR>', { desc = 'Jump forward till' })
|
|
366
|
+
H.map('n', config.mappings.backward_till, '<Cmd>lua MiniJump.smart_jump(true, true)<CR>', { desc = 'Jump backward till' })
|
|
367
|
+
H.map('n', config.mappings.repeat_jump, '<Cmd>lua MiniJump.jump()<CR>', { desc = 'Repeat jump' })
|
|
368
|
+
|
|
369
|
+
H.map('x', config.mappings.forward, '<Cmd>lua MiniJump.smart_jump(false, false)<CR>', { desc = 'Jump forward' })
|
|
370
|
+
H.map('x', config.mappings.backward, '<Cmd>lua MiniJump.smart_jump(true, false)<CR>', { desc = 'Jump backward' })
|
|
371
|
+
H.map('x', config.mappings.forward_till, '<Cmd>lua MiniJump.smart_jump(false, true)<CR>', { desc = 'Jump forward till' })
|
|
372
|
+
H.map('x', config.mappings.backward_till, '<Cmd>lua MiniJump.smart_jump(true, true)<CR>', { desc = 'Jump backward till' })
|
|
373
|
+
H.map('x', config.mappings.repeat_jump, '<Cmd>lua MiniJump.jump()<CR>', { desc = 'Repeat jump' })
|
|
374
|
+
|
|
375
|
+
H.map('o', config.mappings.forward, H.make_expr_jump(false, false), { expr = true, desc = 'Jump forward' })
|
|
376
|
+
H.map('o', config.mappings.backward, H.make_expr_jump(true, false), { expr = true, desc = 'Jump backward' })
|
|
377
|
+
H.map('o', config.mappings.forward_till, H.make_expr_jump(false, true), { expr = true, desc = 'Jump forward till' })
|
|
378
|
+
H.map('o', config.mappings.backward_till, H.make_expr_jump(true, true), { expr = true, desc = 'Jump backward till' })
|
|
379
|
+
H.map('o', config.mappings.repeat_jump, H.make_expr_jump(), { expr = true, desc = 'Repeat jump' })
|
|
380
|
+
--stylua: ignore end
|
|
381
|
+
end
|
|
382
|
+
|
|
383
|
+
H.create_autocommands = function()
|
|
384
|
+
local gr = vim.api.nvim_create_augroup('MiniJump', {})
|
|
385
|
+
|
|
386
|
+
local au = function(event, pattern, callback, desc)
|
|
387
|
+
vim.api.nvim_create_autocmd(event, { group = gr, pattern = pattern, callback = callback, desc = desc })
|
|
388
|
+
end
|
|
389
|
+
|
|
390
|
+
au('CursorMoved', '*', H.on_cursormoved, 'On CursorMoved')
|
|
391
|
+
-- Check current buffer not immediately to allow "temporary buffer switch"
|
|
392
|
+
au({ 'BufLeave', 'InsertEnter' }, '*', vim.schedule_wrap(H.stop_if_curbuf), 'Stop jumping')
|
|
393
|
+
au('ColorScheme', '*', H.create_default_hl, 'Ensure colors')
|
|
394
|
+
end
|
|
395
|
+
|
|
396
|
+
H.create_default_hl = function() vim.api.nvim_set_hl(0, 'MiniJump', { default = true, link = 'SpellRare' }) end
|
|
397
|
+
|
|
398
|
+
H.is_disabled = function() return vim.g.minijump_disable == true or vim.b.minijump_disable == true end
|
|
399
|
+
|
|
400
|
+
H.get_config = function(config)
|
|
401
|
+
return vim.tbl_deep_extend('force', MiniJump.config, vim.b.minijump_config or {}, config or {})
|
|
402
|
+
end
|
|
403
|
+
|
|
404
|
+
-- Mappings -------------------------------------------------------------------
|
|
405
|
+
H.make_expr_jump = function(backward, till)
|
|
406
|
+
return function()
|
|
407
|
+
if H.is_disabled() then return '' end
|
|
408
|
+
|
|
409
|
+
local count = vim.v.count1
|
|
410
|
+
H.update_state(nil, backward, till, count)
|
|
411
|
+
|
|
412
|
+
-- Ask for `target` for non-repeating jump as this will be used only in
|
|
413
|
+
-- operator-pending mode. Dot-repeat is supported via expression-mapping.
|
|
414
|
+
local isnt_repeat_jump = backward ~= nil and till ~= nil
|
|
415
|
+
local target = isnt_repeat_jump and H.get_target() or nil
|
|
416
|
+
if isnt_repeat_jump and target == nil then return '<Esc>' end
|
|
417
|
+
H.update_state(target)
|
|
418
|
+
|
|
419
|
+
-- Set a flag to distinguish first call from dot-repeat
|
|
420
|
+
MiniJump._is_expr_init = true
|
|
421
|
+
|
|
422
|
+
-- Take into account forced Operator-pending modes ('nov', 'noV', 'no<C-V>')
|
|
423
|
+
local vis_mode = vim.fn.mode(1):match('^no(.+)$') or 'v'
|
|
424
|
+
|
|
425
|
+
-- Encode state in expression for dot-repeat. Important to use `target=nil`
|
|
426
|
+
-- for `repeat_jump` case to have it using latest jumping state during
|
|
427
|
+
-- dot-repeat also (as does `nvim --clean`).
|
|
428
|
+
local jump_cmd = string.format('MiniJump.jump(%s,%s,%s,%s)', vim.inspect(target), backward, till, count)
|
|
429
|
+
local expr_mode_cmd = 'MiniJump._expr_mode = ' .. vim.inspect(vis_mode)
|
|
430
|
+
return string.format('<Cmd>lua %s; %s<CR>', expr_mode_cmd, jump_cmd)
|
|
431
|
+
end
|
|
432
|
+
end
|
|
433
|
+
|
|
434
|
+
-- Autocommands ---------------------------------------------------------------
|
|
435
|
+
H.on_cursormoved = function()
|
|
436
|
+
-- Check if jumping to avoid unnecessary actions on every CursorMoved
|
|
437
|
+
if MiniJump.state.jumping then
|
|
438
|
+
H.cache.n_cursor_moved = H.cache.n_cursor_moved + 1
|
|
439
|
+
-- Stop jumping only if `CursorMoved` was not a result of smart jump
|
|
440
|
+
if H.cache.n_cursor_moved > 1 then MiniJump.stop_jumping() end
|
|
441
|
+
end
|
|
442
|
+
end
|
|
443
|
+
|
|
444
|
+
H.stop_if_curbuf = function(ev)
|
|
445
|
+
if ev.buf == vim.api.nvim_get_current_buf() then MiniJump.stop_jumping() end
|
|
446
|
+
end
|
|
447
|
+
|
|
448
|
+
-- Pattern matching -----------------------------------------------------------
|
|
449
|
+
H.make_search_data = function()
|
|
450
|
+
local target = vim.fn.escape(MiniJump.state.target, [[\]])
|
|
451
|
+
local backward, till = MiniJump.state.backward, MiniJump.state.till
|
|
452
|
+
|
|
453
|
+
local flags = backward and 'Wb' or 'W'
|
|
454
|
+
local pattern, hl_pattern
|
|
455
|
+
|
|
456
|
+
if till then
|
|
457
|
+
-- General logic: moving pattern should match just before/after target,
|
|
458
|
+
-- while highlight pattern should match target for every "movable" place.
|
|
459
|
+
-- Also allow checking for "just before/after" across lines by accepting
|
|
460
|
+
-- `\n` as possible match.
|
|
461
|
+
if backward then
|
|
462
|
+
-- NOTE: use `\@<=` instead of `\zs` because it behaves better in case of
|
|
463
|
+
-- consecutive matches (like `xxxx` for target `x`)
|
|
464
|
+
pattern = target .. [[\@<=\_.]]
|
|
465
|
+
hl_pattern = target .. [[\ze\_.]]
|
|
466
|
+
else
|
|
467
|
+
pattern = [[\_.\ze]] .. target
|
|
468
|
+
hl_pattern = [[\_.\@<=]] .. target
|
|
469
|
+
end
|
|
470
|
+
else
|
|
471
|
+
local is_visual = vim.tbl_contains({ 'v', 'V', '\22' }, vim.fn.mode())
|
|
472
|
+
local is_exclusive = vim.o.selection == 'exclusive'
|
|
473
|
+
if not backward and is_visual and is_exclusive then
|
|
474
|
+
-- Still select target in case of exclusive visual selection
|
|
475
|
+
pattern = target .. [[\zs\_.]]
|
|
476
|
+
hl_pattern = target .. [[\ze\_.]]
|
|
477
|
+
else
|
|
478
|
+
pattern = target
|
|
479
|
+
hl_pattern = target
|
|
480
|
+
end
|
|
481
|
+
end
|
|
482
|
+
|
|
483
|
+
-- Enable 'very nomagic' mode and possibly case-insensitivity
|
|
484
|
+
local ignore_case = vim.o.ignorecase and (not vim.o.smartcase or target == target:lower())
|
|
485
|
+
local prefix = ignore_case and [[\V\c]] or [[\V]]
|
|
486
|
+
pattern, hl_pattern = prefix .. pattern, prefix .. hl_pattern
|
|
487
|
+
|
|
488
|
+
return pattern, hl_pattern, flags
|
|
489
|
+
end
|
|
490
|
+
|
|
491
|
+
-- Highlighting ---------------------------------------------------------------
|
|
492
|
+
H.highlight = function(pattern)
|
|
493
|
+
if H.is_highlighting(pattern) or not MiniJump.state.jumping then return end
|
|
494
|
+
|
|
495
|
+
-- Stop highlighting possible previous pattern. Needed to adjust highlighting
|
|
496
|
+
-- when inside jumping but a different kind one. Example: first jump with
|
|
497
|
+
-- `till = false` and then, without jumping stop, jump to same character with
|
|
498
|
+
-- `till = true`. If this character is first on line, highlighting should change
|
|
499
|
+
H.unhighlight()
|
|
500
|
+
|
|
501
|
+
-- Never highlight in Insert mode
|
|
502
|
+
if vim.fn.mode() == 'i' then return end
|
|
503
|
+
|
|
504
|
+
local match_id = vim.fn.matchadd('MiniJump', pattern)
|
|
505
|
+
H.window_matches[vim.api.nvim_get_current_win()] = { id = match_id, pattern = pattern }
|
|
506
|
+
end
|
|
507
|
+
|
|
508
|
+
H.unhighlight = function()
|
|
509
|
+
-- Remove highlighting from all windows as jumping is intended to work only
|
|
510
|
+
-- in current window. This will work also from other (usually popup) window.
|
|
511
|
+
for win_id, match_info in pairs(H.window_matches) do
|
|
512
|
+
if vim.api.nvim_win_is_valid(win_id) then
|
|
513
|
+
-- Use `pcall` because there is an error if match id is not present. It
|
|
514
|
+
-- can happen if something else called `clearmatches`.
|
|
515
|
+
pcall(vim.fn.matchdelete, match_info.id, win_id)
|
|
516
|
+
H.window_matches[win_id] = nil
|
|
517
|
+
end
|
|
518
|
+
end
|
|
519
|
+
end
|
|
520
|
+
|
|
521
|
+
---@param pattern string|nil Highlight pattern to check for. If `nil`, checks for
|
|
522
|
+
--- any highlighting registered in current window.
|
|
523
|
+
---@private
|
|
524
|
+
H.is_highlighting = function(pattern)
|
|
525
|
+
local win_id = vim.api.nvim_get_current_win()
|
|
526
|
+
local match_info = H.window_matches[win_id]
|
|
527
|
+
if match_info == nil then return false end
|
|
528
|
+
return pattern == nil or match_info.pattern == pattern
|
|
529
|
+
end
|
|
530
|
+
|
|
531
|
+
-- Utilities ------------------------------------------------------------------
|
|
532
|
+
H.error = function(msg) error('(mini.jump) ' .. msg, 0) end
|
|
533
|
+
|
|
534
|
+
H.check_type = function(name, val, ref, allow_nil)
|
|
535
|
+
if type(val) == ref or (ref == 'callable' and vim.is_callable(val)) or (allow_nil and val == nil) then return end
|
|
536
|
+
H.error(string.format('`%s` should be %s, not %s', name, ref, type(val)))
|
|
537
|
+
end
|
|
538
|
+
|
|
539
|
+
H.echo = function(msg, is_important)
|
|
540
|
+
if H.get_config().silent then return end
|
|
541
|
+
|
|
542
|
+
-- Construct message chunks
|
|
543
|
+
msg = type(msg) == 'string' and { { msg } } or msg
|
|
544
|
+
table.insert(msg, 1, { '(mini.jump) ', 'WarningMsg' })
|
|
545
|
+
|
|
546
|
+
-- Avoid hit-enter-prompt
|
|
547
|
+
local chunks = msg
|
|
548
|
+
if not is_important then
|
|
549
|
+
chunks = {}
|
|
550
|
+
local max_width = vim.o.columns * math.max(vim.o.cmdheight - 1, 0) + vim.v.echospace
|
|
551
|
+
local tot_width = 0
|
|
552
|
+
for _, ch in ipairs(msg) do
|
|
553
|
+
local new_ch = { vim.fn.strcharpart(ch[1], 0, max_width - tot_width), ch[2] }
|
|
554
|
+
table.insert(chunks, new_ch)
|
|
555
|
+
tot_width = tot_width + vim.fn.strdisplaywidth(new_ch[1])
|
|
556
|
+
if tot_width >= max_width then break end
|
|
557
|
+
end
|
|
558
|
+
end
|
|
559
|
+
|
|
560
|
+
-- Echo. Force redraw to ensure that it is effective (`:h echo-redraw`)
|
|
561
|
+
vim.cmd([[echo '' | redraw]])
|
|
562
|
+
vim.api.nvim_echo(chunks, is_important, {})
|
|
563
|
+
end
|
|
564
|
+
|
|
565
|
+
H.unecho = function()
|
|
566
|
+
if H.cache.msg_shown then vim.cmd([[echo '' | redraw]]) end
|
|
567
|
+
end
|
|
568
|
+
|
|
569
|
+
H.message = function(msg) H.echo(msg, true) end
|
|
570
|
+
|
|
571
|
+
H.trigger_event = function(event_name, data) vim.api.nvim_exec_autocmds('User', { pattern = event_name, data = data }) end
|
|
572
|
+
|
|
573
|
+
H.update_state = function(target, backward, till, n_times)
|
|
574
|
+
MiniJump.state.mode = vim.fn.mode(1)
|
|
575
|
+
|
|
576
|
+
-- Don't use `? and <1> or <2>` because it doesn't work when `<1>` is `false`
|
|
577
|
+
if target ~= nil then MiniJump.state.target = target end
|
|
578
|
+
if backward ~= nil then MiniJump.state.backward = backward end
|
|
579
|
+
if till ~= nil then MiniJump.state.till = till end
|
|
580
|
+
if n_times ~= nil then MiniJump.state.n_times = n_times end
|
|
581
|
+
end
|
|
582
|
+
|
|
583
|
+
H.get_cursor_data = function() return { vim.api.nvim_get_current_win(), vim.api.nvim_win_get_cursor(0) } end
|
|
584
|
+
|
|
585
|
+
H.get_target = function()
|
|
586
|
+
local needs_reminder = true
|
|
587
|
+
vim.defer_fn(function()
|
|
588
|
+
if not needs_reminder then return end
|
|
589
|
+
H.echo('Reminder to press a target single character ')
|
|
590
|
+
H.cache.msg_shown = true
|
|
591
|
+
end, 1000)
|
|
592
|
+
|
|
593
|
+
H.trigger_event('MiniJumpGetTarget')
|
|
594
|
+
local ok, char = pcall(vim.fn.getcharstr)
|
|
595
|
+
needs_reminder = false
|
|
596
|
+
H.unecho()
|
|
597
|
+
|
|
598
|
+
-- Terminate if couldn't get input (like with <C-c>) or on `<Esc>`
|
|
599
|
+
if not ok or char == '' or char == '\3' or char == '\27' then return nil end
|
|
600
|
+
return char
|
|
601
|
+
end
|
|
602
|
+
|
|
603
|
+
H.map = function(mode, lhs, rhs, opts)
|
|
604
|
+
if lhs == '' then return end
|
|
605
|
+
opts = vim.tbl_deep_extend('force', { silent = true }, opts or {})
|
|
606
|
+
vim.keymap.set(mode, lhs, rhs, opts)
|
|
607
|
+
end
|
|
608
|
+
|
|
609
|
+
return MiniJump
|