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.
- peovim-0.1.0/LICENSE +21 -0
- peovim-0.1.0/PKG-INFO +344 -0
- peovim-0.1.0/README.md +264 -0
- peovim-0.1.0/peovim/__init__.py +1 -0
- peovim-0.1.0/peovim/_native/__init__.py +19 -0
- peovim-0.1.0/peovim/_native/cell_grid.c +18902 -0
- peovim-0.1.0/peovim/_native/window_renderer.c +38063 -0
- peovim-0.1.0/peovim/api/__init__.py +23 -0
- peovim-0.1.0/peovim/api/_metadata.py +80 -0
- peovim-0.1.0/peovim/api/buffer_api.py +347 -0
- peovim-0.1.0/peovim/api/commands_api.py +40 -0
- peovim-0.1.0/peovim/api/completion_api.py +5 -0
- peovim-0.1.0/peovim/api/debug_api.py +5 -0
- peovim-0.1.0/peovim/api/diagnostics_api.py +5 -0
- peovim-0.1.0/peovim/api/diff_api.py +5 -0
- peovim-0.1.0/peovim/api/editor.py +943 -0
- peovim-0.1.0/peovim/api/events_api.py +37 -0
- peovim-0.1.0/peovim/api/git_api.py +152 -0
- peovim-0.1.0/peovim/api/health_api.py +45 -0
- peovim-0.1.0/peovim/api/jumplist_api.py +5 -0
- peovim-0.1.0/peovim/api/keymap_api.py +98 -0
- peovim-0.1.0/peovim/api/lsp_api.py +808 -0
- peovim-0.1.0/peovim/api/modal_api.py +41 -0
- peovim-0.1.0/peovim/api/options_api.py +31 -0
- peovim-0.1.0/peovim/api/quickfix_api.py +5 -0
- peovim-0.1.0/peovim/api/registers_api.py +5 -0
- peovim-0.1.0/peovim/api/repl_api.py +5 -0
- peovim-0.1.0/peovim/api/session_api.py +294 -0
- peovim-0.1.0/peovim/api/snippets_api.py +5 -0
- peovim-0.1.0/peovim/api/store_api.py +15 -0
- peovim-0.1.0/peovim/api/syntax_api.py +5 -0
- peovim-0.1.0/peovim/api/testing_api.py +5 -0
- peovim-0.1.0/peovim/api/ui_api.py +401 -0
- peovim-0.1.0/peovim/api/window_api.py +218 -0
- peovim-0.1.0/peovim/api/workspace_api.py +78 -0
- peovim-0.1.0/peovim/api.py +7 -0
- peovim-0.1.0/peovim/commands/__init__.py +0 -0
- peovim-0.1.0/peovim/commands/builtin.py +1374 -0
- peovim-0.1.0/peovim/commands/parser.py +156 -0
- peovim-0.1.0/peovim/commands/registry.py +80 -0
- peovim-0.1.0/peovim/config/__init__.py +0 -0
- peovim-0.1.0/peovim/config/editorconfig.py +7 -0
- peovim-0.1.0/peovim/config/loader.py +226 -0
- peovim-0.1.0/peovim/config/project.py +114 -0
- peovim-0.1.0/peovim/core/__init__.py +0 -0
- peovim-0.1.0/peovim/core/buffer.py +335 -0
- peovim-0.1.0/peovim/core/cursor.py +102 -0
- peovim-0.1.0/peovim/core/decorations_store.py +86 -0
- peovim-0.1.0/peovim/core/diffing.py +79 -0
- peovim-0.1.0/peovim/core/document.py +385 -0
- peovim-0.1.0/peovim/core/editor_state.py +112 -0
- peovim-0.1.0/peovim/core/event_bus.py +90 -0
- peovim-0.1.0/peovim/core/filetype.py +192 -0
- peovim-0.1.0/peovim/core/fold.py +103 -0
- peovim-0.1.0/peovim/core/health.py +188 -0
- peovim-0.1.0/peovim/core/health_checks.py +582 -0
- peovim-0.1.0/peovim/core/history.py +120 -0
- peovim-0.1.0/peovim/core/jumplist.py +73 -0
- peovim-0.1.0/peovim/core/log_manager.py +291 -0
- peovim-0.1.0/peovim/core/marks.py +85 -0
- peovim-0.1.0/peovim/core/options.py +242 -0
- peovim-0.1.0/peovim/core/persistence.py +31 -0
- peovim-0.1.0/peovim/core/persistence_policy.py +71 -0
- peovim-0.1.0/peovim/core/recovery.py +174 -0
- peovim-0.1.0/peovim/core/registers.py +245 -0
- peovim-0.1.0/peovim/core/search.py +114 -0
- peovim-0.1.0/peovim/core/shada.py +333 -0
- peovim-0.1.0/peovim/core/sign_registry.py +40 -0
- peovim-0.1.0/peovim/core/snapshot.py +57 -0
- peovim-0.1.0/peovim/core/store_api.py +84 -0
- peovim-0.1.0/peovim/core/style.py +53 -0
- peovim-0.1.0/peovim/core/text_edits.py +81 -0
- peovim-0.1.0/peovim/core/transaction.py +9 -0
- peovim-0.1.0/peovim/core/window.py +116 -0
- peovim-0.1.0/peovim/core/workspace.py +466 -0
- peovim-0.1.0/peovim/debug/__init__.py +0 -0
- peovim-0.1.0/peovim/debug/client.py +6 -0
- peovim-0.1.0/peovim/debug/profile_workloads.py +833 -0
- peovim-0.1.0/peovim/debug/protocol.py +7 -0
- peovim-0.1.0/peovim/debug/session.py +7 -0
- peovim-0.1.0/peovim/git/__init__.py +31 -0
- peovim-0.1.0/peovim/git/presentation.py +31 -0
- peovim-0.1.0/peovim/git/repository.py +431 -0
- peovim-0.1.0/peovim/lsp/__init__.py +0 -0
- peovim-0.1.0/peovim/lsp/client.py +167 -0
- peovim-0.1.0/peovim/lsp/features.py +1043 -0
- peovim-0.1.0/peovim/lsp/manager.py +523 -0
- peovim-0.1.0/peovim/lsp/protocol.py +102 -0
- peovim-0.1.0/peovim/main.py +364 -0
- peovim-0.1.0/peovim/modal/__init__.py +0 -0
- peovim-0.1.0/peovim/modal/actions.py +592 -0
- peovim-0.1.0/peovim/modal/dispatcher.py +523 -0
- peovim-0.1.0/peovim/modal/dispatcher_buffers.py +117 -0
- peovim-0.1.0/peovim/modal/dispatcher_clipboard.py +166 -0
- peovim-0.1.0/peovim/modal/dispatcher_commands.py +42 -0
- peovim-0.1.0/peovim/modal/dispatcher_ex_commands.py +57 -0
- peovim-0.1.0/peovim/modal/dispatcher_folds.py +45 -0
- peovim-0.1.0/peovim/modal/dispatcher_modes.py +167 -0
- peovim-0.1.0/peovim/modal/dispatcher_navigation.py +79 -0
- peovim-0.1.0/peovim/modal/dispatcher_plugins.py +40 -0
- peovim-0.1.0/peovim/modal/dispatcher_repeat.py +70 -0
- peovim-0.1.0/peovim/modal/dispatcher_search.py +108 -0
- peovim-0.1.0/peovim/modal/dispatcher_text.py +399 -0
- peovim-0.1.0/peovim/modal/dispatcher_workspace.py +160 -0
- peovim-0.1.0/peovim/modal/engine.py +1943 -0
- peovim-0.1.0/peovim/modal/keybindings.py +332 -0
- peovim-0.1.0/peovim/modal/motions.py +732 -0
- peovim-0.1.0/peovim/modal/operators.py +6 -0
- peovim-0.1.0/peovim/modal/text_objects.py +311 -0
- peovim-0.1.0/peovim/plugins/__init__.py +0 -0
- peovim-0.1.0/peovim/plugins/ai.py +6 -0
- peovim-0.1.0/peovim/plugins/align.py +136 -0
- peovim-0.1.0/peovim/plugins/autopairs.py +136 -0
- peovim-0.1.0/peovim/plugins/calltree.py +6 -0
- peovim-0.1.0/peovim/plugins/codemap.py +879 -0
- peovim-0.1.0/peovim/plugins/commentary.py +181 -0
- peovim-0.1.0/peovim/plugins/compare.py +981 -0
- peovim-0.1.0/peovim/plugins/copilot.py +387 -0
- peovim-0.1.0/peovim/plugins/copilot_client.py +274 -0
- peovim-0.1.0/peovim/plugins/dashboard.py +251 -0
- peovim-0.1.0/peovim/plugins/debugpy.py +6 -0
- peovim-0.1.0/peovim/plugins/diagnostics_panel.py +220 -0
- peovim-0.1.0/peovim/plugins/diff.py +6 -0
- peovim-0.1.0/peovim/plugins/editor_utils.py +144 -0
- peovim-0.1.0/peovim/plugins/editorconfig.py +84 -0
- peovim-0.1.0/peovim/plugins/explorer.py +528 -0
- peovim-0.1.0/peovim/plugins/filehistory.py +349 -0
- peovim-0.1.0/peovim/plugins/flash.py +277 -0
- peovim-0.1.0/peovim/plugins/formatter.py +158 -0
- peovim-0.1.0/peovim/plugins/fquick.py +331 -0
- peovim-0.1.0/peovim/plugins/gitsigns.py +934 -0
- peovim-0.1.0/peovim/plugins/guess_indent.py +116 -0
- peovim-0.1.0/peovim/plugins/local_history.py +536 -0
- peovim-0.1.0/peovim/plugins/lsp.py +535 -0
- peovim-0.1.0/peovim/plugins/manager.py +184 -0
- peovim-0.1.0/peovim/plugins/markers.py +931 -0
- peovim-0.1.0/peovim/plugins/notifications.py +6 -0
- peovim-0.1.0/peovim/plugins/outline.py +269 -0
- peovim-0.1.0/peovim/plugins/perf_panel.py +250 -0
- peovim-0.1.0/peovim/plugins/picker.py +420 -0
- peovim-0.1.0/peovim/plugins/proposed_review.py +400 -0
- peovim-0.1.0/peovim/plugins/pytest.py +6 -0
- peovim-0.1.0/peovim/plugins/python.py +6 -0
- peovim-0.1.0/peovim/plugins/references_panel.py +450 -0
- peovim-0.1.0/peovim/plugins/remote.py +6 -0
- peovim-0.1.0/peovim/plugins/repl.py +81 -0
- peovim-0.1.0/peovim/plugins/session.py +95 -0
- peovim-0.1.0/peovim/plugins/session_additions.py +159 -0
- peovim-0.1.0/peovim/plugins/spell.py +6 -0
- peovim-0.1.0/peovim/plugins/surround.py +180 -0
- peovim-0.1.0/peovim/plugins/svnsigns.py +634 -0
- peovim-0.1.0/peovim/plugins/tabs_to_spaces.py +127 -0
- peovim-0.1.0/peovim/plugins/todo.py +196 -0
- peovim-0.1.0/peovim/plugins/vcssigns.py +84 -0
- peovim-0.1.0/peovim/plugins/verilog_lsp/__init__.py +51 -0
- peovim-0.1.0/peovim/plugins/verilog_lsp/hierarchy_panel.py +1780 -0
- peovim-0.1.0/peovim/plugins/verilog_lsp/plugin.py +400 -0
- peovim-0.1.0/peovim/plugins/verilog_lsp/signal_trace.py +330 -0
- peovim-0.1.0/peovim/plugins/which_key.py +178 -0
- peovim-0.1.0/peovim/plugins/workspace_symbols.py +208 -0
- peovim-0.1.0/peovim/syntax/__init__.py +0 -0
- peovim-0.1.0/peovim/syntax/engine.py +263 -0
- peovim-0.1.0/peovim/syntax/languages.py +134 -0
- peovim-0.1.0/peovim/syntax/queries/c.scm +91 -0
- peovim-0.1.0/peovim/syntax/queries/cpp.scm +143 -0
- peovim-0.1.0/peovim/syntax/queries/markdown.scm +39 -0
- peovim-0.1.0/peovim/syntax/queries/verilog.scm +55 -0
- peovim-0.1.0/peovim/syntax/queries/xdc.scm +47 -0
- peovim-0.1.0/peovim/syntax/themes.py +326 -0
- peovim-0.1.0/peovim/ui/__init__.py +0 -0
- peovim-0.1.0/peovim/ui/_cell_grid_pure.py +340 -0
- peovim-0.1.0/peovim/ui/_window_renderer_pure.py +685 -0
- peovim-0.1.0/peovim/ui/alloc_tracer.py +72 -0
- peovim-0.1.0/peovim/ui/backend.py +174 -0
- peovim-0.1.0/peovim/ui/backend_factory.py +65 -0
- peovim-0.1.0/peovim/ui/backends/__init__.py +0 -0
- peovim-0.1.0/peovim/ui/backends/crossterm.py +204 -0
- peovim-0.1.0/peovim/ui/backends/headless.py +168 -0
- peovim-0.1.0/peovim/ui/backends/prompt_toolkit.py +427 -0
- peovim-0.1.0/peovim/ui/bottom_panel.py +532 -0
- peovim-0.1.0/peovim/ui/cell_grid.py +18 -0
- peovim-0.1.0/peovim/ui/cmdline_controller.py +161 -0
- peovim-0.1.0/peovim/ui/command_line.py +420 -0
- peovim-0.1.0/peovim/ui/completion.py +248 -0
- peovim-0.1.0/peovim/ui/cursor_controller.py +124 -0
- peovim-0.1.0/peovim/ui/decorations.py +116 -0
- peovim-0.1.0/peovim/ui/event_loop.py +754 -0
- peovim-0.1.0/peovim/ui/float_manager.py +355 -0
- peovim-0.1.0/peovim/ui/frame_controller.py +180 -0
- peovim-0.1.0/peovim/ui/gc_tracer.py +71 -0
- peovim-0.1.0/peovim/ui/ghost_text.py +85 -0
- peovim-0.1.0/peovim/ui/input_controller.py +411 -0
- peovim-0.1.0/peovim/ui/layout.py +82 -0
- peovim-0.1.0/peovim/ui/lsp_ui_adapter.py +324 -0
- peovim-0.1.0/peovim/ui/markdown.py +438 -0
- peovim-0.1.0/peovim/ui/mouse_dispatcher.py +351 -0
- peovim-0.1.0/peovim/ui/notify.py +167 -0
- peovim-0.1.0/peovim/ui/panel_host.py +286 -0
- peovim-0.1.0/peovim/ui/perf_sampler.py +117 -0
- peovim-0.1.0/peovim/ui/picker.py +416 -0
- peovim-0.1.0/peovim/ui/presentation_controller.py +234 -0
- peovim-0.1.0/peovim/ui/render_cycle_controller.py +119 -0
- peovim-0.1.0/peovim/ui/render_jobs.py +303 -0
- peovim-0.1.0/peovim/ui/runtime_controller.py +243 -0
- peovim-0.1.0/peovim/ui/scrollbar.py +53 -0
- peovim-0.1.0/peovim/ui/sidebar.py +429 -0
- peovim-0.1.0/peovim/ui/status_bar.py +192 -0
- peovim-0.1.0/peovim/ui/terminal_buffer.py +214 -0
- peovim-0.1.0/peovim/ui/text_layout.py +40 -0
- peovim-0.1.0/peovim/ui/tree_view.py +368 -0
- peovim-0.1.0/peovim/ui/which_key_panel.py +118 -0
- peovim-0.1.0/peovim/ui/window_render_controller.py +321 -0
- peovim-0.1.0/peovim/ui/window_renderer.py +76 -0
- peovim-0.1.0/peovim.egg-info/PKG-INFO +344 -0
- peovim-0.1.0/peovim.egg-info/SOURCES.txt +308 -0
- peovim-0.1.0/peovim.egg-info/dependency_links.txt +1 -0
- peovim-0.1.0/peovim.egg-info/entry_points.txt +2 -0
- peovim-0.1.0/peovim.egg-info/requires.txt +40 -0
- peovim-0.1.0/peovim.egg-info/top_level.txt +1 -0
- peovim-0.1.0/pyproject.toml +115 -0
- peovim-0.1.0/setup.cfg +4 -0
- peovim-0.1.0/setup.py +72 -0
- peovim-0.1.0/tests/test_api.py +1017 -0
- peovim-0.1.0/tests/test_backend_crossterm.py +99 -0
- peovim-0.1.0/tests/test_backend_factory.py +212 -0
- peovim-0.1.0/tests/test_backend_prompt_toolkit.py +255 -0
- peovim-0.1.0/tests/test_bottom_panel.py +397 -0
- peovim-0.1.0/tests/test_buffer.py +701 -0
- peovim-0.1.0/tests/test_commands.py +572 -0
- peovim-0.1.0/tests/test_config_loader.py +486 -0
- peovim-0.1.0/tests/test_core_diffing.py +119 -0
- peovim-0.1.0/tests/test_cursor.py +142 -0
- peovim-0.1.0/tests/test_decorations_store.py +122 -0
- peovim-0.1.0/tests/test_dispatcher_buffers.py +226 -0
- peovim-0.1.0/tests/test_dispatcher_commands.py +129 -0
- peovim-0.1.0/tests/test_dispatcher_navigation.py +164 -0
- peovim-0.1.0/tests/test_dispatcher_plugins.py +109 -0
- peovim-0.1.0/tests/test_dispatcher_postprocessing.py +58 -0
- peovim-0.1.0/tests/test_docs.py +52 -0
- peovim-0.1.0/tests/test_document.py +404 -0
- peovim-0.1.0/tests/test_event_bus.py +137 -0
- peovim-0.1.0/tests/test_event_loop_cmdline.py +1214 -0
- peovim-0.1.0/tests/test_external_file_changes.py +166 -0
- peovim-0.1.0/tests/test_folding.py +378 -0
- peovim-0.1.0/tests/test_git_api.py +396 -0
- peovim-0.1.0/tests/test_health.py +1008 -0
- peovim-0.1.0/tests/test_indent_guides.py +172 -0
- peovim-0.1.0/tests/test_integration.py +490 -0
- peovim-0.1.0/tests/test_jumplist.py +133 -0
- peovim-0.1.0/tests/test_layout.py +144 -0
- peovim-0.1.0/tests/test_log_manager.py +192 -0
- peovim-0.1.0/tests/test_lsp.py +1472 -0
- peovim-0.1.0/tests/test_markdown.py +114 -0
- peovim-0.1.0/tests/test_marks.py +134 -0
- peovim-0.1.0/tests/test_modal.py +896 -0
- peovim-0.1.0/tests/test_motions.py +381 -0
- peovim-0.1.0/tests/test_mouse.py +275 -0
- peovim-0.1.0/tests/test_mutation_safety.py +163 -0
- peovim-0.1.0/tests/test_operators.py +502 -0
- peovim-0.1.0/tests/test_options.py +324 -0
- peovim-0.1.0/tests/test_persistence.py +30 -0
- peovim-0.1.0/tests/test_picker.py +498 -0
- peovim-0.1.0/tests/test_plugin_align.py +134 -0
- peovim-0.1.0/tests/test_plugin_autopairs.py +105 -0
- peovim-0.1.0/tests/test_plugin_commentary.py +104 -0
- peovim-0.1.0/tests/test_plugin_compare.py +781 -0
- peovim-0.1.0/tests/test_plugin_dashboard.py +261 -0
- peovim-0.1.0/tests/test_plugin_diagnostics_panel.py +207 -0
- peovim-0.1.0/tests/test_plugin_editorconfig.py +192 -0
- peovim-0.1.0/tests/test_plugin_explorer.py +596 -0
- peovim-0.1.0/tests/test_plugin_flash.py +196 -0
- peovim-0.1.0/tests/test_plugin_formatter.py +137 -0
- peovim-0.1.0/tests/test_plugin_fquick.py +230 -0
- peovim-0.1.0/tests/test_plugin_gitsigns.py +854 -0
- peovim-0.1.0/tests/test_plugin_guess_indent.py +123 -0
- peovim-0.1.0/tests/test_plugin_local_history.py +182 -0
- peovim-0.1.0/tests/test_plugin_lsp.py +448 -0
- peovim-0.1.0/tests/test_plugin_manager_lazy.py +187 -0
- peovim-0.1.0/tests/test_plugin_markers.py +467 -0
- peovim-0.1.0/tests/test_plugin_outline.py +207 -0
- peovim-0.1.0/tests/test_plugin_picker.py +441 -0
- peovim-0.1.0/tests/test_plugin_proposed_review.py +213 -0
- peovim-0.1.0/tests/test_plugin_references_panel.py +333 -0
- peovim-0.1.0/tests/test_plugin_session_additions.py +126 -0
- peovim-0.1.0/tests/test_plugin_surround.py +128 -0
- peovim-0.1.0/tests/test_plugin_svnsigns.py +67 -0
- peovim-0.1.0/tests/test_plugin_tabs_to_spaces.py +95 -0
- peovim-0.1.0/tests/test_plugin_todo.py +237 -0
- peovim-0.1.0/tests/test_plugin_verilog_hierarchy.py +1580 -0
- peovim-0.1.0/tests/test_plugin_verilog_signal_trace.py +134 -0
- peovim-0.1.0/tests/test_plugin_which_key.py +127 -0
- peovim-0.1.0/tests/test_plugin_workspace_symbols.py +217 -0
- peovim-0.1.0/tests/test_profile_workloads.py +103 -0
- peovim-0.1.0/tests/test_recovery.py +461 -0
- peovim-0.1.0/tests/test_registers.py +161 -0
- peovim-0.1.0/tests/test_render_jobs.py +401 -0
- peovim-0.1.0/tests/test_renderer.py +681 -0
- peovim-0.1.0/tests/test_search.py +428 -0
- peovim-0.1.0/tests/test_session.py +305 -0
- peovim-0.1.0/tests/test_shada.py +383 -0
- peovim-0.1.0/tests/test_sidebar.py +427 -0
- peovim-0.1.0/tests/test_store_api.py +37 -0
- peovim-0.1.0/tests/test_syntax.py +866 -0
- peovim-0.1.0/tests/test_syntax_contract.py +109 -0
- peovim-0.1.0/tests/test_terminal_buffer.py +99 -0
- peovim-0.1.0/tests/test_text_objects.py +245 -0
- peovim-0.1.0/tests/test_tree_view.py +224 -0
- peovim-0.1.0/tests/test_undo.py +197 -0
- peovim-0.1.0/tests/test_window.py +109 -0
- 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)
|
|
84
|
+
[](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
|
+

|
|
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)
|
|
4
|
+
[](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
|
+

|
|
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"]
|