fix(nvim-core): implement missing json-rpc actions for buffer, workspace, ui, and intelligence tools
This commit is contained in:
1 parent
4bfb3b6359
commit
27416e4ee9
1 file changed
+80
-3
+80
-3
@@ -1260,7 +1260,7 @@ pub async fn run_mcp_loop(app_name: &str, app_version: &str) {
|
|||||||
handle_lua_result!(id, execute_nvim_lua(code));
|
handle_lua_result!(id, execute_nvim_lua(code));
|
||||||
}
|
}
|
||||||
|
|
||||||
"redo" => {
|
"undo" | "redo" => {
|
||||||
let is_undo = action == "undo";
|
let is_undo = action == "undo";
|
||||||
let steps = args.get("steps").and_then(|v| v.as_i64()).unwrap_or(1);
|
let steps = args.get("steps").and_then(|v| v.as_i64()).unwrap_or(1);
|
||||||
let cmd = if is_undo {
|
let cmd = if is_undo {
|
||||||
@@ -1283,6 +1283,37 @@ pub async fn run_mcp_loop(app_name: &str, app_version: &str) {
|
|||||||
handle_lua_result!(id, execute_nvim_lua(&code));
|
handle_lua_result!(id, execute_nvim_lua(&code));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
"create_scratch" => {
|
||||||
|
let mut modified_args = args.clone();
|
||||||
|
if let Some(content) = modified_args.get_mut("content")
|
||||||
|
&& let Some(s) = content.as_str()
|
||||||
|
{
|
||||||
|
let lines: Vec<String> = s
|
||||||
|
.split('\n')
|
||||||
|
.map(|l| l.trim_end_matches('\r').to_string())
|
||||||
|
.collect();
|
||||||
|
*content = serde_json::json!(lines);
|
||||||
|
}
|
||||||
|
let args_rmp = json_to_rmpv(&modified_args);
|
||||||
|
let code = "
|
||||||
|
local args = ...
|
||||||
|
local name = args.name or 'Scratch'
|
||||||
|
local content = args.content or {}
|
||||||
|
if type(content) == 'string' then
|
||||||
|
content = {content}
|
||||||
|
end
|
||||||
|
local bufnr = vim.api.nvim_create_buf(true, true)
|
||||||
|
pcall(vim.api.nvim_buf_set_name, bufnr, name)
|
||||||
|
vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, content)
|
||||||
|
vim.api.nvim_win_set_buf(0, bufnr)
|
||||||
|
return 'Created and focused scratch buffer: ' .. name
|
||||||
|
";
|
||||||
|
handle_lua_result!(
|
||||||
|
id,
|
||||||
|
execute_nvim_lua_with_args(code, vec![args_rmp])
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
_ => {
|
_ => {
|
||||||
send_error(
|
send_error(
|
||||||
id,
|
id,
|
||||||
@@ -1310,6 +1341,37 @@ pub async fn run_mcp_loop(app_name: &str, app_version: &str) {
|
|||||||
";
|
";
|
||||||
handle_lua_result!(id, execute_nvim_lua(lua_code))
|
handle_lua_result!(id, execute_nvim_lua(lua_code))
|
||||||
}
|
}
|
||||||
|
"list_windows" => {
|
||||||
|
let lua_code = r"
|
||||||
|
local wins = vim.api.nvim_list_wins()
|
||||||
|
local result = {}
|
||||||
|
for _, win in ipairs(wins) do
|
||||||
|
if vim.api.nvim_win_is_valid(win) then
|
||||||
|
local buf = vim.api.nvim_win_get_buf(win)
|
||||||
|
local name = vim.api.nvim_buf_get_name(buf)
|
||||||
|
table.insert(result, { id = win, buf_id = buf, buf_name = name })
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return vim.fn.json_encode(result)
|
||||||
|
";
|
||||||
|
handle_lua_result!(id, execute_nvim_lua(lua_code))
|
||||||
|
}
|
||||||
|
"focus" => {
|
||||||
|
if let Some(win_id) = args.get("win_id").and_then(|v| v.as_i64()) {
|
||||||
|
let code = format!("
|
||||||
|
local win_id = {}
|
||||||
|
if vim.api.nvim_win_is_valid(win_id) then
|
||||||
|
vim.api.nvim_set_current_win(win_id)
|
||||||
|
return 'Focused window ' .. tostring(win_id)
|
||||||
|
else
|
||||||
|
error('Invalid window ID')
|
||||||
|
end
|
||||||
|
", win_id);
|
||||||
|
handle_lua_result!(id, execute_nvim_lua(&code));
|
||||||
|
} else {
|
||||||
|
send_error(id, -32602, "Missing 'win_id'").await;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
"split" => {
|
"split" => {
|
||||||
let args_rmp = json_to_rmpv(args);
|
let args_rmp = json_to_rmpv(args);
|
||||||
@@ -1537,6 +1599,21 @@ pub async fn run_mcp_loop(app_name: &str, app_version: &str) {
|
|||||||
return table.concat(results, "\n\n")
|
return table.concat(results, "\n\n")
|
||||||
"#
|
"#
|
||||||
}
|
}
|
||||||
|
"diagnostics" => {
|
||||||
|
r#"
|
||||||
|
local args = ...
|
||||||
|
local bufnr = vim.fn.bufnr(args.file)
|
||||||
|
if bufnr == -1 then return "Buffer not found" end
|
||||||
|
local diags = vim.diagnostic.get(bufnr)
|
||||||
|
if #diags == 0 then return "No diagnostics found" end
|
||||||
|
local results = {}
|
||||||
|
for _, d in ipairs(diags) do
|
||||||
|
local severity = vim.diagnostic.severity[d.severity] or "UNKNOWN"
|
||||||
|
table.insert(results, string.format("[%s] Line %d: %s", severity, d.lnum + 1, d.message))
|
||||||
|
end
|
||||||
|
return table.concat(results, "\n")
|
||||||
|
"#
|
||||||
|
}
|
||||||
|
|
||||||
_ => "",
|
_ => "",
|
||||||
};
|
};
|
||||||
@@ -1584,9 +1661,9 @@ pub async fn run_mcp_loop(app_name: &str, app_version: &str) {
|
|||||||
send_error(id, -32602, "Missing 'line' or 'text'").await;
|
send_error(id, -32602, "Missing 'line' or 'text'").await;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
"clear" => {
|
"highlight" | "clear" => {
|
||||||
let mut modified_args = args.clone();
|
let mut modified_args = args.clone();
|
||||||
if action == "clear_highlight"
|
if action == "clear"
|
||||||
&& let Some(obj) = modified_args.as_object_mut()
|
&& let Some(obj) = modified_args.as_object_mut()
|
||||||
{
|
{
|
||||||
obj.insert("clear_only".to_string(), json!(true));
|
obj.insert("clear_only".to_string(), json!(true));
|
||||||
|
|||||||
Reference in new issue
Block a user