Search code examples
vimluaneovim

Converting conditional vimscript mapping into lua (neovim) (submit <CR> in lua)


I am trying to convert the following conditional mapping from vimscript to lua:

:nnoremap <expr> <CR> ((&buftype is# "quickfix") ? "<CR>" : ":\:nohlsearch<cr>\n")

This mapping maps Enter to a :nohlsearch command, but only if we are not in the quickfix buffer. There, you need the Enter for selecting lines.

The lua code that I came with is:

vim.keymap.set("n", "<CR>", function()
if vim.bo.buftype == "quickfix" then
  print("<CR>")
  vim.api.nvim_input("<CR>")
else
  print("nohlsearch")
  vim.cmd(":nohlsearch")
end
end, {desc = "call :nohlsearch to disable highlighting (but only if in file editing)"} )

The branching, the vim.cmd, and the print() parts work as expected, but the vim.api.nvim_input("<CR>") part doesn't work (in quickfix I can't use Enter to select a line). It's not equivalent to the <CR> in the vimscript mapping.

Also, there has to be a more idiomatic way to write this mapping.

I started this conversion because I need to make the condition more complex.


Solution

  • You need to check the doc of vim.keymap.set more thoroughly (see :h vim.keymap.set). You are doing it wrong and missing some parameters. Here is what is working (tested in nvim 0.7.2):

    vim.keymap.set('n', '<CR>', function()
      if vim.o.buftype == 'quickfix' then
        return "<CR>"
      else
        return ":nohlsearch<CR>"
      end
    end, {expr = true, replace_keycodes = true})
    

    You can just return those key maps in the lua code, but you are missing the {expr = true, replace_keycodes = true} part.

    If you haven't check nvim lua guide, read it through and make sure you understand all of it. You will understand nvim better than most users.