بنقرة واحدة
بنقرة واحدة
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
| 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.