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,564 @@
1
+ --- *mini.tabline* Tabline
2
+ ---
3
+ --- MIT License Copyright (c) 2021 Evgeni Chasnovski
4
+
5
+ --- Key idea: show all listed buffers in readable way with minimal total width.
6
+ ---
7
+ --- Features:
8
+ --- - Buffers are listed in the order of their identifier (see |bufnr()|).
9
+ ---
10
+ --- - Different highlight groups for "states" of buffer affecting "buffer tabs".
11
+ ---
12
+ --- - Buffer names are made unique by extending paths to files or appending
13
+ --- unique identifier to buffers without name.
14
+ ---
15
+ --- - Current buffer is displayed "optimally centered" (in center of screen
16
+ --- while maximizing the total number of buffers shown) when there are many
17
+ --- buffers open.
18
+ ---
19
+ --- - "Buffer tabs" are clickable if Neovim allows it.
20
+ ---
21
+ --- - Extra information section in case of multiple Neovim tabpages.
22
+ ---
23
+ --- - Truncation symbols which show if there are tabs to the left and/or right.
24
+ --- Exact characters are taken from |'listchars'| global value (`precedes` and
25
+ --- `extends` fields) and are shown only if |'list'| option is enabled.
26
+ ---
27
+ --- What it doesn't do:
28
+ --- - Custom buffer order is not supported.
29
+ ---
30
+ --- # Dependencies ~
31
+ ---
32
+ --- Suggested dependencies (provide extra functionality, will work without them):
33
+ ---
34
+ --- - Enabled |mini.icons| module to show icons near file names.
35
+ --- Falls back to [nvim-tree/nvim-web-devicons](https://github.com/nvim-tree/nvim-web-devicons)
36
+ --- or shows nothing.
37
+ ---
38
+ --- # Setup ~
39
+ ---
40
+ --- This module needs a setup with `require('mini.tabline').setup({})`
41
+ --- (replace `{}` with your `config` table). It will create global Lua table
42
+ --- `MiniTabline` which you can use for scripting or manually (with
43
+ --- `:lua MiniTabline.*`).
44
+ ---
45
+ --- See |MiniTabline.config| for `config` structure and default values.
46
+ ---
47
+ --- You can override runtime config settings locally to buffer inside
48
+ --- `vim.b.minitabline_config` which should have same structure as
49
+ --- `MiniTabline.config`. See |mini.nvim-buffer-local-config| for more details.
50
+ ---
51
+ --- # Suggested option values ~
52
+ ---
53
+ --- Some options are set automatically by |MiniTabline.setup()|:
54
+ --- - |'showtabline'| is set to 2 to always show tabline.
55
+ ---
56
+ --- # Highlight groups ~
57
+ --- *MiniTabline-hl-groups*
58
+ ---
59
+ --- - `MiniTablineCurrent` - buffer is current (has cursor in it).
60
+ --- - `MiniTablineVisible` - buffer is visible (displayed in some window).
61
+ --- - `MiniTablineHidden` - buffer is hidden (not displayed).
62
+ --- - `MiniTablineModifiedCurrent` - buffer is modified and current.
63
+ --- - `MiniTablineModifiedVisible` - buffer is modified and visible.
64
+ --- - `MiniTablineModifiedHidden` - buffer is modified and hidden.
65
+ --- - `MiniTablineFill` - unused right space of tabline.
66
+ --- - `MiniTablineTabpagesection` - section with tabpage information.
67
+ --- - `MiniTablineTrunc` - truncation symbols indicating more left/right tabs.
68
+ ---
69
+ --- To change any highlight group, set it directly with |nvim_set_hl()|.
70
+ ---
71
+ --- # Disabling ~
72
+ ---
73
+ --- To disable (show empty tabline), set `vim.g.minitabline_disable` (globally) or
74
+ --- `vim.b.minitabline_disable` (for a buffer) to `true`. Considering high number
75
+ --- of different scenarios and customization intentions, writing exact rules
76
+ --- for disabling module's functionality is left to user. See
77
+ --- |mini.nvim-disabling-recipes| for common recipes.
78
+ ---@tag MiniTabline
79
+
80
+ -- Module definition ==========================================================
81
+ local MiniTabline = {}
82
+ local H = {}
83
+
84
+ --- Module setup
85
+ ---
86
+ ---@param config table|nil Module config table. See |MiniTabline.config|.
87
+ ---
88
+ ---@usage >lua
89
+ --- require('mini.tabline').setup() -- use default config
90
+ --- -- OR
91
+ --- require('mini.tabline').setup({}) -- replace {} with your config table
92
+ --- <
93
+ MiniTabline.setup = function(config)
94
+ -- TODO: Remove after Neovim=0.9 support is dropped
95
+ if vim.fn.has('nvim-0.10') == 0 then
96
+ vim.notify(
97
+ '(mini.tabline) Neovim<0.10 is soft deprecated (module works but is not supported).'
98
+ .. " It will be deprecated after the next 'mini.nvim' release (module might not work)."
99
+ .. ' Please update your Neovim version.'
100
+ )
101
+ end
102
+
103
+ -- Export module
104
+ _G.MiniTabline = MiniTabline
105
+
106
+ -- Setup config
107
+ config = H.setup_config(config)
108
+
109
+ -- Apply config
110
+ H.apply_config(config)
111
+
112
+ -- Define behavior
113
+ H.create_autocommands()
114
+
115
+ -- Create default highlighting
116
+ H.create_default_hl()
117
+
118
+ -- Function to make tabs clickable
119
+ vim.api.nvim_exec(
120
+ [[function! MiniTablineSwitchBuffer(buf_id, clicks, button, mod)
121
+ execute 'buffer' a:buf_id
122
+ endfunction]],
123
+ false
124
+ )
125
+ end
126
+
127
+ --- Defaults ~
128
+ ---@eval return MiniDoc.afterlines_to_code(MiniDoc.current.eval_section)
129
+ ---@text # Format ~
130
+ ---
131
+ --- `config.format` is a callable that takes buffer identifier and pre-computed
132
+ --- label as arguments and returns a string with formatted label. Output will be
133
+ --- treated strictly as text (i.e. no |'statusline'| like constructs is allowed).
134
+ --- This function will be called for all displayable in tabline buffers.
135
+ --- Default: |MiniTabline.default_format()|.
136
+ ---
137
+ --- Example of adding "+" suffix for modified buffers: >lua
138
+ ---
139
+ --- function(buf_id, label)
140
+ --- local suffix = vim.bo[buf_id].modified and '+ ' or ''
141
+ --- return MiniTabline.default_format(buf_id, label) .. suffix
142
+ --- end
143
+ --- <
144
+ MiniTabline.config = {
145
+ -- Whether to show file icons (requires 'mini.icons')
146
+ show_icons = true,
147
+
148
+ -- Function which formats the tab label
149
+ -- By default surrounds with space and possibly prepends with icon
150
+ format = nil,
151
+
152
+ -- Where to show tabpage section in case of multiple vim tabpages.
153
+ -- One of 'left', 'right', 'none'.
154
+ tabpage_section = 'left',
155
+ }
156
+ --minidoc_afterlines_end
157
+
158
+ -- Module functionality =======================================================
159
+ --- Make string for |'tabline'|
160
+ MiniTabline.make_tabline_string = function()
161
+ if H.is_disabled() then return '' end
162
+
163
+ H.make_tabpage_section()
164
+ H.list_tabs()
165
+ H.finalize_labels()
166
+ H.fit_width()
167
+
168
+ return H.concat_tabs()
169
+ end
170
+
171
+ --- Default tab format
172
+ ---
173
+ --- Used by default as `config.format`.
174
+ --- Prepends label with padded icon based on buffer's name (if `show_icon`
175
+ --- in |MiniTabline.config| is `true`) and surrounds label with single space.
176
+ --- Note: it is meant to be used only as part of `format` in |MiniTabline.config|.
177
+ ---
178
+ ---@param buf_id number Buffer identifier.
179
+ ---@param label string Pre-computed label.
180
+ ---
181
+ ---@return string Formatted label.
182
+ MiniTabline.default_format = function(buf_id, label)
183
+ if H.get_icon == nil then return string.format(' %s ', label) end
184
+ return string.format(' %s %s ', H.get_icon(vim.api.nvim_buf_get_name(buf_id)), label)
185
+ end
186
+
187
+ -- Helper data ================================================================
188
+ -- Module default config
189
+ H.default_config = vim.deepcopy(MiniTabline.config)
190
+
191
+ -- Table to keep track of tabs
192
+ H.tabs = {}
193
+
194
+ -- Keep track of initially unnamed buffers
195
+ H.unnamed_buffers_seq_ids = {}
196
+
197
+ -- Separator of file path
198
+ H.path_sep = package.config:sub(1, 1)
199
+
200
+ -- String with tabpage prefix
201
+ H.tabpage_section = ''
202
+
203
+ -- Data about truncation characters used when there are too much tabs
204
+ H.trunc = { left = '', right = '', needs_left = false, needs_right = false }
205
+
206
+ -- Buffer number of center buffer
207
+ H.center_buf_id = nil
208
+
209
+ -- Helper functionality =======================================================
210
+ -- Settings -------------------------------------------------------------------
211
+ H.setup_config = function(config)
212
+ H.check_type('config', config, 'table', true)
213
+ config = vim.tbl_deep_extend('force', vim.deepcopy(H.default_config), config or {})
214
+
215
+ H.check_type('show_icons', config.show_icons, 'boolean')
216
+ H.check_type('format', config.format, 'function', true)
217
+ H.check_type('tabpage_section', config.tabpage_section, 'string')
218
+
219
+ return config
220
+ end
221
+
222
+ H.apply_config = function(config)
223
+ MiniTabline.config = config
224
+
225
+ -- Make tabline always visible (essential for custom tabline)
226
+ vim.o.showtabline = 2
227
+
228
+ -- Cache truncation characters
229
+ H.cache_trunc_chars()
230
+
231
+ -- Set tabline string
232
+ vim.o.tabline = '%!v:lua.MiniTabline.make_tabline_string()'
233
+ end
234
+
235
+ H.create_autocommands = function()
236
+ local gr = vim.api.nvim_create_augroup('MiniTabline', {})
237
+ vim.api.nvim_create_autocmd('ColorScheme', { group = gr, callback = H.create_default_hl, desc = 'Ensure colors' })
238
+
239
+ local trunc_opts = { group = gr, pattern = { 'list', 'listchars' }, callback = H.cache_trunc_chars }
240
+ trunc_opts.desc = 'Ensure truncation characters'
241
+ vim.api.nvim_create_autocmd('OptionSet', trunc_opts)
242
+ end
243
+
244
+ --stylua: ignore
245
+ H.create_default_hl = function()
246
+ local set_default_hl = function(name, data)
247
+ data.default = true
248
+ vim.api.nvim_set_hl(0, name, data)
249
+ end
250
+
251
+ set_default_hl('MiniTablineCurrent', { link = 'TabLineSel' })
252
+ set_default_hl('MiniTablineVisible', { link = 'TabLineSel' })
253
+ set_default_hl('MiniTablineHidden', { link = 'TabLine' })
254
+
255
+ set_default_hl('MiniTablineModifiedCurrent', { link = 'StatusLine' })
256
+ set_default_hl('MiniTablineModifiedVisible', { link = 'StatusLine' })
257
+ set_default_hl('MiniTablineModifiedHidden', { link = 'StatusLineNC' })
258
+
259
+ set_default_hl('MiniTablineTabpagesection', { link = 'Search' })
260
+ set_default_hl('MiniTablineFill', { link = 'Normal' })
261
+ set_default_hl('MiniTablineTrunc', { link = 'MiniTablineHidden' })
262
+ end
263
+
264
+ H.is_disabled = function() return vim.g.minitabline_disable == true or vim.b.minitabline_disable == true end
265
+
266
+ H.get_config = function(config)
267
+ return vim.tbl_deep_extend('force', MiniTabline.config, vim.b.minitabline_config or {}, config or {})
268
+ end
269
+
270
+ -- Work with tabpages ---------------------------------------------------------
271
+ H.make_tabpage_section = function()
272
+ local n_tabpages = vim.fn.tabpagenr('$')
273
+ if n_tabpages == 1 or H.get_config().tabpage_section == 'none' then
274
+ H.tabpage_section = ''
275
+ return
276
+ end
277
+
278
+ local cur_tabpagenr = vim.fn.tabpagenr()
279
+ H.tabpage_section = string.format(' Tab %s/%s ', cur_tabpagenr, n_tabpages)
280
+ end
281
+
282
+ -- Work with tabs -------------------------------------------------------------
283
+ -- List tabs
284
+ H.list_tabs = function()
285
+ local tabs = {}
286
+ for _, buf_id in ipairs(vim.api.nvim_list_bufs()) do
287
+ if vim.bo[buf_id].buflisted then
288
+ local tab = { buf_id = buf_id }
289
+ tab['hl'] = H.construct_highlight(buf_id)
290
+ tab['tabfunc'] = '%' .. buf_id .. '@MiniTablineSwitchBuffer@'
291
+ tab['label'], tab['label_extender'] = H.construct_label_data(buf_id)
292
+
293
+ table.insert(tabs, tab)
294
+ end
295
+ end
296
+
297
+ H.tabs = tabs
298
+ end
299
+
300
+ -- Tab's highlight group
301
+ H.construct_highlight = function(buf_id)
302
+ local hl_type = buf_id == vim.api.nvim_get_current_buf() and 'Current'
303
+ or (vim.fn.bufwinnr(buf_id) > 0 and 'Visible' or 'Hidden')
304
+ if vim.bo[buf_id].modified then hl_type = 'Modified' .. hl_type end
305
+
306
+ return '%#MiniTabline' .. hl_type .. '#'
307
+ end
308
+
309
+ -- Tab's label and label extender
310
+ H.construct_label_data = function(buf_id)
311
+ local label, label_extender
312
+
313
+ local bufpath = vim.api.nvim_buf_get_name(buf_id)
314
+ if bufpath ~= '' then
315
+ -- Process path buffer
316
+ label = vim.fn.fnamemodify(bufpath, ':t')
317
+ label_extender = H.make_path_extender(buf_id)
318
+ else
319
+ -- Process unnamed buffer
320
+ label = H.make_unnamed_label(buf_id)
321
+ label_extender = function(x) return x end
322
+ end
323
+
324
+ return label, label_extender
325
+ end
326
+
327
+ H.make_path_extender = function(buf_id)
328
+ -- Add parent to current label (if possible)
329
+ return function(label)
330
+ local full_path = vim.api.nvim_buf_get_name(buf_id)
331
+ -- Using `vim.pesc` prevents effect of problematic characters (like '.')
332
+ local pattern = string.format('[^%s]+%s%s$', H.path_sep, H.path_sep, vim.pesc(label))
333
+ return string.match(full_path, pattern) or label
334
+ end
335
+ end
336
+
337
+ -- Work with unnamed buffers --------------------------------------------------
338
+ -- Unnamed buffers are tracked in `H.unnamed_buffers_seq_ids` for
339
+ -- disambiguation. This table is designed to store 'sequential' buffer
340
+ -- identifier. This approach allows to have the following behavior:
341
+ -- - Create three unnamed buffers.
342
+ -- - Delete second one.
343
+ -- - Tab label for third one remains the same.
344
+ H.make_unnamed_label = function(buf_id)
345
+ local buftype = vim.bo[buf_id].buftype
346
+ -- Differentiate quickfix/location lists and scratch/other unnamed buffers
347
+ local label = buftype == 'quickfix'
348
+ -- There can be only one quickfix buffer and many location buffers
349
+ and (vim.fn.getqflist({ qfbufnr = true }).qfbufnr == buf_id and '*quickfix*' or '*location*')
350
+ or ((buftype == 'nofile' or buftype == 'acwrite') and '!' or '*')
351
+
352
+ -- Possibly add tracking id
353
+ local unnamed_id = H.get_unnamed_id(buf_id)
354
+ if unnamed_id > 1 then label = string.format('%s(%d)', label, unnamed_id) end
355
+
356
+ return label
357
+ end
358
+
359
+ H.get_unnamed_id = function(buf_id)
360
+ -- Use existing sequential id if possible
361
+ local seq_id = H.unnamed_buffers_seq_ids[buf_id]
362
+ if seq_id ~= nil then return seq_id end
363
+
364
+ -- Cache sequential id for currently unnamed buffer `buf_id`
365
+ H.unnamed_buffers_seq_ids[buf_id] = vim.tbl_count(H.unnamed_buffers_seq_ids) + 1
366
+ return H.unnamed_buffers_seq_ids[buf_id]
367
+ end
368
+
369
+ -- Work with labels -----------------------------------------------------------
370
+ H.finalize_labels = function()
371
+ if #H.tabs == 0 then return end
372
+
373
+ -- Deduplicate
374
+ local nonunique_buf_ids = H.get_nonunique_buf_ids()
375
+ while #nonunique_buf_ids > 0 do
376
+ local nothing_changed = true
377
+
378
+ -- Extend labels
379
+ for _, buf_id in ipairs(nonunique_buf_ids) do
380
+ local tab = H.tabs[buf_id]
381
+ local old_label = tab.label
382
+ tab.label = tab.label_extender(tab.label)
383
+ if old_label ~= tab.label then nothing_changed = false end
384
+ end
385
+
386
+ if nothing_changed then break end
387
+
388
+ nonunique_buf_ids = H.get_nonunique_buf_ids()
389
+ end
390
+
391
+ -- Format labels
392
+ local config = H.get_config()
393
+
394
+ -- - Ensure cached `get_icon` for `default_format` (for better performance)
395
+ H.ensure_get_icon(config)
396
+
397
+ -- - Apply formatting
398
+ local format = config.format or MiniTabline.default_format
399
+ for _, tab in pairs(H.tabs) do
400
+ tab.label = format(tab.buf_id, tab.label)
401
+ end
402
+ end
403
+
404
+ H.get_nonunique_buf_ids = function()
405
+ local label_counts = {}
406
+ for _, tab in ipairs(H.tabs) do
407
+ label_counts[tab.label] = (label_counts[tab.label] or 0) + 1
408
+ end
409
+
410
+ local res = {}
411
+ for i, tab in ipairs(H.tabs) do
412
+ if label_counts[tab.label] > 1 then table.insert(res, i) end
413
+ end
414
+ return res
415
+ end
416
+
417
+ -- Fit tabline to maximum displayed width -------------------------------------
418
+ H.fit_width = function()
419
+ if #H.tabs == 0 then return end
420
+
421
+ local cur_buf = vim.api.nvim_get_current_buf()
422
+ if vim.bo[cur_buf].buflisted then H.center_buf_id = cur_buf end
423
+
424
+ -- Compute label width data
425
+ local center_offset = 1
426
+ local tot_width = 0
427
+ for _, tab in pairs(H.tabs) do
428
+ tab.label_width = H.strwidth(tab.label)
429
+ tab.chars_on_left = tot_width
430
+
431
+ tot_width = tot_width + tab.label_width
432
+
433
+ if tab.buf_id == H.center_buf_id then
434
+ -- Make right end of 'center tab' to be always displayed in center in
435
+ -- case of truncation
436
+ center_offset = tot_width
437
+ end
438
+ end
439
+
440
+ local display_interval = H.compute_display_interval(center_offset, tot_width)
441
+
442
+ H.truncate_tabs_display(display_interval)
443
+ end
444
+
445
+ H.compute_display_interval = function(center_offset, tabline_width)
446
+ -- left - first character to be displayed (starts with 1)
447
+ -- right - last character to be displayed
448
+ -- Conditions to be satisfied:
449
+ -- 1) right - left + 1 = math.min(tot_width, tabline_width)
450
+ -- 2) 1 <= left <= tabline_width; 1 <= right <= tabline_width
451
+
452
+ local tot_width = vim.o.columns - H.strwidth(H.tabpage_section)
453
+
454
+ -- Usage of `math.floor` is crucial to avoid non-integer values which might
455
+ -- affect total width of output tabline string.
456
+ -- Using `floor` instead of `ceil` has effect when `tot_width` is odd:
457
+ -- - `floor` makes "true center" to be between second to last and last label
458
+ -- character (usually non-space and space).
459
+ -- - `ceil` - between last character of center label and first character of
460
+ -- next label (both whitespaces).
461
+ local right = math.min(tabline_width, math.floor(center_offset + 0.5 * tot_width))
462
+ local left = math.max(1, right - tot_width + 1)
463
+ right = left + math.min(tot_width, tabline_width) - 1
464
+
465
+ return { left, right }
466
+ end
467
+
468
+ H.truncate_tabs_display = function(display_interval)
469
+ local display_left, display_right = display_interval[1], display_interval[2]
470
+
471
+ local tabs, first, last = {}, nil, nil
472
+ for i, tab in ipairs(H.tabs) do
473
+ local tab_left = tab.chars_on_left + 1
474
+ local tab_right = tab.chars_on_left + tab.label_width
475
+ if (display_left <= tab_right) and (tab_left <= display_right) then
476
+ -- Process tab that should be displayed (even partially)
477
+ local n_trunc_left = math.max(0, display_left - tab_left)
478
+ local n_trunc_right = math.max(0, tab_right - display_right)
479
+
480
+ -- Take desired amount of characters starting from `n_trunc_left`
481
+ tab.label = vim.fn.strcharpart(tab.label, n_trunc_left, tab.label_width - n_trunc_right)
482
+
483
+ table.insert(tabs, tab)
484
+
485
+ -- Keep track of the shown tab range for truncation characters
486
+ first, last = first or i, i
487
+ end
488
+ end
489
+
490
+ -- Truncate first and/or last tabs if there is anything to the left/right
491
+ H.trunc.needs_left = H.trunc.left ~= '' and (first > 1 or H.strwidth(tabs[1].label) < tabs[1].label_width)
492
+ if H.trunc.needs_left then tabs[1].label = vim.fn.strcharpart(tabs[1].label, 1) end
493
+
494
+ local n = #tabs
495
+ H.trunc.needs_right = H.trunc.right ~= '' and (last < #H.tabs or H.strwidth(tabs[n].label) < tabs[n].label_width)
496
+ if H.trunc.needs_right then tabs[n].label = vim.fn.strcharpart(tabs[n].label, 0, H.strwidth(tabs[n].label) - 1) end
497
+
498
+ H.tabs = tabs
499
+ end
500
+
501
+ H.cache_trunc_chars = function()
502
+ local trunc_chars = { left = '', right = '' }
503
+ if vim.go.list then
504
+ local listchars = vim.go.listchars
505
+ trunc_chars.left = listchars:match('precedes:(.[^,]*)') or ''
506
+ trunc_chars.right = listchars:match('extends:(.[^,]*)') or ''
507
+ end
508
+ H.trunc = trunc_chars
509
+ end
510
+
511
+ -- Concatenate tabs into single tablien string --------------------------------
512
+ H.concat_tabs = function()
513
+ -- NOTE: it is assumed that all padding is incorporated into labels
514
+ local t = {}
515
+ if H.trunc.needs_left then table.insert(t, '%#MiniTablineTrunc#' .. H.trunc.left:gsub('%%', '%%%%')) end
516
+ for _, tab in ipairs(H.tabs) do
517
+ -- Escape '%' in labels
518
+ table.insert(t, tab.hl .. tab.tabfunc .. tab.label:gsub('%%', '%%%%'))
519
+ end
520
+ if H.trunc.needs_right then table.insert(t, '%#MiniTablineTrunc#' .. H.trunc.right:gsub('%%', '%%%%')) end
521
+
522
+ -- Usage of `%X` makes filled space to the right "non-clickable"
523
+ local res = table.concat(t, '') .. '%X%#MiniTablineFill#'
524
+
525
+ -- Add tabpage section
526
+ if H.tabpage_section ~= '' then
527
+ local position = H.get_config().tabpage_section
528
+ if position == 'left' then res = '%#MiniTablineTabpagesection#' .. H.tabpage_section .. res end
529
+ if position == 'right' then res = res .. '%=%#MiniTablineTabpagesection#' .. H.tabpage_section end
530
+ end
531
+
532
+ return res
533
+ end
534
+
535
+ -- Utilities ------------------------------------------------------------------
536
+ H.error = function(msg) error('(mini.tabline) ' .. msg, 0) end
537
+
538
+ H.check_type = function(name, val, ref, allow_nil)
539
+ if type(val) == ref or (ref == 'callable' and vim.is_callable(val)) or (allow_nil and val == nil) then return end
540
+ H.error(string.format('`%s` should be %s, not %s', name, ref, type(val)))
541
+ end
542
+
543
+ H.strwidth = function(x) return vim.api.nvim_strwidth(x) end
544
+
545
+ H.ensure_get_icon = function(config)
546
+ if not config.show_icons then
547
+ -- Show no icon
548
+ H.get_icon = nil
549
+ elseif H.get_icon ~= nil then
550
+ -- Cache only once
551
+ return
552
+ elseif _G.MiniIcons ~= nil then
553
+ -- Prefer 'mini.icons'
554
+ H.get_icon = function(name) return (_G.MiniIcons.get('file', name)) end
555
+ else
556
+ -- Try falling back to 'nvim-web-devicons'
557
+ local has_devicons, devicons = pcall(require, 'nvim-web-devicons')
558
+ if not has_devicons then return end
559
+ -- Use basename because it makes exact file name matching work
560
+ H.get_icon = function(name) return (devicons.get_icon(vim.fn.fnamemodify(name, ':t'), nil, { default = true })) end
561
+ end
562
+ end
563
+
564
+ return MiniTabline