{"id":50065249,"url":"https://github.com/NickTsaizer/splitasm.nvim","last_synced_at":"2026-05-23T17:01:23.498Z","repository":{"id":355405488,"uuid":"1227958590","full_name":"NickTsaizer/splitasm.nvim","owner":"NickTsaizer","description":"godbolt at home","archived":false,"fork":false,"pushed_at":"2026-05-16T18:45:45.000Z","size":20761,"stargazers_count":59,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-05-16T20:41:28.149Z","etag":null,"topics":["assembly","debugging-tool","neovim-plugin"],"latest_commit_sha":null,"homepage":"","language":"Lua","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/NickTsaizer.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":null,"dco":null,"cla":null}},"created_at":"2026-05-03T11:59:36.000Z","updated_at":"2026-05-16T18:45:48.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/NickTsaizer/splitasm.nvim","commit_stats":null,"previous_names":["nicktsaizer/splitasm.nvim"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/NickTsaizer/splitasm.nvim","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NickTsaizer%2Fsplitasm.nvim","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NickTsaizer%2Fsplitasm.nvim/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NickTsaizer%2Fsplitasm.nvim/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NickTsaizer%2Fsplitasm.nvim/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NickTsaizer","download_url":"https://codeload.github.com/NickTsaizer/splitasm.nvim/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NickTsaizer%2Fsplitasm.nvim/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33404269,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-23T04:15:53.637Z","status":"ssl_error","status_checked_at":"2026-05-23T04:15:53.242Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["assembly","debugging-tool","neovim-plugin"],"created_at":"2026-05-21T23:00:21.364Z","updated_at":"2026-05-23T17:01:23.462Z","avatar_url":"https://github.com/NickTsaizer.png","language":"Lua","funding_links":[],"categories":["Debugging"],"sub_categories":["CSV Files"],"readme":"# splitasm.nvim\n\nIn some cases, inspecting the source is not sufficient; the relevant behavior\nis only visible in the generated machine code.\n\n`splitasm.nvim` supports that workflow inside Neovim by opening `objdump`\noutput beside the current file and keeping source and assembly aligned during\nnavigation.\n\n![splitasm preview](./doc/assets/splitasm_preview.gif)\n\n## Overview\n\nAssembly inspection often requires repeatedly switching between source code and\ndisassembled output. SplitAsm keeps both views in a single workspace:\n\n- source on one side\n- disassembly on the other\n- optional build step before loading\n- cursor sync between both buffers\n- line number and address column display controls\n- stable row coloring for asm lines that map back to source\n\n## Typical workflow\n\n1. Open a source file.\n2. Run `:SplitAsmOpen`.\n3. Read both sides together.\n\nIf SplitAsm already knows the executable path, no further setup is required.\n\nOtherwise, it attempts to locate a nearby executable. If that fails, it directs\nyou to `:SplitAsmSetup`, `:SplitAsmConfig`, or a one-time explicit path.\n\nWithin the assembly split:\n\n- `q` closes the split\n- `r` refreshes the assembly view\n- `s` toggles synchronization\n\nThe same `s` mapping is also added to source buffers while a SplitAsm session\nis active.\n\n## Requirements and backend behavior\n\nSplitAsm depends on the following conditions:\n\n- Neovim 0.9+\n- A supported disassembler backend on your `PATH`:\n  - GNU `objdump` / `objdump.exe`\n  - LLVM `llvm-objdump` / `llvm-objdump.exe`\n- Any external build tool referenced by `compiler_cmd` must already be\n  installed and runnable from Neovim's current working directory\n- A compiled executable with debug line info for best source mapping\n\nSplitAsm reads assembly through one of these backend-specific commands:\n\n- GNU `objdump -d -Mintel --no-show-raw-insn -l -C`\n- LLVM `llvm-objdump -d -M intel --no-show-raw-insn -l -C`\n\n\n## Installation\n\n### lazy.nvim\n\n```lua\n{\n  \"NickTsaizer/splitasm.nvim\",\n  cmd = {\n    \"SplitAsm\",\n    \"SplitAsmOpen\",\n    \"SplitAsmSetup\",\n    \"SplitAsmConfig\",\n    \"SplitAsmToggleSync\",\n    \"SplitAsmToggleLineNumbers\",\n    \"SplitAsmToggleHideAddress\",\n  },\n  opts = {},\n}\n```\n\n### Minimal setup\n\n```lua\nrequire(\"splitasm\").setup()\n```\n\n### Example setup\n\n```lua\nrequire(\"splitasm\").setup({\n  compiler_cmd = \"cargo build --release\",\n  executable_path = \"./target/release/myapp\",\n  source_path_mappings = {\n    { from = \"/work/src\", to = vim.fn.getcwd() },\n  },\n  auto_sync = true,\n  hide_address = false,\n  source_row_colors = true,\n  show_line_numbers = true,\n})\n```\n\n## Opening an executable\n\nUse the configured or auto-detected executable:\n\n```vim\n:SplitAsmOpen\n```\n\nUse a specific executable for a single invocation:\n\n```vim\n:SplitAsmOpen ./build/myapp\n```\n\nWindows example:\n\n```vim\n:SplitAsmOpen .\\build\\myapp.exe\n```\n\nWhen `executable_path` is unset, SplitAsm searches in:\n\n- `.`\n- `./build`\n- `./bin`\n- `./out`\n- `./dist`\n\nOn Windows, auto-detection also tries `.exe` variants.\n\n## Configuration\n\n```lua\nrequire(\"splitasm\").setup({\n  compiler_cmd = nil,\n  executable_path = nil,\n  source_path_mappings = {},\n  auto_sync = true,\n  hide_address = false,\n  source_row_colors = true,\n  show_line_numbers = true,\n})\n```\n\n| Option | Default | Description |\n| --- | --- | --- |\n| `compiler_cmd` | `nil` | Command to run before loading assembly |\n| `executable_path` | `nil` | Executable to inspect; when unset, SplitAsm auto-detects one, including `.exe` candidates on Windows |\n| `source_path_mappings` | `{}` | Remap debug-info source prefixes to local paths, e.g. `{ from = \"/work/src\", to = vim.fn.getcwd() }` for container builds |\n| `auto_sync` | `true` | Keep source and assembly cursors aligned on movement |\n| `hide_address` | `false` | Strip address column from assembly output |\n| `source_row_colors` | `true` | Apply stable subtle line highlights to asm rows that map back to a source line |\n| `show_line_numbers` | `true` | Show line number column in the assembly split |\n\n`require(\"splitasm\").setup()` remains intentionally small. SplitAsm validates\noption types up front and reports invalid values immediately.\n\n## Commands\n\n| Command | Description |\n| --- | --- |\n| `:SplitAsmOpen [path]` | Open the assembly view for the configured executable or an explicit path |\n| `:SplitAsm [path]` | Alias for `:SplitAsmOpen` |\n| `:SplitAsmSetup` | Guided setup for build command and executable path |\n| `:SplitAsmConfig` | Show current settings, then prompt for updates |\n| `:SplitAsmToggleSync` | Toggle automatic source/assembly sync |\n| `:SplitAsmToggleLineNumbers` | Toggle line number column |\n| `:SplitAsmToggleHideAddress` | Toggle address column visibility |\n\n## Docker / remote build path mapping\n\nIf your binary is built in a container or remote environment, the debug markers\ninside `objdump` may point at paths that do not exist on your host machine.\nUse `source_path_mappings` to rewrite those prefixes before SplitAsm syncs\nbetween source and assembly.\n\n```lua\nrequire(\"splitasm\").setup({\n  executable_path = \"./out/demo\",\n  source_path_mappings = {\n    { from = \"/work/src\", to = vim.fn.getcwd() .. \"/src\" },\n  },\n})\n```\n\nThis is especially useful when you compile in Docker with a different in-\ncontainer working directory than your local checkout.\n\nWhen `source_path_mappings` is empty or does not match, SplitAsm also tries a\nbest-effort session-local fallback based on the current file and the debug path\nsuffix. Explicit mappings always win.\n\n## Limitations\n\n- Source-to-assembly mapping depends on debug line markers in the binary\n- Container or remote builds may need `source_path_mappings` when debug paths do\n  not match local source paths\n- Auto-detection is heuristic and may not fit every project layout\n- `hide_address = true` improves readability, but removes address and label detail\n- Build failures and missing executables are reported clearly, but SplitAsm\n  does not infer project-specific build steps for you\n- SplitAsm only supports GNU/LLVM `objdump`-style backends\n- Mixed shell environments on Windows may still require manual `PATH` or\n  executable-path configuration\n\n## Help\n\nAfter installation, see `:help splitasm`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FNickTsaizer%2Fsplitasm.nvim","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FNickTsaizer%2Fsplitasm.nvim","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FNickTsaizer%2Fsplitasm.nvim/lists"}