Skip to content

Commit c3027af

Browse files
authored
feat: add :GpSelectAgent to improve selection of agents (#272)
* add :GpAgentSelect command * update nvim docs * rename to :GpSelectAgent * fix typo * undo autoformat
1 parent 6474b70 commit c3027af

File tree

3 files changed

+71
-0
lines changed

3 files changed

+71
-0
lines changed

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,10 @@ Displays currently used agents for chat and command instructions.
369369

370370
Choose a new agent based on its name, listing options based on the current buffer (chat agents if current buffer is a chat and command agents otherwise). The agent setting is persisted on disk across Neovim instances.
371371

372+
#### `:GpSelectAgent` <!-- {doc=:GpSelectAgent} -->
373+
374+
Opens a selection interface using `vim.ui.select` to choose from all available agents, allowing you to directly select the desired agent from a list. Works seamlessly with telescope if available.
375+
372376
## Image commands
373377

374378
#### `:GpImage` <!-- {doc=:GpImage} -->
@@ -530,6 +534,7 @@ vim.keymap.set("v", "<C-g>x", ":<C-u>'<,'>GpContext<cr>", keymapOptions("Visual
530534

531535
vim.keymap.set({"n", "i", "v", "x"}, "<C-g>s", "<cmd>GpStop<cr>", keymapOptions("Stop"))
532536
vim.keymap.set({"n", "i", "v", "x"}, "<C-g>n", "<cmd>GpNextAgent<cr>", keymapOptions("Next Agent"))
537+
vim.keymap.set({"n", "i", "v", "x"}, "<C-g>j", "<cmd>GpSelectAgent<cr>", keymapOptions("Select Agent"))
533538

534539
-- optional Whisper commands with prefix <C-g>w
535540
vim.keymap.set({"n", "i"}, "<C-g>ww", "<cmd>GpWhisper<cr>", keymapOptions("Whisper"))
@@ -582,6 +587,7 @@ require("which-key").add({
582587
{ "<C-g>gv", ":<C-u>'<,'>GpVnew<cr>", desc = "Visual GpVnew" },
583588
{ "<C-g>i", ":<C-u>'<,'>GpImplement<cr>", desc = "Implement selection" },
584589
{ "<C-g>n", "<cmd>GpNextAgent<cr>", desc = "Next Agent" },
590+
{ "<C-g>j", "<cmd>GpSelectAgent<cr>", desc = "Select Agent" },
585591
{ "<C-g>p", ":<C-u>'<,'>GpChatPaste<cr>", desc = "Visual Chat Paste" },
586592
{ "<C-g>r", ":<C-u>'<,'>GpRewrite<cr>", desc = "Visual Rewrite" },
587593
{ "<C-g>s", "<cmd>GpStop<cr>", desc = "GpStop" },
@@ -618,6 +624,7 @@ require("which-key").add({
618624
{ "<C-g>gt", "<cmd>GpTabnew<cr>", desc = "GpTabnew" },
619625
{ "<C-g>gv", "<cmd>GpVnew<cr>", desc = "GpVnew" },
620626
{ "<C-g>n", "<cmd>GpNextAgent<cr>", desc = "Next Agent" },
627+
{ "<C-g>j", "<cmd>GpSelectAgent<cr>", desc = "Select Agent" },
621628
{ "<C-g>r", "<cmd>GpRewrite<cr>", desc = "Inline Rewrite" },
622629
{ "<C-g>s", "<cmd>GpStop<cr>", desc = "GpStop" },
623630
{ "<C-g>t", "<cmd>GpChatToggle<cr>", desc = "Toggle Chat" },
@@ -653,6 +660,7 @@ require("which-key").add({
653660
{ "<C-g>gt", "<cmd>GpTabnew<cr>", desc = "GpTabnew" },
654661
{ "<C-g>gv", "<cmd>GpVnew<cr>", desc = "GpVnew" },
655662
{ "<C-g>n", "<cmd>GpNextAgent<cr>", desc = "Next Agent" },
663+
{ "<C-g>j", "<cmd>GpSelectAgent<cr>", desc = "Select Agent" },
656664
{ "<C-g>r", "<cmd>GpRewrite<cr>", desc = "Inline Rewrite" },
657665
{ "<C-g>s", "<cmd>GpStop<cr>", desc = "GpStop" },
658666
{ "<C-g>t", "<cmd>GpChatToggle<cr>", desc = "Toggle Chat" },

doc/gp.nvim.txt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,13 @@ buffer (chat agents if current buffer is a chat and command agents otherwise).
483483
The agent setting is persisted on disk across Neovim instances.
484484

485485

486+
:GpSelectAgent *:GpSelectAgent*
487+
488+
Opens a selection interface using `vim.ui.select` to choose from all available
489+
agents, allowing you to directly select the desired agent from a list. Works
490+
seamlessly with telescope if available.
491+
492+
486493
IMAGE COMMANDS *gp.nvim-image-commands*
487494

488495

@@ -668,6 +675,7 @@ them at one place).
668675

669676
vim.keymap.set({"n", "i", "v", "x"}, "<C-g>s", "<cmd>GpStop<cr>", keymapOptions("Stop"))
670677
vim.keymap.set({"n", "i", "v", "x"}, "<C-g>n", "<cmd>GpNextAgent<cr>", keymapOptions("Next Agent"))
678+
vim.keymap.set({"n", "i", "v", "x"}, "<C-g>j", "<cmd>GpSelectAgent<cr>", keymapOptions("Select Agent"))
671679

672680
-- optional Whisper commands with prefix <C-g>w
673681
vim.keymap.set({"n", "i"}, "<C-g>ww", "<cmd>GpWhisper<cr>", keymapOptions("Whisper"))
@@ -722,6 +730,7 @@ Or go more fancy by using which-key.nvim
722730
{ "<C-g>gv", ":<C-u>'<,'>GpVnew<cr>", desc = "Visual GpVnew" },
723731
{ "<C-g>i", ":<C-u>'<,'>GpImplement<cr>", desc = "Implement selection" },
724732
{ "<C-g>n", "<cmd>GpNextAgent<cr>", desc = "Next Agent" },
733+
{ "<C-g>j", "<cmd>GpSelectAgent<cr>", desc = "Select Agent" },
725734
{ "<C-g>p", ":<C-u>'<,'>GpChatPaste<cr>", desc = "Visual Chat Paste" },
726735
{ "<C-g>r", ":<C-u>'<,'>GpRewrite<cr>", desc = "Visual Rewrite" },
727736
{ "<C-g>s", "<cmd>GpStop<cr>", desc = "GpStop" },
@@ -758,6 +767,7 @@ Or go more fancy by using which-key.nvim
758767
{ "<C-g>gt", "<cmd>GpTabnew<cr>", desc = "GpTabnew" },
759768
{ "<C-g>gv", "<cmd>GpVnew<cr>", desc = "GpVnew" },
760769
{ "<C-g>n", "<cmd>GpNextAgent<cr>", desc = "Next Agent" },
770+
{ "<C-g>j", "<cmd>GpSelectAgent<cr>", desc = "Select Agent" },
761771
{ "<C-g>r", "<cmd>GpRewrite<cr>", desc = "Inline Rewrite" },
762772
{ "<C-g>s", "<cmd>GpStop<cr>", desc = "GpStop" },
763773
{ "<C-g>t", "<cmd>GpChatToggle<cr>", desc = "Toggle Chat" },
@@ -793,6 +803,7 @@ Or go more fancy by using which-key.nvim
793803
{ "<C-g>gt", "<cmd>GpTabnew<cr>", desc = "GpTabnew" },
794804
{ "<C-g>gv", "<cmd>GpVnew<cr>", desc = "GpVnew" },
795805
{ "<C-g>n", "<cmd>GpNextAgent<cr>", desc = "Next Agent" },
806+
{ "<C-g>j", "<cmd>GpSelectAgent<cr>", desc = "Select Agent" },
796807
{ "<C-g>r", "<cmd>GpRewrite<cr>", desc = "Inline Rewrite" },
797808
{ "<C-g>s", "<cmd>GpStop<cr>", desc = "GpStop" },
798809
{ "<C-g>t", "<cmd>GpChatToggle<cr>", desc = "Toggle Chat" },

lua/gp/init.lua

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1546,6 +1546,58 @@ M.cmd.NextAgent = function()
15461546
set_agent(agent_list[1])
15471547
end
15481548

1549+
M.cmd.SelectAgent = function()
1550+
local buf = vim.api.nvim_get_current_buf()
1551+
local file_name = vim.api.nvim_buf_get_name(buf)
1552+
local is_chat = M.not_chat(buf, file_name) == nil
1553+
local current_agent, agent_list
1554+
1555+
if is_chat then
1556+
current_agent = M._state.chat_agent
1557+
agent_list = M._chat_agents
1558+
else
1559+
current_agent = M._state.command_agent
1560+
agent_list = M._command_agents
1561+
end
1562+
1563+
if #agent_list == 0 then
1564+
M.logger.warning("No agents available")
1565+
return
1566+
end
1567+
1568+
-- Create options with current agent highlighted
1569+
local options = {}
1570+
for _, agent_name in ipairs(agent_list) do
1571+
if agent_name == current_agent then
1572+
table.insert(options, agent_name .. " (current)")
1573+
else
1574+
table.insert(options, agent_name)
1575+
end
1576+
end
1577+
1578+
vim.ui.select(options, {
1579+
prompt = is_chat and "Select chat agent:" or "Select command agent:",
1580+
format_item = function(item)
1581+
return item
1582+
end,
1583+
}, function(choice)
1584+
if not choice then
1585+
return
1586+
end
1587+
1588+
-- Remove " (current)" suffix if present
1589+
local agent_name = choice:gsub(" %(current%)$", "")
1590+
1591+
if is_chat then
1592+
M.refresh_state({ chat_agent = agent_name })
1593+
M.logger.info("Chat agent: " .. M._state.chat_agent)
1594+
else
1595+
M.refresh_state({ command_agent = agent_name })
1596+
M.logger.info("Command agent: " .. M._state.command_agent)
1597+
end
1598+
end)
1599+
end
1600+
15491601
---@param name string | nil
15501602
---@return table | nil # { cmd_prefix, name, model, system_prompt, provider}
15511603
M.get_command_agent = function(name)

0 commit comments

Comments
 (0)