{"id":51121521,"url":"https://github.com/jamylak/penguin.nvim","last_synced_at":"2026-06-25T03:01:06.200Z","repository":{"id":351273148,"uuid":"1203232055","full_name":"jamylak/penguin.nvim","owner":"jamylak","description":"Command Line History Search And Execute","archived":false,"fork":false,"pushed_at":"2026-04-29T11:47:46.000Z","size":396,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-29T13:38:42.404Z","etag":null,"topics":["neovim","nvim","plugin","vim"],"latest_commit_sha":null,"homepage":"","language":"Lua","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jamylak.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-04-06T21:12:21.000Z","updated_at":"2026-04-29T11:47:50.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/jamylak/penguin.nvim","commit_stats":null,"previous_names":["jamylak/penguin.nvim"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jamylak/penguin.nvim","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamylak%2Fpenguin.nvim","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamylak%2Fpenguin.nvim/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamylak%2Fpenguin.nvim/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamylak%2Fpenguin.nvim/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jamylak","download_url":"https://codeload.github.com/jamylak/penguin.nvim/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamylak%2Fpenguin.nvim/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34757355,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-25T02:00:05.521Z","response_time":101,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["neovim","nvim","plugin","vim"],"created_at":"2026-06-25T03:01:05.180Z","updated_at":"2026-06-25T03:01:06.192Z","avatar_url":"https://github.com/jamylak.png","language":"Lua","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🐧 `penguin.nvim`\n\n🚧 Work in progress. Still fixing a lot of stuff...\n\n![screenshot.png](assets/screenshot.png)\n\n`penguin.nvim` is a command-history and command-entry picker for Neovim.\nIt is a lua frontend to a C backend.\nIt was inspired by `telescope-cmdline.nvim`, but the goal here is to make the\nexperience much faster and much fuzzier.\n\nThe idea is a spotlight-like interface for Neovim command entry: something\nthat makes it much easier to enter commands, rediscover commands, and reuse\nprevious commands than the default `:` prompt flow.\n\nIt is still a work in progress and still being tested, but the intended UX is:\n\n- spotlight-like command entry for Neovim\n- much faster fuzzy matching on command history and command completions\n- a more ergonomic command workflow than raw `:` usage\n- optional features like bare `Enter` opening the picker so command entry can\n  feel more immediate in normal editing flow\n\n## Status\n\nCurrent stage:\n\n- plugin loads\n- `:Penguin` opens a floating picker\n- Ex command history is collected from Neovim\n- live Ex command suggestions are merged into non-empty queries\n- empty query shows recent commands first\n- the native matcher is the default and intended runtime path\n- the plugin auto-builds the native library when it is missing\n- the Lua matcher path is benchmark-only and opt-in\n- selected or typed commands can be executed from the picker\n\n## Installation\n\n### Native Neovim\n\n```lua\nvim.opt.runtimepath:append(\"/Users/james/proj/penguin.nvim\")\nrequire(\"penguin\").setup({})\n```\n\nThat setup path uses the native matcher by default. If the native library is\nmissing, `penguin.nvim` will try to run `make native` automatically.\n\nExperimental optional normal-mode `Enter` integration:\n\n```lua\nrequire(\"penguin\").setup({\n  open_on_bare_enter = true,\n})\n```\n\nThat is an opt-in experiment, not the default. It maps bare `Enter` in\nordinary file buffers to open `penguin.nvim`, so the plugin can own that\nwiring instead of your main config.\n\nWhen the plugin is loaded eagerly, that is enough on its own. With a lazy\nplugin manager, `setup()` runs too late to bootstrap bare `Enter`, so the lazy\nspec also needs an `Enter` trigger.\n\n### `lazy.nvim`\n\n```lua\n{\n  dir = \"/Users/james/proj/penguin.nvim\",\n  name = \"penguin.nvim\",\n  cmd = \"Penguin\",\n  keys = {\n    { \"\u003cM-Space\u003e\", \"\u003ccmd\u003ePenguin\u003ccr\u003e\", desc = \"Open penguin.nvim\", mode = \"n\" },\n  },\n  opts = {},\n}\n```\n\nIf you also want `open_on_bare_enter = true`, add a small bootstrap mapping in\n`init` so lazy.nvim can load the plugin before the first bare `Enter` opens it:\n\n```lua\n{\n  dir = \"/Users/james/proj/penguin.nvim\",\n  name = \"penguin.nvim\",\n  cmd = \"Penguin\",\n  init = function(plugin)\n    vim.keymap.set(\"n\", \"\u003cCR\u003e\", function()\n      local filetype = vim.bo.filetype\n\n      if vim.fn.getcmdwintype() ~= \"\" or vim.bo.buftype ~= \"\" then\n        return \"\u003cCR\u003e\"\n      end\n\n      if filetype == \"help\" or filetype == \"netrw\" or filetype == \"qf\" then\n        return \"\u003cCR\u003e\"\n      end\n\n      require(\"lazy\").load({ plugins = { plugin.name } })\n      return require(\"penguin\").handle_bare_enter()\n    end, {\n      desc = \"Open penguin.nvim on bare Enter\",\n      expr = true,\n      silent = true,\n    })\n  end,\n  keys = {\n    { \"\u003cM-Space\u003e\", \"\u003ccmd\u003ePenguin\u003ccr\u003e\", desc = \"Open penguin.nvim\", mode = \"n\" },\n  },\n  opts = {\n    open_on_bare_enter = true,\n  },\n}\n```\n\n## Usage\n\nRun:\n\n```vim\n:Penguin\n```\n\nOr press `Alt-Space` in normal mode.\n\nIf `open_on_bare_enter = true` is enabled, bare `Enter` in normal mode will\nalso open the picker in ordinary file buffers. That is intentionally opt-in,\nand lazy setups need the bootstrap mapping above because `setup()` alone cannot\ninstall the first `Enter` trigger before the plugin loads.\n\nAt this stage the picker opens, filters, navigates, completes, and executes commands from the prompt.\n\nCurrent controls:\n\n- type to filter\n- non-empty queries can show both history hits and live command completions\n- `Up` / `Down` to move\n- `Ctrl-n` / `Ctrl-p` to move\n- `Ctrl-j` executes the selected item\n- `Ctrl-k` deletes after the cursor in the prompt\n- `Ctrl-w` to delete the previous word\n- `Ctrl-q` deletes the selected history entry and writes the change to ShaDa\n- `Enter` executes the selected item\n- bare numeric queries like `30` jump directly to that line on `Enter` by default\n- `Shift-Enter` executes the current text box contents directly\n- `Ctrl-e` fills the text box from the selected item without executing\n- `Esc` closes the picker\n\nConfig note:\n\n- `direct_submit_on_enter_commands` makes exact command queries bypass the\n  selected suggestion on plain `Enter`; defaults are `:bd`, `:noh`, `:q`,\n  `:q!`, `:qa`, `:qa!`, `:w`, `:w!`, `:wq`, and `:x`\n- `direct_numeric_line_jumps_on_enter = true` makes fully numeric queries bypass\n  the selected suggestion on plain `Enter` so `30` jumps straight to line 30\n- `submit_on_enter_if_no_matches = true` (default) makes plain `Enter` execute\n  the current query if there are no suggestions showing, instead of doing nothing\n\n## Local Development\n\nManual test session with seeded command history:\n\n```sh\nmake run\n```\n\nThat builds the native module first and launches Neovim using [scripts/minimal_native_init.lua](/Users/james/proj/penguin.nvim/scripts/minimal_native_init.lua). It loads `penguin.nvim` from this repo, enables the current native runtime slice, and seeds a few history entries so `:Penguin` is immediately useful.\n\nLua baseline dev session:\n\n```sh\nmake run-lua\n```\n\nThat launches Neovim using [scripts/minimal_init.lua](/Users/james/proj/penguin.nvim/scripts/minimal_init.lua) and still uses the native matcher by default.\n\nBenchmark-only Lua baseline:\n\n```lua\nrequire(\"penguin\").setup({\n  native = {\n    benchmark_only_lua = true,\n  },\n})\n```\n\nOptional native stub build:\n\n```sh\nmake native\n```\n\nHeadless native check:\n\n```sh\nmake check\n```\n\nThat verifies the native loader and the current native runtime slice.\n\nHeadless Lua baseline check:\n\n```sh\nmake check-lua\n```\n\nThat runs [scripts/headless_check.lua](/Users/james/proj/penguin.nvim/scripts/headless_check.lua) against the default native runtime path.\n\nHeadless benchmark run:\n\n```sh\nmake bench\n```\n\nThat runs the default quick profile from [scripts/headless_bench.lua](/Users/james/proj/penguin.nvim-improve03/scripts/headless_bench.lua), which compares the current Lua exact-scan baseline, native exact-scan baseline, and the current matcher runtime slice across the routine benchmark scenarios.\n\nFocused 100-row visible-list benchmark:\n\n```sh\nmake bench-visible100\n```\n\nThat runs only the `visible100` scenario, including the `selection_render_runtime` slice that measures repeated selection movement through a 100-row rendered list.\n\nFull long benchmark run:\n\n```sh\nmake bench-long\n```\n\nThe benchmark output includes both raw timings and a simple ASCII bar chart per scenario.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjamylak%2Fpenguin.nvim","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjamylak%2Fpenguin.nvim","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjamylak%2Fpenguin.nvim/lists"}