with one click
testing-neovim
Test markdown-oxide LSP features in Neovim
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
Test markdown-oxide LSP features in Neovim
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
| name | testing-neovim |
| description | Test markdown-oxide LSP features in Neovim |
markdown-oxide is an LSP server for markdown/Obsidian vaults. It cannot be tested via browser or direct CLI invocation -- it requires an editor with LSP support. Neovim v0.11+ is the recommended testing environment.
Verify that markdown-oxide LSP features work correctly in Neovim, including wiki link completions, block linking (with block ID insertion via :wall), go-to-definition, hover with backlinks, and tag completions against the TestFiles/ directory. Testing is done in two recorded phases: first reproduce/demonstrate the current behavior, then validate the fix or expected behavior.
cd ~/repos/markdown-oxide && cargo build
sudo cp target/debug/markdown-oxide /usr/local/bin/markdown-oxide
Verify it's on PATH: which markdown-oxide
For release builds (slower but optimized): cargo build --release then copy from target/release/.
curl -fsSL -o /tmp/nvim.appimage https://github.com/neovim/neovim/releases/latest/download/nvim-linux-x86_64.appimage
chmod +x /tmp/nvim.appimage
cd /tmp && /tmp/nvim.appimage --appimage-extract
sudo mv /tmp/squashfs-root /opt/nvim
sudo ln -sf /opt/nvim/usr/bin/nvim /usr/local/bin/nvim
Verify: nvim --version | head -1 (should be v0.11+)
On headless/VM environments, the AppImage may fail with FUSE errors. Use --appimage-extract to extract without FUSE.
Create ~/.config/nvim/init.lua:
-- Minimal Neovim config for testing markdown-oxide LSP
vim.opt.number = true
vim.opt.signcolumn = "yes"
vim.opt.completeopt = { "menu", "menuone", "noselect" }
vim.lsp.config('markdown_oxide', {
cmd = { 'markdown-oxide' },
filetypes = { 'markdown' },
root_markers = { '.obsidian', '.moxide.toml', '.git' },
capabilities = {
workspace = {
didChangeWatchedFiles = {
dynamicRegistration = true,
},
},
},
})
vim.lsp.enable('markdown_oxide')
vim.api.nvim_create_autocmd('LspAttach', {
callback = function(args)
local opts = { buffer = args.buf }
vim.keymap.set('n', 'gd', vim.lsp.buf.definition, opts)
vim.keymap.set('n', 'gr', vim.lsp.buf.references, opts)
vim.keymap.set('n', 'K', vim.lsp.buf.hover, opts)
vim.keymap.set('n', '<leader>rn', vim.lsp.buf.rename, opts)
vim.keymap.set('n', '<leader>ca', vim.lsp.buf.code_action, opts)
vim.keymap.set('i', '<C-Space>', function()
vim.lsp.completion.trigger()
end, opts)
vim.lsp.completion.enable(true, args.data.client_id, args.buf, { autotrigger = true })
local client = vim.lsp.get_client_by_id(args.data.client_id)
if client and client.name == "markdown_oxide" then
vim.api.nvim_create_user_command("Daily", function(cmd_args)
vim.lsp.buf.execute_command({ command = "jump", arguments = { cmd_args.args } })
end, { desc = "Open daily note", nargs = "*" })
end
end,
})
This uses Neovim 0.11+ built-in LSP support (vim.lsp.config / vim.lsp.enable). The dynamicRegistration = true setting is critical for block linking to work.
Open a terminal emulator (e.g., konsole) and launch Neovim on TestFiles:
konsole --workdir ~/repos/markdown-oxide/TestFiles -e bash -c "nvim Test.md" &
Wait for Neovim to open and the LSP to attach. Verify with: pgrep -a markdown-oxide
Testing is split into two recorded phases:
Start a screen recording (recording_start). Demonstrate the current state of each feature before any fix. This establishes a baseline and captures any issues:
recording_stop) when doneAfter applying the fix (rebuild markdown-oxide, copy to PATH, quit and relaunch Neovim to restart the LSP):
recording_start)recording_stop) when doneTest each feature:
G to go to end of file, then o to open a new line[[ -- a completion menu should appear with files, headings, and blocks[[Reso should show "Resolved File")Escape and u to undo when doneo to open a new line in insert mode[[ (two brackets then a space) -- this triggers the unindexed block completertest file with some)Ctrl+n/Ctrl+p to navigate, Ctrl+y to accept[[Another Test 2#^f311g|text]] is inserted with a generated block ID:wall to write all buffers -- the block ID is inserted into the target file as an unsaved buffer edit^blockid suffix[[This is another link]] (around line 31)fT to find the T)gd -- should navigate to This is another link.mdCtrl+o to go back[[This is another link]]K (Shift+k) -- a hover popup should show:
Escape or any key to dismisso to open a new line, type #tatag, tag/subtag, tag/othersubtag, mapofcontent/tag, etc.Escape and u to undo when done# Heading 1gr to find all references/backlinks[[File#My-Heading]]) should resolve correctly[[File#My Heading]]) should also resolve (lenient matching)heading_slug config is trueTestFiles/Test.md: # Heading 1, ## Here is a nested, ### Here is a nested thirdTestFiles/Resolved File.md which has # Resolved HeadingAfter both recording phases are complete, post the recordings as comments on the PR:
Use git_comment_on_pr to post the Phase 1 recording with a comment like:
Phase 1: Reproducing current behavior in Neovim
Use git_comment_on_pr to post the Phase 2 recording with a comment like:
Phase 2: Validating fix in Neovim
This provides reviewers with visual evidence of the issue and its resolution.
Undo any test edits: Escape, then u repeatedly until "Already at oldest change".
Quit without saving: :qa!
TestFiles/Test.md -- Main test file with headings, wiki links, block refs, tagsTestFiles/Resolved File.md -- Has # Resolved Heading and heading linksTestFiles/Another Test.md -- Has # This is a test heading and ## This is a nested test headingTestFiles/This is another link.md -- Target for wiki link navigation tests^blockid into the target file after :wallmarkdown-oxide) must be running (verify with pgrep)vim.lsp.config / vim.lsp.enable. Older versions need nvim-lspconfig plugin.dynamicRegistration = true capability is essential for block linking and the "Create Unresolved File" code action to work.--appimage-extract to extract without FUSE.[[ (with a space after [[). Without the space, you get regular file/heading completions.:wall to persist it.nvim-cmp with cmp-nvim-lsp. The built-in vim.lsp.completion works but nvim-cmp provides better UX.:LspLog to inspect LSP communication for debugging.Ctrl+Space to force trigger.cargo build (debug) is much faster than cargo build --release -- use debug for testing iterations.Test markdown-oxide LSP changes by reproducing the issue and validating the fix in an editor (Neovim, Helix, or Zed).
Test markdown-oxide LSP features in Helix
Test markdown-oxide LSP features in Zed