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.
Files changed (218) hide show
  1. package/.conda/retrovim.yaml +259 -0
  2. package/.conda/terax.icns +0 -0
  3. package/.conda/terax.ico +0 -0
  4. package/.conda/terax.png +0 -0
  5. package/.github/workflows/release.yml +95 -0
  6. package/.gitmodules +3 -0
  7. package/.npm/kanata_touchcursor.js +28 -0
  8. package/.npm/nvim.js +26 -0
  9. package/.npm/yazi.js +26 -0
  10. package/.npm/zsh.js +17 -0
  11. package/.pip/kanata_touchcursor/__init__.py +28 -0
  12. package/.pip/nvim/__init__.py +31 -0
  13. package/.pip/yazi/__init__.py +31 -0
  14. package/.pip/zsh/__init__.py +22 -0
  15. package/CHANGELOG.md +26 -0
  16. package/LICENSE +674 -0
  17. package/README.md +336 -0
  18. package/kanata/touchcursor.kbd +164 -0
  19. package/nvim/init.lua +813 -0
  20. package/nvim/plugins/mini.nvim/.github/DISCUSSION_TEMPLATE/q-a.yml +72 -0
  21. package/nvim/plugins/mini.nvim/.github/ISSUE_TEMPLATE/bug-report.yml +136 -0
  22. package/nvim/plugins/mini.nvim/.github/ISSUE_TEMPLATE/config.yml +5 -0
  23. package/nvim/plugins/mini.nvim/.github/ISSUE_TEMPLATE/feature-request.yml +75 -0
  24. package/nvim/plugins/mini.nvim/.github/PULL_REQUEST_TEMPLATE.md +2 -0
  25. package/nvim/plugins/mini.nvim/.github/workflows/quality-control.yml +150 -0
  26. package/nvim/plugins/mini.nvim/.pre-commit-config.yaml +20 -0
  27. package/nvim/plugins/mini.nvim/.stylua.toml +7 -0
  28. package/nvim/plugins/mini.nvim/.styluaignore +1 -0
  29. package/nvim/plugins/mini.nvim/CHANGELOG.md +1894 -0
  30. package/nvim/plugins/mini.nvim/CODE_OF_CONDUCT.md +132 -0
  31. package/nvim/plugins/mini.nvim/CONTRIBUTING.md +331 -0
  32. package/nvim/plugins/mini.nvim/LICENSE +21 -0
  33. package/nvim/plugins/mini.nvim/MAINTAINING.md +330 -0
  34. package/nvim/plugins/mini.nvim/Makefile +51 -0
  35. package/nvim/plugins/mini.nvim/README.md +261 -0
  36. package/nvim/plugins/mini.nvim/TESTING.md +1011 -0
  37. package/nvim/plugins/mini.nvim/benchmarks/starter/README.md +35 -0
  38. package/nvim/plugins/mini.nvim/benchmarks/starter/benchmark.sh +56 -0
  39. package/nvim/plugins/mini.nvim/benchmarks/starter/init-files/init_dashboard-alpha.lua +21 -0
  40. package/nvim/plugins/mini.nvim/benchmarks/starter/init-files/init_dashboard-original.lua +17 -0
  41. package/nvim/plugins/mini.nvim/benchmarks/starter/init-files/init_dashboard-starter.lua +18 -0
  42. package/nvim/plugins/mini.nvim/benchmarks/starter/init-files/init_empty.lua +4 -0
  43. package/nvim/plugins/mini.nvim/benchmarks/starter/init-files/init_starter-default.lua +7 -0
  44. package/nvim/plugins/mini.nvim/benchmarks/starter/init-files/init_startify-alpha.lua +10 -0
  45. package/nvim/plugins/mini.nvim/benchmarks/starter/init-files/init_startify-original.lua +7 -0
  46. package/nvim/plugins/mini.nvim/benchmarks/starter/init-files/init_startify-starter.lua +20 -0
  47. package/nvim/plugins/mini.nvim/benchmarks/starter/install.sh +10 -0
  48. package/nvim/plugins/mini.nvim/benchmarks/starter/make_summary.py +68 -0
  49. package/nvim/plugins/mini.nvim/benchmarks/starter/startup-summary.md +10 -0
  50. package/nvim/plugins/mini.nvim/colors/miniautumn.lua +55 -0
  51. package/nvim/plugins/mini.nvim/colors/minicyan.lua +95 -0
  52. package/nvim/plugins/mini.nvim/colors/minischeme.lua +95 -0
  53. package/nvim/plugins/mini.nvim/colors/minispring.lua +53 -0
  54. package/nvim/plugins/mini.nvim/colors/minisummer.lua +49 -0
  55. package/nvim/plugins/mini.nvim/colors/miniwinter.lua +51 -0
  56. package/nvim/plugins/mini.nvim/colors/randomhue.lua +16 -0
  57. package/nvim/plugins/mini.nvim/doc/mini-ai.txt +889 -0
  58. package/nvim/plugins/mini.nvim/doc/mini-align.txt +923 -0
  59. package/nvim/plugins/mini.nvim/doc/mini-animate.txt +937 -0
  60. package/nvim/plugins/mini.nvim/doc/mini-base16.txt +285 -0
  61. package/nvim/plugins/mini.nvim/doc/mini-basics.txt +359 -0
  62. package/nvim/plugins/mini.nvim/doc/mini-bracketed.txt +622 -0
  63. package/nvim/plugins/mini.nvim/doc/mini-bufremove.txt +123 -0
  64. package/nvim/plugins/mini.nvim/doc/mini-clue.txt +760 -0
  65. package/nvim/plugins/mini.nvim/doc/mini-cmdline.txt +392 -0
  66. package/nvim/plugins/mini.nvim/doc/mini-colors.txt +880 -0
  67. package/nvim/plugins/mini.nvim/doc/mini-comment.txt +230 -0
  68. package/nvim/plugins/mini.nvim/doc/mini-completion.txt +477 -0
  69. package/nvim/plugins/mini.nvim/doc/mini-cursorword.txt +105 -0
  70. package/nvim/plugins/mini.nvim/doc/mini-deps.txt +590 -0
  71. package/nvim/plugins/mini.nvim/doc/mini-diff.txt +661 -0
  72. package/nvim/plugins/mini.nvim/doc/mini-doc.txt +434 -0
  73. package/nvim/plugins/mini.nvim/doc/mini-extra.txt +856 -0
  74. package/nvim/plugins/mini.nvim/doc/mini-files.txt +1018 -0
  75. package/nvim/plugins/mini.nvim/doc/mini-fuzzy.txt +160 -0
  76. package/nvim/plugins/mini.nvim/doc/mini-git.txt +425 -0
  77. package/nvim/plugins/mini.nvim/doc/mini-hipatterns.txt +489 -0
  78. package/nvim/plugins/mini.nvim/doc/mini-hues.txt +420 -0
  79. package/nvim/plugins/mini.nvim/doc/mini-icons.txt +508 -0
  80. package/nvim/plugins/mini.nvim/doc/mini-indentscope.txt +485 -0
  81. package/nvim/plugins/mini.nvim/doc/mini-input.txt +932 -0
  82. package/nvim/plugins/mini.nvim/doc/mini-jump.txt +202 -0
  83. package/nvim/plugins/mini.nvim/doc/mini-jump2d.txt +525 -0
  84. package/nvim/plugins/mini.nvim/doc/mini-keymap.txt +449 -0
  85. package/nvim/plugins/mini.nvim/doc/mini-map.txt +717 -0
  86. package/nvim/plugins/mini.nvim/doc/mini-misc.txt +431 -0
  87. package/nvim/plugins/mini.nvim/doc/mini-move.txt +181 -0
  88. package/nvim/plugins/mini.nvim/doc/mini-notify.txt +434 -0
  89. package/nvim/plugins/mini.nvim/doc/mini-nvim.txt +431 -0
  90. package/nvim/plugins/mini.nvim/doc/mini-operators.txt +472 -0
  91. package/nvim/plugins/mini.nvim/doc/mini-pairs.txt +346 -0
  92. package/nvim/plugins/mini.nvim/doc/mini-pick.txt +1535 -0
  93. package/nvim/plugins/mini.nvim/doc/mini-sessions.txt +239 -0
  94. package/nvim/plugins/mini.nvim/doc/mini-snippets.txt +1291 -0
  95. package/nvim/plugins/mini.nvim/doc/mini-splitjoin.txt +536 -0
  96. package/nvim/plugins/mini.nvim/doc/mini-starter.txt +618 -0
  97. package/nvim/plugins/mini.nvim/doc/mini-statusline.txt +361 -0
  98. package/nvim/plugins/mini.nvim/doc/mini-surround.txt +863 -0
  99. package/nvim/plugins/mini.nvim/doc/mini-tabline.txt +151 -0
  100. package/nvim/plugins/mini.nvim/doc/mini-test.txt +966 -0
  101. package/nvim/plugins/mini.nvim/doc/mini-trailspace.txt +91 -0
  102. package/nvim/plugins/mini.nvim/doc/mini-visits.txt +937 -0
  103. package/nvim/plugins/mini.nvim/logo.png +0 -0
  104. package/nvim/plugins/mini.nvim/lua/mini/ai.lua +2244 -0
  105. package/nvim/plugins/mini.nvim/lua/mini/align.lua +2076 -0
  106. package/nvim/plugins/mini.nvim/lua/mini/animate.lua +2127 -0
  107. package/nvim/plugins/mini.nvim/lua/mini/base16.lua +1752 -0
  108. package/nvim/plugins/mini.nvim/lua/mini/basics.lua +772 -0
  109. package/nvim/plugins/mini.nvim/lua/mini/bracketed.lua +2013 -0
  110. package/nvim/plugins/mini.nvim/lua/mini/bufremove.lua +283 -0
  111. package/nvim/plugins/mini.nvim/lua/mini/clue.lua +2096 -0
  112. package/nvim/plugins/mini.nvim/lua/mini/cmdline.lua +1182 -0
  113. package/nvim/plugins/mini.nvim/lua/mini/colors.lua +2483 -0
  114. package/nvim/plugins/mini.nvim/lua/mini/comment.lua +586 -0
  115. package/nvim/plugins/mini.nvim/lua/mini/completion.lua +2094 -0
  116. package/nvim/plugins/mini.nvim/lua/mini/cursorword.lua +311 -0
  117. package/nvim/plugins/mini.nvim/lua/mini/deps.lua +1660 -0
  118. package/nvim/plugins/mini.nvim/lua/mini/diff.lua +1938 -0
  119. package/nvim/plugins/mini.nvim/lua/mini/doc.lua +1371 -0
  120. package/nvim/plugins/mini.nvim/lua/mini/extra.lua +2290 -0
  121. package/nvim/plugins/mini.nvim/lua/mini/files.lua +3145 -0
  122. package/nvim/plugins/mini.nvim/lua/mini/fuzzy.lua +356 -0
  123. package/nvim/plugins/mini.nvim/lua/mini/git.lua +1737 -0
  124. package/nvim/plugins/mini.nvim/lua/mini/hipatterns.lua +1042 -0
  125. package/nvim/plugins/mini.nvim/lua/mini/hues.lua +2088 -0
  126. package/nvim/plugins/mini.nvim/lua/mini/icons.lua +2254 -0
  127. package/nvim/plugins/mini.nvim/lua/mini/indentscope.lua +1158 -0
  128. package/nvim/plugins/mini.nvim/lua/mini/init.lua +427 -0
  129. package/nvim/plugins/mini.nvim/lua/mini/input.lua +2183 -0
  130. package/nvim/plugins/mini.nvim/lua/mini/jump.lua +609 -0
  131. package/nvim/plugins/mini.nvim/lua/mini/jump2d.lua +1244 -0
  132. package/nvim/plugins/mini.nvim/lua/mini/keymap.lua +880 -0
  133. package/nvim/plugins/mini.nvim/lua/mini/map.lua +1709 -0
  134. package/nvim/plugins/mini.nvim/lua/mini/misc.lua +969 -0
  135. package/nvim/plugins/mini.nvim/lua/mini/move.lua +509 -0
  136. package/nvim/plugins/mini.nvim/lua/mini/notify.lua +938 -0
  137. package/nvim/plugins/mini.nvim/lua/mini/operators.lua +1349 -0
  138. package/nvim/plugins/mini.nvim/lua/mini/pairs.lua +657 -0
  139. package/nvim/plugins/mini.nvim/lua/mini/pick.lua +3876 -0
  140. package/nvim/plugins/mini.nvim/lua/mini/sessions.lua +689 -0
  141. package/nvim/plugins/mini.nvim/lua/mini/snippets.lua +2828 -0
  142. package/nvim/plugins/mini.nvim/lua/mini/splitjoin.lua +1132 -0
  143. package/nvim/plugins/mini.nvim/lua/mini/starter.lua +1599 -0
  144. package/nvim/plugins/mini.nvim/lua/mini/statusline.lua +686 -0
  145. package/nvim/plugins/mini.nvim/lua/mini/surround.lua +2388 -0
  146. package/nvim/plugins/mini.nvim/lua/mini/tabline.lua +564 -0
  147. package/nvim/plugins/mini.nvim/lua/mini/test.lua +2516 -0
  148. package/nvim/plugins/mini.nvim/lua/mini/trailspace.lua +215 -0
  149. package/nvim/plugins/mini.nvim/lua/mini/visits.lua +1577 -0
  150. package/nvim/plugins/mini.nvim/readmes/mini-ai.md +190 -0
  151. package/nvim/plugins/mini.nvim/readmes/mini-align.md +203 -0
  152. package/nvim/plugins/mini.nvim/readmes/mini-animate.md +214 -0
  153. package/nvim/plugins/mini.nvim/readmes/mini-base16.md +198 -0
  154. package/nvim/plugins/mini.nvim/readmes/mini-basics.md +184 -0
  155. package/nvim/plugins/mini.nvim/readmes/mini-bracketed.md +193 -0
  156. package/nvim/plugins/mini.nvim/readmes/mini-bufremove.md +139 -0
  157. package/nvim/plugins/mini.nvim/readmes/mini-clue.md +260 -0
  158. package/nvim/plugins/mini.nvim/readmes/mini-cmdline.md +183 -0
  159. package/nvim/plugins/mini.nvim/readmes/mini-colors.md +169 -0
  160. package/nvim/plugins/mini.nvim/readmes/mini-comment.md +183 -0
  161. package/nvim/plugins/mini.nvim/readmes/mini-completion.md +217 -0
  162. package/nvim/plugins/mini.nvim/readmes/mini-cursorword.md +137 -0
  163. package/nvim/plugins/mini.nvim/readmes/mini-deps.md +271 -0
  164. package/nvim/plugins/mini.nvim/readmes/mini-diff.md +289 -0
  165. package/nvim/plugins/mini.nvim/readmes/mini-doc.md +198 -0
  166. package/nvim/plugins/mini.nvim/readmes/mini-extra.md +158 -0
  167. package/nvim/plugins/mini.nvim/readmes/mini-files.md +247 -0
  168. package/nvim/plugins/mini.nvim/readmes/mini-fuzzy.md +134 -0
  169. package/nvim/plugins/mini.nvim/readmes/mini-git.md +168 -0
  170. package/nvim/plugins/mini.nvim/readmes/mini-hipatterns.md +176 -0
  171. package/nvim/plugins/mini.nvim/readmes/mini-hues.md +285 -0
  172. package/nvim/plugins/mini.nvim/readmes/mini-icons.md +183 -0
  173. package/nvim/plugins/mini.nvim/readmes/mini-indentscope.md +191 -0
  174. package/nvim/plugins/mini.nvim/readmes/mini-input.md +163 -0
  175. package/nvim/plugins/mini.nvim/readmes/mini-jump.md +161 -0
  176. package/nvim/plugins/mini.nvim/readmes/mini-jump2d.md +197 -0
  177. package/nvim/plugins/mini.nvim/readmes/mini-keymap.md +205 -0
  178. package/nvim/plugins/mini.nvim/readmes/mini-map.md +191 -0
  179. package/nvim/plugins/mini.nvim/readmes/mini-misc.md +145 -0
  180. package/nvim/plugins/mini.nvim/readmes/mini-move.md +163 -0
  181. package/nvim/plugins/mini.nvim/readmes/mini-notify.md +175 -0
  182. package/nvim/plugins/mini.nvim/readmes/mini-operators.md +193 -0
  183. package/nvim/plugins/mini.nvim/readmes/mini-pairs.md +158 -0
  184. package/nvim/plugins/mini.nvim/readmes/mini-pick.md +340 -0
  185. package/nvim/plugins/mini.nvim/readmes/mini-sessions.md +164 -0
  186. package/nvim/plugins/mini.nvim/readmes/mini-snippets.md +373 -0
  187. package/nvim/plugins/mini.nvim/readmes/mini-splitjoin.md +194 -0
  188. package/nvim/plugins/mini.nvim/readmes/mini-starter.md +176 -0
  189. package/nvim/plugins/mini.nvim/readmes/mini-statusline.md +155 -0
  190. package/nvim/plugins/mini.nvim/readmes/mini-surround.md +190 -0
  191. package/nvim/plugins/mini.nvim/readmes/mini-tabline.md +156 -0
  192. package/nvim/plugins/mini.nvim/readmes/mini-test.md +175 -0
  193. package/nvim/plugins/mini.nvim/readmes/mini-trailspace.md +137 -0
  194. package/nvim/plugins/mini.nvim/readmes/mini-visits.md +243 -0
  195. package/nvim/plugins/mini.nvim/scripts/dual_log.sh +13 -0
  196. package/nvim/plugins/mini.nvim/scripts/dual_push.sh +15 -0
  197. package/nvim/plugins/mini.nvim/scripts/dual_release.sh +102 -0
  198. package/nvim/plugins/mini.nvim/scripts/dual_sync.sh +115 -0
  199. package/nvim/plugins/mini.nvim/scripts/init-deps-example.lua +59 -0
  200. package/nvim/plugins/mini.nvim/scripts/lint-filename-length.sh +16 -0
  201. package/nvim/plugins/mini.nvim/scripts/lintcommit-ci.sh +18 -0
  202. package/nvim/plugins/mini.nvim/scripts/lintcommit.lua +393 -0
  203. package/nvim/plugins/mini.nvim/scripts/minidoc.lua +57 -0
  204. package/nvim/plugins/mini.nvim/scripts/minimal_init.lua +28 -0
  205. package/nvim/plugins/mini.nvim/scripts/minitest.lua +4 -0
  206. package/package.json +16 -0
  207. package/pyproject.toml +43 -0
  208. package/yazi/init.lua +12 -0
  209. package/yazi/keymap.toml +114 -0
  210. package/yazi/lesskey +5 -0
  211. package/yazi/plugins/bookmarks.yazi/main.lua +86 -0
  212. package/yazi/plugins/cd-git-root.yazi/main.lua +31 -0
  213. package/yazi/plugins/smart-enter.yazi/main.lua +11 -0
  214. package/yazi/theme.toml +26 -0
  215. package/yazi/yazi.toml +15 -0
  216. package/zsh/.zshrc +145 -0
  217. package/zsh/starship.toml +20 -0
  218. 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