peovim 0.1.0__tar.gz

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 (310) hide show
  1. peovim-0.1.0/LICENSE +21 -0
  2. peovim-0.1.0/PKG-INFO +344 -0
  3. peovim-0.1.0/README.md +264 -0
  4. peovim-0.1.0/peovim/__init__.py +1 -0
  5. peovim-0.1.0/peovim/_native/__init__.py +19 -0
  6. peovim-0.1.0/peovim/_native/cell_grid.c +18902 -0
  7. peovim-0.1.0/peovim/_native/window_renderer.c +38063 -0
  8. peovim-0.1.0/peovim/api/__init__.py +23 -0
  9. peovim-0.1.0/peovim/api/_metadata.py +80 -0
  10. peovim-0.1.0/peovim/api/buffer_api.py +347 -0
  11. peovim-0.1.0/peovim/api/commands_api.py +40 -0
  12. peovim-0.1.0/peovim/api/completion_api.py +5 -0
  13. peovim-0.1.0/peovim/api/debug_api.py +5 -0
  14. peovim-0.1.0/peovim/api/diagnostics_api.py +5 -0
  15. peovim-0.1.0/peovim/api/diff_api.py +5 -0
  16. peovim-0.1.0/peovim/api/editor.py +943 -0
  17. peovim-0.1.0/peovim/api/events_api.py +37 -0
  18. peovim-0.1.0/peovim/api/git_api.py +152 -0
  19. peovim-0.1.0/peovim/api/health_api.py +45 -0
  20. peovim-0.1.0/peovim/api/jumplist_api.py +5 -0
  21. peovim-0.1.0/peovim/api/keymap_api.py +98 -0
  22. peovim-0.1.0/peovim/api/lsp_api.py +808 -0
  23. peovim-0.1.0/peovim/api/modal_api.py +41 -0
  24. peovim-0.1.0/peovim/api/options_api.py +31 -0
  25. peovim-0.1.0/peovim/api/quickfix_api.py +5 -0
  26. peovim-0.1.0/peovim/api/registers_api.py +5 -0
  27. peovim-0.1.0/peovim/api/repl_api.py +5 -0
  28. peovim-0.1.0/peovim/api/session_api.py +294 -0
  29. peovim-0.1.0/peovim/api/snippets_api.py +5 -0
  30. peovim-0.1.0/peovim/api/store_api.py +15 -0
  31. peovim-0.1.0/peovim/api/syntax_api.py +5 -0
  32. peovim-0.1.0/peovim/api/testing_api.py +5 -0
  33. peovim-0.1.0/peovim/api/ui_api.py +401 -0
  34. peovim-0.1.0/peovim/api/window_api.py +218 -0
  35. peovim-0.1.0/peovim/api/workspace_api.py +78 -0
  36. peovim-0.1.0/peovim/api.py +7 -0
  37. peovim-0.1.0/peovim/commands/__init__.py +0 -0
  38. peovim-0.1.0/peovim/commands/builtin.py +1374 -0
  39. peovim-0.1.0/peovim/commands/parser.py +156 -0
  40. peovim-0.1.0/peovim/commands/registry.py +80 -0
  41. peovim-0.1.0/peovim/config/__init__.py +0 -0
  42. peovim-0.1.0/peovim/config/editorconfig.py +7 -0
  43. peovim-0.1.0/peovim/config/loader.py +226 -0
  44. peovim-0.1.0/peovim/config/project.py +114 -0
  45. peovim-0.1.0/peovim/core/__init__.py +0 -0
  46. peovim-0.1.0/peovim/core/buffer.py +335 -0
  47. peovim-0.1.0/peovim/core/cursor.py +102 -0
  48. peovim-0.1.0/peovim/core/decorations_store.py +86 -0
  49. peovim-0.1.0/peovim/core/diffing.py +79 -0
  50. peovim-0.1.0/peovim/core/document.py +385 -0
  51. peovim-0.1.0/peovim/core/editor_state.py +112 -0
  52. peovim-0.1.0/peovim/core/event_bus.py +90 -0
  53. peovim-0.1.0/peovim/core/filetype.py +192 -0
  54. peovim-0.1.0/peovim/core/fold.py +103 -0
  55. peovim-0.1.0/peovim/core/health.py +188 -0
  56. peovim-0.1.0/peovim/core/health_checks.py +582 -0
  57. peovim-0.1.0/peovim/core/history.py +120 -0
  58. peovim-0.1.0/peovim/core/jumplist.py +73 -0
  59. peovim-0.1.0/peovim/core/log_manager.py +291 -0
  60. peovim-0.1.0/peovim/core/marks.py +85 -0
  61. peovim-0.1.0/peovim/core/options.py +242 -0
  62. peovim-0.1.0/peovim/core/persistence.py +31 -0
  63. peovim-0.1.0/peovim/core/persistence_policy.py +71 -0
  64. peovim-0.1.0/peovim/core/recovery.py +174 -0
  65. peovim-0.1.0/peovim/core/registers.py +245 -0
  66. peovim-0.1.0/peovim/core/search.py +114 -0
  67. peovim-0.1.0/peovim/core/shada.py +333 -0
  68. peovim-0.1.0/peovim/core/sign_registry.py +40 -0
  69. peovim-0.1.0/peovim/core/snapshot.py +57 -0
  70. peovim-0.1.0/peovim/core/store_api.py +84 -0
  71. peovim-0.1.0/peovim/core/style.py +53 -0
  72. peovim-0.1.0/peovim/core/text_edits.py +81 -0
  73. peovim-0.1.0/peovim/core/transaction.py +9 -0
  74. peovim-0.1.0/peovim/core/window.py +116 -0
  75. peovim-0.1.0/peovim/core/workspace.py +466 -0
  76. peovim-0.1.0/peovim/debug/__init__.py +0 -0
  77. peovim-0.1.0/peovim/debug/client.py +6 -0
  78. peovim-0.1.0/peovim/debug/profile_workloads.py +833 -0
  79. peovim-0.1.0/peovim/debug/protocol.py +7 -0
  80. peovim-0.1.0/peovim/debug/session.py +7 -0
  81. peovim-0.1.0/peovim/git/__init__.py +31 -0
  82. peovim-0.1.0/peovim/git/presentation.py +31 -0
  83. peovim-0.1.0/peovim/git/repository.py +431 -0
  84. peovim-0.1.0/peovim/lsp/__init__.py +0 -0
  85. peovim-0.1.0/peovim/lsp/client.py +167 -0
  86. peovim-0.1.0/peovim/lsp/features.py +1043 -0
  87. peovim-0.1.0/peovim/lsp/manager.py +523 -0
  88. peovim-0.1.0/peovim/lsp/protocol.py +102 -0
  89. peovim-0.1.0/peovim/main.py +364 -0
  90. peovim-0.1.0/peovim/modal/__init__.py +0 -0
  91. peovim-0.1.0/peovim/modal/actions.py +592 -0
  92. peovim-0.1.0/peovim/modal/dispatcher.py +523 -0
  93. peovim-0.1.0/peovim/modal/dispatcher_buffers.py +117 -0
  94. peovim-0.1.0/peovim/modal/dispatcher_clipboard.py +166 -0
  95. peovim-0.1.0/peovim/modal/dispatcher_commands.py +42 -0
  96. peovim-0.1.0/peovim/modal/dispatcher_ex_commands.py +57 -0
  97. peovim-0.1.0/peovim/modal/dispatcher_folds.py +45 -0
  98. peovim-0.1.0/peovim/modal/dispatcher_modes.py +167 -0
  99. peovim-0.1.0/peovim/modal/dispatcher_navigation.py +79 -0
  100. peovim-0.1.0/peovim/modal/dispatcher_plugins.py +40 -0
  101. peovim-0.1.0/peovim/modal/dispatcher_repeat.py +70 -0
  102. peovim-0.1.0/peovim/modal/dispatcher_search.py +108 -0
  103. peovim-0.1.0/peovim/modal/dispatcher_text.py +399 -0
  104. peovim-0.1.0/peovim/modal/dispatcher_workspace.py +160 -0
  105. peovim-0.1.0/peovim/modal/engine.py +1943 -0
  106. peovim-0.1.0/peovim/modal/keybindings.py +332 -0
  107. peovim-0.1.0/peovim/modal/motions.py +732 -0
  108. peovim-0.1.0/peovim/modal/operators.py +6 -0
  109. peovim-0.1.0/peovim/modal/text_objects.py +311 -0
  110. peovim-0.1.0/peovim/plugins/__init__.py +0 -0
  111. peovim-0.1.0/peovim/plugins/ai.py +6 -0
  112. peovim-0.1.0/peovim/plugins/align.py +136 -0
  113. peovim-0.1.0/peovim/plugins/autopairs.py +136 -0
  114. peovim-0.1.0/peovim/plugins/calltree.py +6 -0
  115. peovim-0.1.0/peovim/plugins/codemap.py +879 -0
  116. peovim-0.1.0/peovim/plugins/commentary.py +181 -0
  117. peovim-0.1.0/peovim/plugins/compare.py +981 -0
  118. peovim-0.1.0/peovim/plugins/copilot.py +387 -0
  119. peovim-0.1.0/peovim/plugins/copilot_client.py +274 -0
  120. peovim-0.1.0/peovim/plugins/dashboard.py +251 -0
  121. peovim-0.1.0/peovim/plugins/debugpy.py +6 -0
  122. peovim-0.1.0/peovim/plugins/diagnostics_panel.py +220 -0
  123. peovim-0.1.0/peovim/plugins/diff.py +6 -0
  124. peovim-0.1.0/peovim/plugins/editor_utils.py +144 -0
  125. peovim-0.1.0/peovim/plugins/editorconfig.py +84 -0
  126. peovim-0.1.0/peovim/plugins/explorer.py +528 -0
  127. peovim-0.1.0/peovim/plugins/filehistory.py +349 -0
  128. peovim-0.1.0/peovim/plugins/flash.py +277 -0
  129. peovim-0.1.0/peovim/plugins/formatter.py +158 -0
  130. peovim-0.1.0/peovim/plugins/fquick.py +331 -0
  131. peovim-0.1.0/peovim/plugins/gitsigns.py +934 -0
  132. peovim-0.1.0/peovim/plugins/guess_indent.py +116 -0
  133. peovim-0.1.0/peovim/plugins/local_history.py +536 -0
  134. peovim-0.1.0/peovim/plugins/lsp.py +535 -0
  135. peovim-0.1.0/peovim/plugins/manager.py +184 -0
  136. peovim-0.1.0/peovim/plugins/markers.py +931 -0
  137. peovim-0.1.0/peovim/plugins/notifications.py +6 -0
  138. peovim-0.1.0/peovim/plugins/outline.py +269 -0
  139. peovim-0.1.0/peovim/plugins/perf_panel.py +250 -0
  140. peovim-0.1.0/peovim/plugins/picker.py +420 -0
  141. peovim-0.1.0/peovim/plugins/proposed_review.py +400 -0
  142. peovim-0.1.0/peovim/plugins/pytest.py +6 -0
  143. peovim-0.1.0/peovim/plugins/python.py +6 -0
  144. peovim-0.1.0/peovim/plugins/references_panel.py +450 -0
  145. peovim-0.1.0/peovim/plugins/remote.py +6 -0
  146. peovim-0.1.0/peovim/plugins/repl.py +81 -0
  147. peovim-0.1.0/peovim/plugins/session.py +95 -0
  148. peovim-0.1.0/peovim/plugins/session_additions.py +159 -0
  149. peovim-0.1.0/peovim/plugins/spell.py +6 -0
  150. peovim-0.1.0/peovim/plugins/surround.py +180 -0
  151. peovim-0.1.0/peovim/plugins/svnsigns.py +634 -0
  152. peovim-0.1.0/peovim/plugins/tabs_to_spaces.py +127 -0
  153. peovim-0.1.0/peovim/plugins/todo.py +196 -0
  154. peovim-0.1.0/peovim/plugins/vcssigns.py +84 -0
  155. peovim-0.1.0/peovim/plugins/verilog_lsp/__init__.py +51 -0
  156. peovim-0.1.0/peovim/plugins/verilog_lsp/hierarchy_panel.py +1780 -0
  157. peovim-0.1.0/peovim/plugins/verilog_lsp/plugin.py +400 -0
  158. peovim-0.1.0/peovim/plugins/verilog_lsp/signal_trace.py +330 -0
  159. peovim-0.1.0/peovim/plugins/which_key.py +178 -0
  160. peovim-0.1.0/peovim/plugins/workspace_symbols.py +208 -0
  161. peovim-0.1.0/peovim/syntax/__init__.py +0 -0
  162. peovim-0.1.0/peovim/syntax/engine.py +263 -0
  163. peovim-0.1.0/peovim/syntax/languages.py +134 -0
  164. peovim-0.1.0/peovim/syntax/queries/c.scm +91 -0
  165. peovim-0.1.0/peovim/syntax/queries/cpp.scm +143 -0
  166. peovim-0.1.0/peovim/syntax/queries/markdown.scm +39 -0
  167. peovim-0.1.0/peovim/syntax/queries/verilog.scm +55 -0
  168. peovim-0.1.0/peovim/syntax/queries/xdc.scm +47 -0
  169. peovim-0.1.0/peovim/syntax/themes.py +326 -0
  170. peovim-0.1.0/peovim/ui/__init__.py +0 -0
  171. peovim-0.1.0/peovim/ui/_cell_grid_pure.py +340 -0
  172. peovim-0.1.0/peovim/ui/_window_renderer_pure.py +685 -0
  173. peovim-0.1.0/peovim/ui/alloc_tracer.py +72 -0
  174. peovim-0.1.0/peovim/ui/backend.py +174 -0
  175. peovim-0.1.0/peovim/ui/backend_factory.py +65 -0
  176. peovim-0.1.0/peovim/ui/backends/__init__.py +0 -0
  177. peovim-0.1.0/peovim/ui/backends/crossterm.py +204 -0
  178. peovim-0.1.0/peovim/ui/backends/headless.py +168 -0
  179. peovim-0.1.0/peovim/ui/backends/prompt_toolkit.py +427 -0
  180. peovim-0.1.0/peovim/ui/bottom_panel.py +532 -0
  181. peovim-0.1.0/peovim/ui/cell_grid.py +18 -0
  182. peovim-0.1.0/peovim/ui/cmdline_controller.py +161 -0
  183. peovim-0.1.0/peovim/ui/command_line.py +420 -0
  184. peovim-0.1.0/peovim/ui/completion.py +248 -0
  185. peovim-0.1.0/peovim/ui/cursor_controller.py +124 -0
  186. peovim-0.1.0/peovim/ui/decorations.py +116 -0
  187. peovim-0.1.0/peovim/ui/event_loop.py +754 -0
  188. peovim-0.1.0/peovim/ui/float_manager.py +355 -0
  189. peovim-0.1.0/peovim/ui/frame_controller.py +180 -0
  190. peovim-0.1.0/peovim/ui/gc_tracer.py +71 -0
  191. peovim-0.1.0/peovim/ui/ghost_text.py +85 -0
  192. peovim-0.1.0/peovim/ui/input_controller.py +411 -0
  193. peovim-0.1.0/peovim/ui/layout.py +82 -0
  194. peovim-0.1.0/peovim/ui/lsp_ui_adapter.py +324 -0
  195. peovim-0.1.0/peovim/ui/markdown.py +438 -0
  196. peovim-0.1.0/peovim/ui/mouse_dispatcher.py +351 -0
  197. peovim-0.1.0/peovim/ui/notify.py +167 -0
  198. peovim-0.1.0/peovim/ui/panel_host.py +286 -0
  199. peovim-0.1.0/peovim/ui/perf_sampler.py +117 -0
  200. peovim-0.1.0/peovim/ui/picker.py +416 -0
  201. peovim-0.1.0/peovim/ui/presentation_controller.py +234 -0
  202. peovim-0.1.0/peovim/ui/render_cycle_controller.py +119 -0
  203. peovim-0.1.0/peovim/ui/render_jobs.py +303 -0
  204. peovim-0.1.0/peovim/ui/runtime_controller.py +243 -0
  205. peovim-0.1.0/peovim/ui/scrollbar.py +53 -0
  206. peovim-0.1.0/peovim/ui/sidebar.py +429 -0
  207. peovim-0.1.0/peovim/ui/status_bar.py +192 -0
  208. peovim-0.1.0/peovim/ui/terminal_buffer.py +214 -0
  209. peovim-0.1.0/peovim/ui/text_layout.py +40 -0
  210. peovim-0.1.0/peovim/ui/tree_view.py +368 -0
  211. peovim-0.1.0/peovim/ui/which_key_panel.py +118 -0
  212. peovim-0.1.0/peovim/ui/window_render_controller.py +321 -0
  213. peovim-0.1.0/peovim/ui/window_renderer.py +76 -0
  214. peovim-0.1.0/peovim.egg-info/PKG-INFO +344 -0
  215. peovim-0.1.0/peovim.egg-info/SOURCES.txt +308 -0
  216. peovim-0.1.0/peovim.egg-info/dependency_links.txt +1 -0
  217. peovim-0.1.0/peovim.egg-info/entry_points.txt +2 -0
  218. peovim-0.1.0/peovim.egg-info/requires.txt +40 -0
  219. peovim-0.1.0/peovim.egg-info/top_level.txt +1 -0
  220. peovim-0.1.0/pyproject.toml +115 -0
  221. peovim-0.1.0/setup.cfg +4 -0
  222. peovim-0.1.0/setup.py +72 -0
  223. peovim-0.1.0/tests/test_api.py +1017 -0
  224. peovim-0.1.0/tests/test_backend_crossterm.py +99 -0
  225. peovim-0.1.0/tests/test_backend_factory.py +212 -0
  226. peovim-0.1.0/tests/test_backend_prompt_toolkit.py +255 -0
  227. peovim-0.1.0/tests/test_bottom_panel.py +397 -0
  228. peovim-0.1.0/tests/test_buffer.py +701 -0
  229. peovim-0.1.0/tests/test_commands.py +572 -0
  230. peovim-0.1.0/tests/test_config_loader.py +486 -0
  231. peovim-0.1.0/tests/test_core_diffing.py +119 -0
  232. peovim-0.1.0/tests/test_cursor.py +142 -0
  233. peovim-0.1.0/tests/test_decorations_store.py +122 -0
  234. peovim-0.1.0/tests/test_dispatcher_buffers.py +226 -0
  235. peovim-0.1.0/tests/test_dispatcher_commands.py +129 -0
  236. peovim-0.1.0/tests/test_dispatcher_navigation.py +164 -0
  237. peovim-0.1.0/tests/test_dispatcher_plugins.py +109 -0
  238. peovim-0.1.0/tests/test_dispatcher_postprocessing.py +58 -0
  239. peovim-0.1.0/tests/test_docs.py +52 -0
  240. peovim-0.1.0/tests/test_document.py +404 -0
  241. peovim-0.1.0/tests/test_event_bus.py +137 -0
  242. peovim-0.1.0/tests/test_event_loop_cmdline.py +1214 -0
  243. peovim-0.1.0/tests/test_external_file_changes.py +166 -0
  244. peovim-0.1.0/tests/test_folding.py +378 -0
  245. peovim-0.1.0/tests/test_git_api.py +396 -0
  246. peovim-0.1.0/tests/test_health.py +1008 -0
  247. peovim-0.1.0/tests/test_indent_guides.py +172 -0
  248. peovim-0.1.0/tests/test_integration.py +490 -0
  249. peovim-0.1.0/tests/test_jumplist.py +133 -0
  250. peovim-0.1.0/tests/test_layout.py +144 -0
  251. peovim-0.1.0/tests/test_log_manager.py +192 -0
  252. peovim-0.1.0/tests/test_lsp.py +1472 -0
  253. peovim-0.1.0/tests/test_markdown.py +114 -0
  254. peovim-0.1.0/tests/test_marks.py +134 -0
  255. peovim-0.1.0/tests/test_modal.py +896 -0
  256. peovim-0.1.0/tests/test_motions.py +381 -0
  257. peovim-0.1.0/tests/test_mouse.py +275 -0
  258. peovim-0.1.0/tests/test_mutation_safety.py +163 -0
  259. peovim-0.1.0/tests/test_operators.py +502 -0
  260. peovim-0.1.0/tests/test_options.py +324 -0
  261. peovim-0.1.0/tests/test_persistence.py +30 -0
  262. peovim-0.1.0/tests/test_picker.py +498 -0
  263. peovim-0.1.0/tests/test_plugin_align.py +134 -0
  264. peovim-0.1.0/tests/test_plugin_autopairs.py +105 -0
  265. peovim-0.1.0/tests/test_plugin_commentary.py +104 -0
  266. peovim-0.1.0/tests/test_plugin_compare.py +781 -0
  267. peovim-0.1.0/tests/test_plugin_dashboard.py +261 -0
  268. peovim-0.1.0/tests/test_plugin_diagnostics_panel.py +207 -0
  269. peovim-0.1.0/tests/test_plugin_editorconfig.py +192 -0
  270. peovim-0.1.0/tests/test_plugin_explorer.py +596 -0
  271. peovim-0.1.0/tests/test_plugin_flash.py +196 -0
  272. peovim-0.1.0/tests/test_plugin_formatter.py +137 -0
  273. peovim-0.1.0/tests/test_plugin_fquick.py +230 -0
  274. peovim-0.1.0/tests/test_plugin_gitsigns.py +854 -0
  275. peovim-0.1.0/tests/test_plugin_guess_indent.py +123 -0
  276. peovim-0.1.0/tests/test_plugin_local_history.py +182 -0
  277. peovim-0.1.0/tests/test_plugin_lsp.py +448 -0
  278. peovim-0.1.0/tests/test_plugin_manager_lazy.py +187 -0
  279. peovim-0.1.0/tests/test_plugin_markers.py +467 -0
  280. peovim-0.1.0/tests/test_plugin_outline.py +207 -0
  281. peovim-0.1.0/tests/test_plugin_picker.py +441 -0
  282. peovim-0.1.0/tests/test_plugin_proposed_review.py +213 -0
  283. peovim-0.1.0/tests/test_plugin_references_panel.py +333 -0
  284. peovim-0.1.0/tests/test_plugin_session_additions.py +126 -0
  285. peovim-0.1.0/tests/test_plugin_surround.py +128 -0
  286. peovim-0.1.0/tests/test_plugin_svnsigns.py +67 -0
  287. peovim-0.1.0/tests/test_plugin_tabs_to_spaces.py +95 -0
  288. peovim-0.1.0/tests/test_plugin_todo.py +237 -0
  289. peovim-0.1.0/tests/test_plugin_verilog_hierarchy.py +1580 -0
  290. peovim-0.1.0/tests/test_plugin_verilog_signal_trace.py +134 -0
  291. peovim-0.1.0/tests/test_plugin_which_key.py +127 -0
  292. peovim-0.1.0/tests/test_plugin_workspace_symbols.py +217 -0
  293. peovim-0.1.0/tests/test_profile_workloads.py +103 -0
  294. peovim-0.1.0/tests/test_recovery.py +461 -0
  295. peovim-0.1.0/tests/test_registers.py +161 -0
  296. peovim-0.1.0/tests/test_render_jobs.py +401 -0
  297. peovim-0.1.0/tests/test_renderer.py +681 -0
  298. peovim-0.1.0/tests/test_search.py +428 -0
  299. peovim-0.1.0/tests/test_session.py +305 -0
  300. peovim-0.1.0/tests/test_shada.py +383 -0
  301. peovim-0.1.0/tests/test_sidebar.py +427 -0
  302. peovim-0.1.0/tests/test_store_api.py +37 -0
  303. peovim-0.1.0/tests/test_syntax.py +866 -0
  304. peovim-0.1.0/tests/test_syntax_contract.py +109 -0
  305. peovim-0.1.0/tests/test_terminal_buffer.py +99 -0
  306. peovim-0.1.0/tests/test_text_objects.py +245 -0
  307. peovim-0.1.0/tests/test_tree_view.py +224 -0
  308. peovim-0.1.0/tests/test_undo.py +197 -0
  309. peovim-0.1.0/tests/test_window.py +109 -0
  310. peovim-0.1.0/tests/test_workspace.py +593 -0
