From dbdd73e84673ae730bd719b3a4be0133ca845b8a Mon Sep 17 00:00:00 2001 From: Nathan Zeng Date: Wed, 13 May 2026 04:31:17 -0700 Subject: refactor(tutor): use inline comments instead of json file #39714 Problem: Expected text for interactive marks is in a separate json file from the tutor file. When the tutor file is updated, line numbers (potentially many) have to be updated in the json file. This is a burden for maintenance and automatic testing. Solution: Put the expected text inline in the tutor file, marked with `[[]]`. Parse and remove the comments before opening the tutor file so extmarks can be applied. --- runtime/lua/nvim/tutor.lua | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'runtime/lua/nvim/tutor.lua') diff --git a/runtime/lua/nvim/tutor.lua b/runtime/lua/nvim/tutor.lua index 97bfbbb2d0..fb6693024c 100644 --- a/runtime/lua/nvim/tutor.lua +++ b/runtime/lua/nvim/tutor.lua @@ -16,6 +16,30 @@ local tutor_hl_ns = vim.api.nvim_create_namespace('nvim.tutor.hl') local M = {} +-- Extract inline comments into metadata. +-- Example: "This is wrong. [[This is right.]]" => { '1' = 'This is right.'} +function M.load_metadata() + ---@type table + local data = {} + local lines = vim.api.nvim_buf_get_lines(0, 0, -1, false) + + for i, line in ipairs(lines) do + local text, expected_text = line:match('^(.-)%s%[%[(.-)%]%]$') + + if text then + if expected_text == '-1' then + data[tostring(i)] = -1 + else + data[tostring(i)] = expected_text + end + lines[i] = text + end + end + + vim.b.tutor_metadata = { expect = data } + vim.api.nvim_buf_set_lines(0, 0, -1, false, lines) +end + ---@param line integer 1-based local function check_line(line) if vim.b.tutor_metadata and vim.b.tutor_metadata.expect and vim.b.tutor_extmarks then -- cgit