{"id":51136017,"url":"https://github.com/devxplay/herdr.nvim","last_synced_at":"2026-07-14T01:00:48.032Z","repository":{"id":361768848,"uuid":"1255690060","full_name":"devxplay/herdr.nvim","owner":"devxplay","description":"Neovim integration for Herdr pane navigation","archived":false,"fork":false,"pushed_at":"2026-06-01T08:10:25.000Z","size":15,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-01T08:16:10.223Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/devxplay.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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-06-01T04:50:58.000Z","updated_at":"2026-06-01T08:10:29.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/devxplay/herdr.nvim","commit_stats":null,"previous_names":["devxplay/herdr.nvim"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/devxplay/herdr.nvim","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devxplay%2Fherdr.nvim","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devxplay%2Fherdr.nvim/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devxplay%2Fherdr.nvim/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devxplay%2Fherdr.nvim/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/devxplay","download_url":"https://codeload.github.com/devxplay/herdr.nvim/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devxplay%2Fherdr.nvim/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35441637,"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-07-13T02:00:06.543Z","response_time":119,"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":[],"created_at":"2026-06-25T18:00:29.291Z","updated_at":"2026-07-14T01:00:48.025Z","avatar_url":"https://github.com/devxplay.png","language":"Rust","funding_links":[],"categories":["Rust"],"sub_categories":[],"readme":"# herdr.nvim\n\nNeovim integration for [Herdr](https://herdr.dev).\n\nThe first feature is tmux-style navigation between Neovim windows and Herdr panes with one key family:\n\n- `Ctrl+h`\n- `Ctrl+j`\n- `Ctrl+k`\n- `Ctrl+l`\n\n## How it works\n\nHerdr does not currently expose tmux-style process-aware key forwarding. `herdr.nvim` works around that with two pieces:\n\n1. The Neovim plugin writes a per-pane marker file under `~/.cache/herdr.nvim/panes/` while Neovim is open. This is a plain empty file named after the Herdr pane ID — no JSON, no shared state, no races.\n2. The Rust `herdr-navigator` helper is bound in Herdr. When `Ctrl+h/j/k/l` is pressed:\n   - if the active pane has a marker file, it forwards the key into Neovim;\n   - otherwise it moves focus to the adjacent Herdr pane.\n\nWhen Neovim receives the key, it first moves between Neovim windows. If there is no Neovim window in that direction, it asks Herdr to focus the adjacent Herdr pane.\n\nThe helper forwards control keys with Herdr's raw `pane.send_text` API. This avoids bracketed paste, which would make Neovim try to insert text into buffers like `NvimTree`.\n\nThe helper can also own split bindings and keeps a short live layout cache under `~/.cache/herdr.nvim/`. This avoids waiting for Herdr's debounced `session.json` save before pane navigation knows about a new split.\n\nStale marker files (from crashed Neovim instances) are pruned automatically by checking against Herdr's live `pane.list` at dispatch time.\n\nThe plugin builds the Rust helper automatically on install/update (via `build.lua` for lazy.nvim, or on-demand at runtime for other package managers). For a manual checkout, build it yourself:\n\n```sh\ncargo build --release\n```\n\nThe Neovim plugin uses `target/release/herdr-navigator` by default. Override `helper` in setup only if you install the binary somewhere else.\n\nNeovim pane registration uses simple marker files, not Herdr's agent API. The helper only uses Herdr's agent focus API internally as a temporary focus shim (since Herdr has no direct `pane.focus` API), then releases that marker immediately.\n\n## Coexistence with vim-tmux-navigator\n\n`herdr.nvim` detects the environment at runtime:\n\n- **Inside Herdr** (`$HERDR_ENV` or `$HERDR_SOCKET_PATH` set): always uses its own navigator.\n- **Inside tmux** (`$TMUX` set) with [vim-tmux-navigator](https://github.com/christoomey/vim-tmux-navigator) installed: delegates `Ctrl+h/j/k/l` to `TmuxNavigate*` commands when at a Neovim edge.\n- **Neither**: navigation stays within Neovim windows only.\n\nThis means you can have both plugins in your config with no special flags:\n\n```lua\n-- plugins/tmux.lua\nreturn {\n  \"christoomey/vim-tmux-navigator\",\n}\n\n-- plugins/herdr.lua\nreturn {\n  \"devxplay/herdr.nvim\",\n}\n```\n\n## Lazy.nvim\n\n```lua\n{\n  \"devxplay/herdr.nvim\",\n}\n```\n\n## Herdr config\n\nInstall `herdr-navigator` somewhere on your `PATH` for Herdr shell keybindings:\n\n```sh\ncargo install --git https://github.com/devxplay/herdr.nvim.git --bin herdr-navigator\n```\n\nKeep prefix pane movement as a fallback:\n\n```toml\nfocus_pane_left = \"prefix+h\"\nfocus_pane_down = \"prefix+j\"\nfocus_pane_up = \"prefix+k\"\nfocus_pane_right = \"prefix+l\"\n```\n\nRoute split keys through the helper so new panes are immediately visible to navigation:\n\n```toml\nsplit_vertical = \"\"\nsplit_horizontal = \"\"\n\n[[keys.command]]\nkey = 'prefix+\\'\ntype = \"shell\"\ncommand = \"herdr-navigator split right\"\n\n[[keys.command]]\nkey = \"prefix+minus\"\ntype = \"shell\"\ncommand = \"herdr-navigator split down\"\n```\n\nBind direct keys to the helper:\n\n```toml\n[[keys.command]]\nkey = \"ctrl+h\"\ntype = \"shell\"\ncommand = \"herdr-navigator dispatch left\"\n\n[[keys.command]]\nkey = \"ctrl+j\"\ntype = \"shell\"\ncommand = \"herdr-navigator dispatch down\"\n\n[[keys.command]]\nkey = \"ctrl+k\"\ntype = \"shell\"\ncommand = \"herdr-navigator dispatch up\"\n\n[[keys.command]]\nkey = \"ctrl+l\"\ntype = \"shell\"\ncommand = \"herdr-navigator dispatch right\"\n```\n\n## Commands\n\n- `:HerdrNavigateLeft`\n- `:HerdrNavigateDown`\n- `:HerdrNavigateUp`\n- `:HerdrNavigateRight`\n- `:HerdrRegisterPane`\n- `:HerdrReleasePane`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevxplay%2Fherdr.nvim","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdevxplay%2Fherdr.nvim","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevxplay%2Fherdr.nvim/lists"}