From db71b29012dd1cb58db07aedb1309d600e2bdebe Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 15 Dec 2025 10:46:13 +0000 Subject: [PATCH 1/4] chore(doc): auto generate docs --- doc/guard.nvim.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/guard.nvim.txt b/doc/guard.nvim.txt index de36435..b4a0035 100644 --- a/doc/guard.nvim.txt +++ b/doc/guard.nvim.txt @@ -1,4 +1,4 @@ -*guard.nvim.txt* For NVIM v0.8.0 Last change: 2025 November 13 +*guard.nvim.txt* For NVIM v0.8.0 Last change: 2025 December 15 ============================================================================== Table of Contents *guard.nvim-table-of-contents* From 4c4b8fb93711d62f1d2e56956285128619f57301 Mon Sep 17 00:00:00 2001 From: xiaoshihou Date: Mon, 15 Dec 2025 22:05:40 +0800 Subject: [PATCH 2/4] fix: lsp formatting --- Makefile | 6 +++--- lua/guard/_async.lua | 2 +- lua/guard/events.lua | 2 ++ lua/guard/format.lua | 2 +- lua/guard/lsp.lua | 48 ++++++++++++++++++++++---------------------- 5 files changed, 31 insertions(+), 29 deletions(-) diff --git a/Makefile b/Makefile index c9092f9..50f2d2c 100644 --- a/Makefile +++ b/Makefile @@ -1,12 +1,12 @@ LUAROCKS_PATH_CMD = luarocks path --no-bin --lua-version 5.1 -BUSTED = eval $$(luarocks path --no-bin --lua-version 5.1) && busted --lua nlua +TEST = luarocks test --local --lua-version=5.1 TEST_DIR = spec .PHONY: test test: @echo "Running tests..." @if [ -n "$(file)" ]; then \ - $(BUSTED) $(file); \ + $(TEST) $(file); \ else \ - $(BUSTED) $(TEST_DIR); \ + $(TEST); \ fi diff --git a/lua/guard/_async.lua b/lua/guard/_async.lua index 47f37b6..7a643fc 100644 --- a/lua/guard/_async.lua +++ b/lua/guard/_async.lua @@ -46,7 +46,7 @@ function M.run(func, on_finish) return { --- @param timeout? integer --- @return any ... return values of `func` - wait = function(_self, timeout) + wait = function(_, timeout) vim.wait(timeout or max_timeout, function() return res ~= nil end) diff --git a/lua/guard/events.lua b/lua/guard/events.lua index 03773e9..f1d3526 100644 --- a/lua/guard/events.lua +++ b/lua/guard/events.lua @@ -227,9 +227,11 @@ function M.create_lspattach_autocmd() au('LspAttach', { group = M.group, callback = function(args) + vim.print('create_lspattach_autocmd body') if not getopt('lsp_as_default_formatter') then return end + vim.print('create_lspattach_autocmd body 2') local client = vim.lsp.get_client_by_id(args.data.client_id) if not client or not client:supports_method('textDocument/formatting', args.data.buf) then return diff --git a/lua/guard/format.lua b/lua/guard/format.lua index ae2b7ed..897f512 100644 --- a/lua/guard/format.lua +++ b/lua/guard/format.lua @@ -201,7 +201,7 @@ local function do_fmt(buf) fail(err) return end - new_lines = output + new_lines = assert(output) end async.await(1, function(callback) diff --git a/lua/guard/lsp.lua b/lua/guard/lsp.lua index 1c0a112..8575cfc 100644 --- a/lua/guard/lsp.lua +++ b/lua/guard/lsp.lua @@ -1,13 +1,13 @@ +local async = require('guard._async') local M = {} local api = vim.api local apply = vim.lsp.util.apply_text_edits ---@param buf number ----@param range table +---@param range table? ---@param acc string ---@return string function M.format(buf, range, acc) - local co = assert(coroutine.running()) local clients = vim.lsp.get_clients({ bufnr = buf, method = 'textDocument/formatting' }) if #clients == 0 then return acc @@ -19,30 +19,30 @@ function M.format(buf, range, acc) api.nvim_buf_set_lines(scratch, 0, -1, false, vim.split(acc, '\r?\n')) local line_offset = range and range.start[1] - 1 or 0 - ---@diagnostic disable-next-line: duplicate-set-field - vim.lsp.util.apply_text_edits = function(text_edits, _, offset_encoding) - -- the target buffer must be buf, we apply it to our scratch buffer - n_edits = n_edits - 1 - vim.tbl_map(function(edit) - edit.range.start.line = edit.range.start.line - line_offset - edit.range['end'].line = edit.range['end'].line - line_offset - end, text_edits) - apply(text_edits, scratch, offset_encoding) - if n_edits == 0 then - vim.lsp.util.apply_text_edits = apply - local lines = api.nvim_buf_get_lines(scratch, 0, -1, false) - api.nvim_command('silent! bwipe! ' .. scratch) - coroutine.resume(co, table.concat(lines, '\n')) + return async.await(1, function(callback) + ---@diagnostic disable-next-line: duplicate-set-field + vim.lsp.util.apply_text_edits = function(text_edits, _, offset_encoding) + -- the target buffer must be buf, we apply it to our scratch buffer + n_edits = n_edits - 1 + vim.tbl_map(function(edit) + edit.range.start.line = edit.range.start.line - line_offset + edit.range['end'].line = edit.range['end'].line - line_offset + end, text_edits) + apply(text_edits, scratch, offset_encoding) + if n_edits == 0 then + vim.lsp.util.apply_text_edits = apply + local lines = api.nvim_buf_get_lines(scratch, 0, -1, false) + api.nvim_command('silent! bwipe! ' .. scratch) + callback(table.concat(lines, '\n')) + end end - end - - vim.lsp.buf.format({ - bufnr = buf, - range = range, - async = true, - }) - return (coroutine.yield()) + vim.lsp.buf.format({ + bufnr = buf, + range = range, + async = true, + }) + end) end return M From c64e34fee13507f9acf8680edcf5d6533b843da8 Mon Sep 17 00:00:00 2001 From: xiaoshihou Date: Mon, 15 Dec 2025 22:10:56 +0800 Subject: [PATCH 3/4] chore: rm debug msg --- lua/guard/events.lua | 2 -- 1 file changed, 2 deletions(-) diff --git a/lua/guard/events.lua b/lua/guard/events.lua index f1d3526..03773e9 100644 --- a/lua/guard/events.lua +++ b/lua/guard/events.lua @@ -227,11 +227,9 @@ function M.create_lspattach_autocmd() au('LspAttach', { group = M.group, callback = function(args) - vim.print('create_lspattach_autocmd body') if not getopt('lsp_as_default_formatter') then return end - vim.print('create_lspattach_autocmd body 2') local client = vim.lsp.get_client_by_id(args.data.client_id) if not client or not client:supports_method('textDocument/formatting', args.data.buf) then return From d1e53c518ba5337aa673d72fcc43ac30cdfca88f Mon Sep 17 00:00:00 2001 From: xiaoshihou Date: Mon, 15 Dec 2025 22:11:28 +0800 Subject: [PATCH 4/4] chore: add tests (broken) --- spec/lsp_spec.lua | 61 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 spec/lsp_spec.lua diff --git a/spec/lsp_spec.lua b/spec/lsp_spec.lua new file mode 100644 index 0000000..ba213d6 --- /dev/null +++ b/spec/lsp_spec.lua @@ -0,0 +1,61 @@ +-- ---@diagnostic disable: undefined-field, undefined-global +-- require('plugin.guard') +-- local api = vim.api +-- local same = assert.are.same +-- local ft = require('guard.filetype') +-- local gapi = require('guard.api') +-- +-- describe('format module', function() +-- local bufnr +-- local ill_c = { +-- 'int main( void ) {return 0;}', +-- } +-- +-- before_each(function() +-- for k, _ in pairs(ft) do +-- ft[k] = nil +-- end +-- vim.g.guard_config = { +-- lsp_as_default_formatter = true, +-- } +-- +-- vim.lsp.config('clangd', { +-- cmd = { 'clangd' }, +-- filetypes = { 'c' }, +-- capabilities = { +-- textDocument = { +-- formatting = { +-- dynamicRegistration = true, +-- }, +-- }, +-- }, +-- }) +-- vim.lsp.enable('clangd') +-- +-- bufnr = api.nvim_create_buf(true, false) +-- +-- vim.bo[bufnr].filetype = 'c' +-- api.nvim_set_current_buf(bufnr) +-- vim.cmd('silent! write! /tmp/lsp_spec_test.c') +-- end) +-- +-- after_each(function() +-- vim.lsp.enable('clangd', false) +-- end) +-- +-- local function getlines() +-- return api.nvim_buf_get_lines(bufnr, 0, -1, false) +-- end +-- +-- local function setlines(lines) +-- api.nvim_buf_set_lines(bufnr, 0, -1, false, lines) +-- end +-- +-- it('lsp default formatter works', function() +-- vim.wait(500) +-- setlines(ill_c) +-- gapi.fmt(bufnr) +-- vim.wait(500) +-- same({ 'int main(void) { return 0; }' }, getlines()) +-- end) +-- end)