hrsh7th / cmp-cmdline

nvim-cmp source for vim's cmdline
MIT License
493 stars 42 forks source link

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

Open theSprog opened 2 months ago

theSprog commented 2 months ago

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:

theSprog commented 2 months ago

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

dhnam commented 2 months ago

+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'.

sybereal commented 1 week ago

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.