How to Make a Menu in Neovim
In Neovim leader key pull up a menu, it is the which-key plugin. I saw many videos where people use a menu in Neovim. They just press the leader key and a menu pops up. I wanted to have that too. I wondered which component of Neovim is responsible for that. I found out that it is the which-key plugin: https://github.com/folke/which-key.nvim
Cases where a menu is useful in Neovim
Neovim has already a bunch of "commands". Why would I need a menu? Useful when you want to group a set of commands you often use together. Also helpful when the command name is hard to remember: use the leader key and a combo of keys to get to the command.
How to write a menu tree in Neovim configuration
I use code-ai.nvim plugin to call AI to write code for me. I have defined a bunch of commands in my configuration file.
{ "natixgroup/code-ai.nvim",
dependencies = 'nvim-lua/plenary.nvim',
opts = {
prompts = {
typescript_node_backend = {
command = 'AITypescriptNodeBackend',
instruction_tpl = 'Act as a Typescript software developer writing a Node.js backend application. Format the answer using Markdown.',
prompt_tpl= '${input}',
},
javascript_bare= {
command = 'AIJavascriptVanilla',
instruction_tpl = 'Act as a Vanilla Javascript developer writing a Javascript Web application. Format the answer using Markdown.',
prompt_tpl= '${input}',
},
javascript_firefox= {
command = 'AIJavascriptFirefox',
instruction_tpl = 'Act as a Javascript Firefox extension developer writing a Javascript Firefox extension. Format the answer using Markdown.',
prompt_tpl= '${input}',
},
javascript_react = {
command = 'AIJavascriptReact',
instruction_tpl = 'Act as a Javascript software developer writing a React application. Format the answer using Markdown.',
prompt_tpl= '${input}',
},
typescript_react = {
command = 'AITypescriptReact',
instruction_tpl = 'Act as a Typescript software developer writing a React application. Format the answer using Markdown.',
prompt_tpl= '${input}',
},
php_symfony = {
command = 'AIPHPSymfony',
instruction_tpl = 'Act as a PHP software developer using the Symfony framework. Format the answer using Markdown.',
prompt_tpl= '${input}',
},
}
As you see I have a bunch of commands. In reality, I have more than that. It becomes necessary to categorize them. I have created a menu tree in my configuration file.
if pcall(require, 'which-key') then
local wk = require("which-key")
wk.register({
a = {
name = "CodeAI",
b = { ":'<,'>AIBash<CR>", "Bash" },
l = { ":'<,'>AIBlogger<CR>", "Blogger" },
c = { ":'<,'>AILuaNeovimConfiguration<CR>", "Lua Neovim configuration" },
j = {
name = "JavaScript",
v = { ":'<,'>AIJavascriptVanilla<CR>", "Vanilla JS" },
f = { ":'<,'>AIJavascriptFirefox<CR>", "Firefox Extension" },
r = { ":'<,'>AIJavascriptReact<CR>", "React JS" },
},
t = {
name = "TypeScript",
n = { ":'<,'>AITypescriptNodeBackend<CR>", "Node.js Backend" },
r = { ":'<,'>AITypescriptReact<CR>", "React" },
e = { ":'<,'>AITypescriptEJS<CR>", "EJS Web App" },
},
p = {
name = "PHP",
b = { ":'<,'>AIPHPBare<CR>", "Bare PHP" },
s = { ":'<,'>AIPHPSymfony<CR>", "Symfony" },
},
d = { ":'<,'>AIDockerfile<CR>", "Dockerfile" },
y = {
name = "YAML",
k = { ":'<,'>AIYAMLKubernetesAdmin<CR>", "Kubernetes Admin" },
s = { ":'<,'>AIYAMLSymfonyConfiguration<CR>", "Symfony Config" },
},
n = {
name = "Neovim",
p = { ":'<,'>AILuaNeovimPlugin<CR>", "Plugin Development" },
c = { ":'<,'>AILuaNeovimConfiguration<CR>", "Configuration" },
},
a = {
name = "Asterisk",
v20 = { ":'<,'>AIAsterisk20<CR>", "Version 20" },
v18 = { ":'<,'>AIAsterisk18<CR>", "Version 18" },
},
}
}, { prefix = "<leader>", mode = "x" }) -- Ensure this is in visual mode
end