peovim-0.1.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Chip Lukes
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
peovim-0.1.0/PKG-INFO ADDED
@@ -0,0 +1,344 @@
1
+ Metadata-Version: 2.4
2
+ Name: peovim
3
+ Version: 0.1.0
4
+ Summary: A fast, modern, cross-platform modal text editor
5
+ Author: Chip Lukes
6
+ License: MIT License
7
+
8
+ Copyright (c) 2026 Chip Lukes
9
+
10
+ Permission is hereby granted, free of charge, to any person obtaining a copy
11
+ of this software and associated documentation files (the "Software"), to deal
12
+ in the Software without restriction, including without limitation the rights
13
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
+ copies of the Software, and to permit persons to whom the Software is
15
+ furnished to do so, subject to the following conditions:
16
+
17
+ The above copyright notice and this permission notice shall be included in all
18
+ copies or substantial portions of the Software.
19
+
20
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
+ SOFTWARE.
27
+
28
+ Project-URL: Homepage, https://github.com/chiplukes/peovim
29
+ Project-URL: Repository, https://github.com/chiplukes/peovim
30
+ Project-URL: Bug Tracker, https://github.com/chiplukes/peovim/issues
31
+ Keywords: editor,modal,vim,neovim,terminal,tui
32
+ Classifier: Development Status :: 3 - Alpha
33
+ Classifier: Environment :: Console
34
+ Classifier: Intended Audience :: Developers
35
+ Classifier: License :: OSI Approved :: MIT License
36
+ Classifier: Operating System :: OS Independent
37
+ Classifier: Programming Language :: Python :: 3
38
+ Classifier: Programming Language :: Python :: 3.13
39
+ Classifier: Topic :: Text Editors
40
+ Requires-Python: >=3.13
41
+ Description-Content-Type: text/markdown
42
+ License-File: LICENSE
43
+ Requires-Dist: prompt-toolkit>=3.0
44
+ Requires-Dist: tree-sitter>=0.22
45
+ Requires-Dist: rapidfuzz>=3.0
46
+ Requires-Dist: platformdirs>=4.0
47
+ Requires-Dist: editorconfig
48
+ Requires-Dist: charset-normalizer
49
+ Requires-Dist: msgpack
50
+ Requires-Dist: portalocker>=2.0
51
+ Requires-Dist: pyte>=0.8.2
52
+ Requires-Dist: tree-sitter-python
53
+ Requires-Dist: tree-sitter-javascript
54
+ Requires-Dist: tree-sitter-typescript
55
+ Requires-Dist: tree-sitter-rust
56
+ Requires-Dist: tree-sitter-c
57
+ Requires-Dist: tree-sitter-cpp
58
+ Requires-Dist: tree-sitter-go
59
+ Requires-Dist: tree-sitter-lua
60
+ Requires-Dist: tree-sitter-json
61
+ Requires-Dist: tree-sitter-yaml
62
+ Requires-Dist: tree-sitter-toml
63
+ Requires-Dist: tree-sitter-markdown
64
+ Requires-Dist: tree-sitter-bash
65
+ Requires-Dist: tree-sitter-verilog
66
+ Provides-Extra: grammars
67
+ Provides-Extra: native
68
+ Requires-Dist: cython>=3.0; extra == "native"
69
+ Provides-Extra: fast
70
+ Requires-Dist: pygit2; extra == "fast"
71
+ Requires-Dist: jedi; extra == "fast"
72
+ Provides-Extra: dev
73
+ Requires-Dist: pytest>=8.0; extra == "dev"
74
+ Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
75
+ Requires-Dist: scalene; extra == "dev"
76
+ Requires-Dist: ruff; extra == "dev"
77
+ Requires-Dist: ty; extra == "dev"
78
+ Requires-Dist: pre-commit; extra == "dev"
79
+ Dynamic: license-file
80
+
81
+ # Peovim
82
+
83
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
84
+ [![Python 3.13+](https://img.shields.io/badge/python-3.13+-blue.svg)](https://www.python.org/downloads/)
85
+
86
+ A fast, modern, cross-platform modal text editor written in Python — heavily inspired by Neovim with a clean plugin API designed for extensibility.
87
+
88
+ I've been a Vim/Neovim editor Nerd for a long time and this project grew out of the question:
89
+
90
+ * "Can a basic Vim/Neovim style modal editor be created entirely with Python?"
91
+
92
+ Achieving basic functionality was surprisingly straightforward, but then I immediately had these follow up questions:
93
+
94
+ * Can I start adding all the plugins/features that I use in Neovim?
95
+ * How slow will this be with this built using Python?
96
+
97
+ It turns out that most of the things that I wanted were relatively simple to add, especially with AI assistance. Additional features should be easy to add via the plugin API.
98
+
99
+ An optional Cython based renderer was added as a performance improvement.
100
+
101
+ Being written entirely in Python this editor is very easy to modify or create plugins for (especially with AI tools). If you are a modal editor nerd, fork this project and create your own hyper customized modal editor!.
102
+
103
+ ![Peovim demo](demo.gif)
104
+
105
+ ## Features
106
+
107
+ - **Modal editing** — Normal, Insert, Visual, and Visual Block modes with Vim-compatible bindings
108
+ - **LSP support** — go to definition, hover, references, rename, code actions, completions, diagnostics, inlay hints
109
+ - **Syntax highlighting** — tree-sitter powered, covering Python, JS/TS, Rust, Go, C/C++, Lua, and more
110
+ - **Side/Bottom Panels** — file explorer, document outline, diagnostics, references, workspace symbols, git status
111
+ - **Git integration** — status panel with staging/unstaging/discarding, branch management, diff view, log browser
112
+ - **Fuzzy finder** — file picker, buffer picker, live grep, command palette
113
+ - **Session management** — autosave/restore with per-project state
114
+ - **Flash jump** — 2-char jump labels (`s` in normal mode)
115
+ - **Which-key** — similar to Folke's key hint overlay Neovim plugin (my personal favorite Neovim plugin!)
116
+ - **Marker groups** — persistent bookmarks with annotations and gutter signs
117
+ - **Local history** — per-file timestamped save history
118
+ - **Copilot** — support for Copilot autocompletions.
119
+ - **Plugin API** — plain Python plugins with event hooks, keymaps, commands, decorations, and sidebar panels
120
+
121
+ ## Features more unique to my (Verilog, Python) workflow
122
+ - **Verilog LSP** — a custom LSP that allows heirarchy collapse/extract, signal tracing, and more features using [verilog-tools](https://github.com/chiplukes/verilog-parser)
123
+
124
+ ## Requirements
125
+
126
+ - Python 3.13+
127
+ - [uv](https://docs.astral.sh/uv/) package manager
128
+
129
+ ## Installation
130
+
131
+ ### From source (development)
132
+
133
+ ```bash
134
+ git clone https://github.com/chiplukes/peovim
135
+ cd peovim
136
+ uv sync
137
+ ```
138
+
139
+ ### As a global tool
140
+
141
+ ```bash
142
+ uv tool install .
143
+ ```
144
+
145
+ After install, the `peovim` command is available on your PATH:
146
+
147
+ ```bash
148
+ peovim # open empty buffer
149
+ peovim file.py # open a file
150
+ ```
151
+
152
+ ### Updating
153
+
154
+ Pull the latest changes, then reinstall:
155
+
156
+ ```bash
157
+ git pull
158
+ uv tool install --reinstall .
159
+ ```
160
+
161
+ ## Running (development)
162
+
163
+ ```bash
164
+ uv run peovim # open empty buffer
165
+ uv run peovim file.py # open a file
166
+ ```
167
+
168
+ ## Configuration
169
+
170
+ Create `init.py` at the platform config path:
171
+
172
+ | Platform | Path |
173
+ |----------|------|
174
+ | Windows | `%APPDATA%\peovim\init.py` |
175
+ | Linux | `~/.config/peovim/init.py` |
176
+ | macOS | `~/Library/Application Support/peovim/init.py` |
177
+
178
+ The config file is plain Python. Example:
179
+
180
+ ```python
181
+ # init.py
182
+
183
+ plugins.load("peovim.plugins.lsp")
184
+ plugins.load("peovim.plugins.picker")
185
+ plugins.load("peovim.plugins.explorer")
186
+ plugins.load("peovim.plugins.outline")
187
+ plugins.load("peovim.plugins.gitsigns")
188
+ plugins.load("peovim.plugins.diagnostics_panel")
189
+ plugins.load("peovim.plugins.formatter")
190
+ plugins.load("peovim.plugins.local_history")
191
+
192
+ # Space as leader (default is backslash)
193
+ options.set("leader", " ")
194
+ options.set("number", True)
195
+ options.set("relativenumber", True)
196
+ options.set("tabstop", 4)
197
+
198
+ # Custom keybindings
199
+ keymap.nmap("<leader>w", ":w<CR>", desc="Save file")
200
+ ```
201
+
202
+ Project-local config at `.peovim/init.py` is also supported — the editor prompts for trust on first encounter.
203
+
204
+ A more thorough `init.py` can be found here:
205
+
206
+ [My Init.py](https://github.com/chiplukes/.dotfiles/blob/master/.config/peovim/init.py)
207
+
208
+ ## Key Bindings
209
+
210
+ ### Navigation
211
+
212
+ | Key | Action |
213
+ |-----|--------|
214
+ | `<leader>ff` | Fuzzy find files |
215
+ | `<leader>fg` | Live grep |
216
+ | `<leader>fb` | Open buffers |
217
+ | `<leader>sw` | Grep word under cursor |
218
+ | `<C-o>` / `<C-i>` | Jump back / forward |
219
+ | `gf` | Go to file under cursor |
220
+ | `s` | Flash jump (type 2 chars) |
221
+
222
+ ### LSP
223
+
224
+ | Key | Action |
225
+ |-----|--------|
226
+ | `gd` | Go to definition |
227
+ | `K` | Hover documentation |
228
+ | `<leader>gr` | References sidebar |
229
+ | `<leader>rn` | Rename symbol |
230
+ | `<leader>ca` | Code actions |
231
+ | `]d` / `[d` | Next / previous diagnostic |
232
+ | `<leader>o` | Document outline sidebar |
233
+ | `<leader>cD` | Diagnostics sidebar |
234
+ | `<leader>csw` | Workspace symbols sidebar |
235
+
236
+ ### Sidebar
237
+
238
+ | Key | Action |
239
+ |-----|--------|
240
+ | `<leader>e` | Toggle file explorer |
241
+ | `<leader>gs` | Toggle git panel |
242
+ | `<A-h>` | Focus sidebar from editor |
243
+ | `<A-l>` | Return to editor from sidebar |
244
+ | `<A-j>` / `<A-k>` | Cycle sidebar panels |
245
+ | `<Esc>` | Hide sidebar |
246
+
247
+ ### Git Panel (when focused)
248
+
249
+ | Key | Action |
250
+ |-----|--------|
251
+ | `a` | Stage file |
252
+ | `u` | Unstage file |
253
+ | `x` | Discard changes |
254
+ | `d` | Diff file against HEAD |
255
+ | `l` | Git log browser |
256
+ | `P` | Push |
257
+ | `p` | Pull |
258
+
259
+ ### Editing
260
+
261
+ | Key | Action |
262
+ |-----|--------|
263
+ | `gcc` | Toggle comment |
264
+ | `ysiw{char}` | Surround inner word |
265
+ | `cs{old}{new}` | Change surrounding |
266
+ | `ds{char}` | Delete surrounding |
267
+ | `<leader>pr` | Paste from yank register |
268
+ | `ga` (visual) | Align on character |
269
+
270
+ See [`notes/keys.md`](notes/keys.md) for the full key binding reference.
271
+
272
+ ## Ex Commands
273
+
274
+ | Command | Description |
275
+ |---------|-------------|
276
+ | `:w` / `:wq` / `:q` | Save / save+quit / quit |
277
+ | `:e <file>` | Open file |
278
+ | `:split` / `:vsplit` | Split window |
279
+ | `:LspInfo` / `:LspRestart` | LSP status / restart |
280
+ | `:format` | Format buffer |
281
+ | `:colorscheme <name>` | Switch theme (`catppuccin`, `gruvbox`, `onedark`) |
282
+ | `:Session` / `:SessionLoad` | Save / load session |
283
+ | `:GitLog` | Open git log browser |
284
+ | `:checkhealth` | Run health checks |
285
+
286
+ Press `<Tab>` in the command line to fuzzy-browse all available commands.
287
+
288
+ ## Themes
289
+
290
+ Built-in themes: `catppuccin` (default), `gruvbox`, `onedark`.
291
+
292
+ Switch with `:colorscheme <name>` or set in `init.py`:
293
+
294
+ ```python
295
+ options.set("colorscheme", "gruvbox")
296
+ ```
297
+
298
+ ## Development
299
+
300
+ ```bash
301
+ # Install dev dependencies
302
+ uv sync --extra dev
303
+
304
+ # Run tests
305
+ uv run pytest tests/ --tb=no -q
306
+
307
+ # Lint / format
308
+ uv run ruff check peovim/
309
+ uv run ruff format peovim/
310
+ ```
311
+
312
+ ### Optional: native Cython renderer
313
+
314
+ A Cython-accelerated renderer is included for a ~4–25× speedup on the render path. It builds automatically if a C compiler is present (`cl.exe` on Windows, `gcc`/`clang` on Linux/macOS). The pure-Python fallback is used otherwise — the editor runs fine either way.
315
+
316
+ ```bash
317
+ # Verify which renderer is active
318
+ uv run python -c "from peovim._native import HAS_NATIVE; print(HAS_NATIVE)"
319
+ ```
320
+
321
+ ## Documentation
322
+
323
+ - [`notes/getting_started.md`](notes/getting_started.md) — install, configuration, and getting started
324
+ - [`notes/keys.md`](notes/keys.md) — complete key binding reference
325
+ - [`notes/user_guide.md`](notes/user_guide.md) — day-to-day usage guide
326
+ - [`notes/architecture.md`](notes/architecture.md) — internals and architecture
327
+ - [`notes/developer_guide.md`](notes/developer_guide.md) — plugin API and contribution guide
328
+
329
+ ## Acknowledgments
330
+
331
+ I have spent an embarassing amount of time over the years "Configuring" Vim (and then Neovim). The plugin and editor developers are truly amazing and I strongly suggest spending time in that community to see all the creative and amazing things that are possible!
332
+
333
+ The following list was inspiration for this project:
334
+ - [Neovim](https://neovim.io/):
335
+ - [flash.nvim](https://github.com/folke/flash.nvim) — flash jump
336
+ - [snacks.nvim](https://github.com/folke/snacks.nvim) — dashboard, notifications, indent guides
337
+ - [gitsigns.nvim](https://github.com/lewis6991/gitsigns.nvim) — git gutter and status
338
+ - [mini.nvim](https://github.com/echasnovski/mini.nvim) — picker, surround, commentary
339
+ - [blink.cmp](https://github.com/Saghen/blink.cmp) — LSP completion
340
+ - [conform.nvim](https://github.com/stevearc/conform.nvim) — formatting
341
+ - [which-key.nvim](https://github.com/folke/which-key.nvim) — key hint overlay
342
+ - [todo-comments.nvim](https://github.com/folke/todo-comments.nvim) — TODO highlights
343
+ - [persistence.nvim](https://github.com/folke/persistence.nvim) — session management
344
+ - [nvim-lspconfig](https://github.com/neovim/nvim-lspconfig) — LSP server configuration
peovim-0.1.0/README.md ADDED
@@ -0,0 +1,264 @@
1
+ # Peovim
2
+
3
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
4
+ [![Python 3.13+](https://img.shields.io/badge/python-3.13+-blue.svg)](https://www.python.org/downloads/)
5
+
6
+ A fast, modern, cross-platform modal text editor written in Python — heavily inspired by Neovim with a clean plugin API designed for extensibility.
7
+
8
+ I've been a Vim/Neovim editor Nerd for a long time and this project grew out of the question:
9
+
10
+ * "Can a basic Vim/Neovim style modal editor be created entirely with Python?"
11
+
12
+ Achieving basic functionality was surprisingly straightforward, but then I immediately had these follow up questions:
13
+
14
+ * Can I start adding all the plugins/features that I use in Neovim?
15
+ * How slow will this be with this built using Python?
16
+
17
+ It turns out that most of the things that I wanted were relatively simple to add, especially with AI assistance. Additional features should be easy to add via the plugin API.
18
+
19
+ An optional Cython based renderer was added as a performance improvement.
20
+
21
+ Being written entirely in Python this editor is very easy to modify or create plugins for (especially with AI tools). If you are a modal editor nerd, fork this project and create your own hyper customized modal editor!.
22
+
23
+ ![Peovim demo](demo.gif)
24
+
25
+ ## Features
26
+
27
+ - **Modal editing** — Normal, Insert, Visual, and Visual Block modes with Vim-compatible bindings
28
+ - **LSP support** — go to definition, hover, references, rename, code actions, completions, diagnostics, inlay hints
29
+ - **Syntax highlighting** — tree-sitter powered, covering Python, JS/TS, Rust, Go, C/C++, Lua, and more
30
+ - **Side/Bottom Panels** — file explorer, document outline, diagnostics, references, workspace symbols, git status
31
+ - **Git integration** — status panel with staging/unstaging/discarding, branch management, diff view, log browser
32
+ - **Fuzzy finder** — file picker, buffer picker, live grep, command palette
33
+ - **Session management** — autosave/restore with per-project state
34
+ - **Flash jump** — 2-char jump labels (`s` in normal mode)
35
+ - **Which-key** — similar to Folke's key hint overlay Neovim plugin (my personal favorite Neovim plugin!)
36
+ - **Marker groups** — persistent bookmarks with annotations and gutter signs
37
+ - **Local history** — per-file timestamped save history
38
+ - **Copilot** — support for Copilot autocompletions.
39
+ - **Plugin API** — plain Python plugins with event hooks, keymaps, commands, decorations, and sidebar panels
40
+
41
+ ## Features more unique to my (Verilog, Python) workflow
42
+ - **Verilog LSP** — a custom LSP that allows heirarchy collapse/extract, signal tracing, and more features using [verilog-tools](https://github.com/chiplukes/verilog-parser)
43
+
44
+ ## Requirements
45
+
46
+ - Python 3.13+
47
+ - [uv](https://docs.astral.sh/uv/) package manager
48
+
49
+ ## Installation
50
+
51
+ ### From source (development)
52
+
53
+ ```bash
54
+ git clone https://github.com/chiplukes/peovim
55
+ cd peovim
56
+ uv sync
57
+ ```
58
+
59
+ ### As a global tool
60
+
61
+ ```bash
62
+ uv tool install .
63
+ ```
64
+
65
+ After install, the `peovim` command is available on your PATH:
66
+
67
+ ```bash
68
+ peovim # open empty buffer
69
+ peovim file.py # open a file
70
+ ```
71
+
72
+ ### Updating
73
+
74
+ Pull the latest changes, then reinstall:
75
+
76
+ ```bash
77
+ git pull
78
+ uv tool install --reinstall .
79
+ ```
80
+
81
+ ## Running (development)
82
+
83
+ ```bash
84
+ uv run peovim # open empty buffer
85
+ uv run peovim file.py # open a file
86
+ ```
87
+
88
+ ## Configuration
89
+
90
+ Create `init.py` at the platform config path:
91
+
92
+ | Platform | Path |
93
+ |----------|------|
94
+ | Windows | `%APPDATA%\peovim\init.py` |
95
+ | Linux | `~/.config/peovim/init.py` |
96
+ | macOS | `~/Library/Application Support/peovim/init.py` |
97
+
98
+ The config file is plain Python. Example:
99
+
100
+ ```python
101
+ # init.py
102
+
103
+ plugins.load("peovim.plugins.lsp")
104
+ plugins.load("peovim.plugins.picker")
105
+ plugins.load("peovim.plugins.explorer")
106
+ plugins.load("peovim.plugins.outline")
107
+ plugins.load("peovim.plugins.gitsigns")
108
+ plugins.load("peovim.plugins.diagnostics_panel")
109
+ plugins.load("peovim.plugins.formatter")
110
+ plugins.load("peovim.plugins.local_history")
111
+
112
+ # Space as leader (default is backslash)
113
+ options.set("leader", " ")
114
+ options.set("number", True)
115
+ options.set("relativenumber", True)
116
+ options.set("tabstop", 4)
117
+
118
+ # Custom keybindings
119
+ keymap.nmap("<leader>w", ":w<CR>", desc="Save file")
120
+ ```
121
+
122
+ Project-local config at `.peovim/init.py` is also supported — the editor prompts for trust on first encounter.
123
+
124
+ A more thorough `init.py` can be found here:
125
+
126
+ [My Init.py](https://github.com/chiplukes/.dotfiles/blob/master/.config/peovim/init.py)
127
+
128
+ ## Key Bindings
129
+
130
+ ### Navigation
131
+
132
+ | Key | Action |
133
+ |-----|--------|
134
+ | `<leader>ff` | Fuzzy find files |
135
+ | `<leader>fg` | Live grep |
136
+ | `<leader>fb` | Open buffers |
137
+ | `<leader>sw` | Grep word under cursor |
138
+ | `<C-o>` / `<C-i>` | Jump back / forward |
139
+ | `gf` | Go to file under cursor |
140
+ | `s` | Flash jump (type 2 chars) |
141
+
142
+ ### LSP
143
+
144
+ | Key | Action |
145
+ |-----|--------|
146
+ | `gd` | Go to definition |
147
+ | `K` | Hover documentation |
148
+ | `<leader>gr` | References sidebar |
149
+ | `<leader>rn` | Rename symbol |
150
+ | `<leader>ca` | Code actions |
151
+ | `]d` / `[d` | Next / previous diagnostic |
152
+ | `<leader>o` | Document outline sidebar |
153
+ | `<leader>cD` | Diagnostics sidebar |
154
+ | `<leader>csw` | Workspace symbols sidebar |
155
+
156
+ ### Sidebar
157
+
158
+ | Key | Action |
159
+ |-----|--------|
160
+ | `<leader>e` | Toggle file explorer |
161
+ | `<leader>gs` | Toggle git panel |
162
+ | `<A-h>` | Focus sidebar from editor |
163
+ | `<A-l>` | Return to editor from sidebar |
164
+ | `<A-j>` / `<A-k>` | Cycle sidebar panels |
165
+ | `<Esc>` | Hide sidebar |
166
+
167
+ ### Git Panel (when focused)
168
+
169
+ | Key | Action |
170
+ |-----|--------|
171
+ | `a` | Stage file |
172
+ | `u` | Unstage file |
173
+ | `x` | Discard changes |
174
+ | `d` | Diff file against HEAD |
175
+ | `l` | Git log browser |
176
+ | `P` | Push |
177
+ | `p` | Pull |
178
+
179
+ ### Editing
180
+
181
+ | Key | Action |
182
+ |-----|--------|
183
+ | `gcc` | Toggle comment |
184
+ | `ysiw{char}` | Surround inner word |
185
+ | `cs{old}{new}` | Change surrounding |
186
+ | `ds{char}` | Delete surrounding |
187
+ | `<leader>pr` | Paste from yank register |
188
+ | `ga` (visual) | Align on character |
189
+
190
+ See [`notes/keys.md`](notes/keys.md) for the full key binding reference.
191
+
192
+ ## Ex Commands
193
+
194
+ | Command | Description |
195
+ |---------|-------------|
196
+ | `:w` / `:wq` / `:q` | Save / save+quit / quit |
197
+ | `:e <file>` | Open file |
198
+ | `:split` / `:vsplit` | Split window |
199
+ | `:LspInfo` / `:LspRestart` | LSP status / restart |
200
+ | `:format` | Format buffer |
201
+ | `:colorscheme <name>` | Switch theme (`catppuccin`, `gruvbox`, `onedark`) |
202
+ | `:Session` / `:SessionLoad` | Save / load session |
203
+ | `:GitLog` | Open git log browser |
204
+ | `:checkhealth` | Run health checks |
205
+
206
+ Press `<Tab>` in the command line to fuzzy-browse all available commands.
207
+
208
+ ## Themes
209
+
210
+ Built-in themes: `catppuccin` (default), `gruvbox`, `onedark`.
211
+
212
+ Switch with `:colorscheme <name>` or set in `init.py`:
213
+
214
+ ```python
215
+ options.set("colorscheme", "gruvbox")
216
+ ```
217
+
218
+ ## Development
219
+
220
+ ```bash
221
+ # Install dev dependencies
222
+ uv sync --extra dev
223
+
224
+ # Run tests
225
+ uv run pytest tests/ --tb=no -q
226
+
227
+ # Lint / format
228
+ uv run ruff check peovim/
229
+ uv run ruff format peovim/
230
+ ```
231
+
232
+ ### Optional: native Cython renderer
233
+
234
+ A Cython-accelerated renderer is included for a ~4–25× speedup on the render path. It builds automatically if a C compiler is present (`cl.exe` on Windows, `gcc`/`clang` on Linux/macOS). The pure-Python fallback is used otherwise — the editor runs fine either way.
235
+
236
+ ```bash
237
+ # Verify which renderer is active
238
+ uv run python -c "from peovim._native import HAS_NATIVE; print(HAS_NATIVE)"
239
+ ```
240
+
241
+ ## Documentation
242
+
243
+ - [`notes/getting_started.md`](notes/getting_started.md) — install, configuration, and getting started
244
+ - [`notes/keys.md`](notes/keys.md) — complete key binding reference
245
+ - [`notes/user_guide.md`](notes/user_guide.md) — day-to-day usage guide
246
+ - [`notes/architecture.md`](notes/architecture.md) — internals and architecture
247
+ - [`notes/developer_guide.md`](notes/developer_guide.md) — plugin API and contribution guide
248
+
249
+ ## Acknowledgments
250
+
251
+ I have spent an embarassing amount of time over the years "Configuring" Vim (and then Neovim). The plugin and editor developers are truly amazing and I strongly suggest spending time in that community to see all the creative and amazing things that are possible!
252
+
253
+ The following list was inspiration for this project:
254
+ - [Neovim](https://neovim.io/):
255
+ - [flash.nvim](https://github.com/folke/flash.nvim) — flash jump
256
+ - [snacks.nvim](https://github.com/folke/snacks.nvim) — dashboard, notifications, indent guides
257
+ - [gitsigns.nvim](https://github.com/lewis6991/gitsigns.nvim) — git gutter and status
258
+ - [mini.nvim](https://github.com/echasnovski/mini.nvim) — picker, surround, commentary
259
+ - [blink.cmp](https://github.com/Saghen/blink.cmp) — LSP completion
260
+ - [conform.nvim](https://github.com/stevearc/conform.nvim) — formatting
261
+ - [which-key.nvim](https://github.com/folke/which-key.nvim) — key hint overlay
262
+ - [todo-comments.nvim](https://github.com/folke/todo-comments.nvim) — TODO highlights
263
+ - [persistence.nvim](https://github.com/folke/persistence.nvim) — session management
264
+ - [nvim-lspconfig](https://github.com/neovim/nvim-lspconfig) — LSP server configuration
@@ -0,0 +1 @@
1
+ __version__ = "0.1.0"
@@ -0,0 +1,19 @@
1
+ """
2
+ peovim._native — optional compiled extension package.
3
+
4
+ HAS_NATIVE is True when the Cython (or Rust) extension was successfully
5
+ compiled and imported. All accelerated modules fall back to pure Python when
6
+ this is False, so the editor always runs without a compiler.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ try:
12
+ import importlib
13
+
14
+ importlib.import_module("peovim._native.cell_grid")
15
+ HAS_NATIVE = True
16
+ except ImportError:
17
+ HAS_NATIVE = False
18
+
19
+ __all__ = ["HAS_NATIVE"]