Skip to main content

Neovim Leader Menu

How to Make a Menu in Neovim

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
      
    

Popular posts from this blog

npm run build base-href

Using NPM to specify base-href When building an Angular application, people usually use "ng" and pass arguments to that invocation. Typically, when wanting to hard code "base-href" in "index.html", one will issue: ng build --base-href='https://ngx.rktmb.org/foo' I used to build my angular apps through Bamboo or Jenkins and they have a "npm" plugin. I got the habit to build the application with "npm run build" before deploying it. But the development team once asked me to set the "--base-href='https://ngx.rktmb.org/foo'" parameter. npm run build --base-href='https://ngx.rktmb.org/foo did not set the base href in indext.html After looking for a while, I found https://github.com/angular/angular-cli/issues/13560 where it says: You need to use −− to pass arguments to npm scripts. This did the job! The command to issue is then: npm run build -- --base-href='https://ngx.rktmb.org/foo&

Jenkins invalid privatekey

Publish over SSH, Message "invalid privatekey:" With quite recent (June-July 2020) installations of Jenkins and OpenSSH, I have the following error message when using the "Deploy overs SSH" Jenkins plug-in and publishing artifacts to the target overs SSH: jenkins.plugins.publish_over.BapPublisherException: Failed to add SSH key. Message [invalid privatekey: [B@d8d395a] This problem seems to be referenced here: https://issues.jenkins-ci.org/browse/JENKINS-57495 Just regenerate a key with the right parameters To solve it: ssh-keygen -t rsa -b 4096 Or ssh-keygen -t rsa -b 4096 -m PEM

AzureCLI Custom Python

Installing Azure CLI on Archlinux When trying to install Azure CLI on Archlinux, I follow the documentation, in the "script" tab , and it leads to the following errors: [mihamina@arch-00 ~]$ curl -L https://aka.ms/InstallAzureCli | bash [...] Running install script. -- Verifying Python version. -- Python version 3.11.3 okay. [...] -- Executing: ['/usr/bin/python3', 'virtualenv.py', '--python', '/usr/bin/python3', '/home/mihamina/lib/azure-cli'] /tmp/tmpn0w4l6w9/virtualenv-16.7.11/virtualenv.py:24: DeprecationWarning: The distutils package is deprecated and slated for removal in Python 3.12. Use setuptools or check PEP 632 for potential alternatives import distutils.spawn /tmp/tmpn0w4l6w9/virtualenv-16.7.11/virtualenv.py:25: DeprecationWarning: The distutils.sysconfig module is deprecated, use sysconfig instead import distutils.sysconfig Already using interpreter /u