cmp-cmdline icon indicating copy to clipboard operation
cmp-cmdline copied to clipboard

cmp-cmdline causes Neovim to freeze when using ! in command mode

Open theSprog opened this issue 2 years ago • 9 comments

I encountered an issue described in title with the cmp-cmdline plugin when using Neovim. The problem occurs when I attempt to execute a shell command using ! in command mode.

I have tried disabling the cmp-cmdline plugin, and the issue disappears when the plugin is disabled. This leads me to believe that the problem lies within the cmp-cmdline plugin.

Steps to reproduce:

  1. Install and configure the cmp-cmdline plugin in Neovim.

  2. Enter command mode by pressing :.

  3. Type r followed by a space.

  4. Type ! to indicate a shell command.

  5. Attempt to type the shell command (e.g., ls). that I want to type is

    r !ls
    

Expected behavior: Neovim should allow me to type the shell command without any freezing or long processing times. The command should be executed immediately when I press Enter.

Actual behavior: After typing !, Neovim freezes and becomes unresponsive. It appears to be stuck in a long processing logic. After waiting for a few minutes, Neovim eventually reads the contents of the ls command, but the freezing and long processing time are unacceptable.

Additional information:

  • Neovim version: 0.9.5

  • cmp-cmdline version: These is no release published in the cmp-cmdline and I’m using lazy.nvim to install it

  • Operating system: WSL + arch

  • options:

    cmp.setup.cmdline(":", {
            mapping = cmp.mapping.preset.cmdline(),
            sources = cmp.config.sources({
                    { name = "path" },
                }, {
                    {
                        name = "cmdline",
                        option = {
                            ignore_cmds = { "Man", "!" },
                        },
                    },
                }),
        })
    

theSprog avatar Apr 23 '24 07:04 theSprog

I checked the source code and I don't know if there is a problem here.

  if vim.tbl_contains(option.ignore_cmds, parsed.cmd) then
    return {}
  end

  -- Cleanup modifiers.
  -- We can just remove modifiers because modifiers is always separated by space.
  if arglead ~= cmdline then
    while true do
      local s, e = MODIFIER_REGEX:match_str(cmdline)
      if s == nil then
        break
      end
      cmdline = string.sub(cmdline, e + 1)
    end
    

Here vim.tbl_contains(option.ignore_cmds, parsed.cmd) does not seem to filter out strings like 'r !ls', so it is not stopped by return {}, and there is a while true after it, so neovim seems to be stuck

theSprog avatar Apr 23 '24 07:04 theSprog

+1 for this. This is why ! is ignored by default (as it takes really long time) I believe.

#109 (I opened the issue, btw) can be handeled here, as it is caused by same '! is not ignored by cmp-cmdline when it is not follows : directly'.

dhnam avatar Apr 23 '24 14:04 dhnam

I believe I have run into a similar issue.

I added terminal to the list of ignored commands for the same reason as ! is there, because trying to complete the 11k+ executables on my PATH (according to fzf) would freeze Neovim for over a minute, if not more.

However, I noticed that, when I chain commands using |, the ignore does not seem to apply. This is unfortunate, as I often do :split | terminal run-something to start a process in a new terminal split.

For now, I'll see if I can work around this by adding a custom command that wraps this split | terminal workflow and then put that on my ignore list.

sybereal avatar Jun 28 '24 09:06 sybereal

I have the same issue with :w ! and :r !

mau-mauricelim avatar Aug 15 '24 10:08 mau-mauricelim