this post was submitted on 13 Jul 2023
3 points (100.0% liked)

Neovim

496 readers
1 users here now

Neovim is a modal text editor forked off of Vim in 2014. Being modal means that you do not simply type text on screen, but the behavior and functionality of the editor changes entirely depending on the mode.

The most common and most used mode, the "normal mode" for Neovim is to essentially turn your keyboard in to hotkeys with which you can navigate and manipulate text. Several modes exist, but two other most common ones are "insert mode" where you type in text directly as if it was a traditional text editor, and "visual mode" where you select text.

Neovim seeks to enable further community participation in its development and to make drastic changes without turning it in to something that is "not Vim". Neovim also seeks to enable embedding the editor within GUI applications.

The Neovim logo by Jason Long is licensed under the Creative Commons Attribution 3.0 Unported License.

founded 3 years ago
MODERATORS
3
submitted 11 months ago* (last edited 11 months ago) by Agility0971 to c/[email protected]
 

I'm using NvChad and in ~/.config/nvim/lua/core/mappings.lua there is a keybinding for LSP code action:

  ["<leader>ca"] = {
    function()
      vim.lsp.buf.code_action()
      -- TODO: write buffer to file
    end,
    "LSP code action",
},

this keybinding applies the code action, but does not write to file. I want to write changes to file as soon as I've applied the code action.

How can I use the documentation at https://neovim.io/doc/ to find the correct function? I've tried looking for a write() function but I could not find anything I can call from lua.

top 5 comments
sorted by: hot top controversial new old
[–] [email protected] 1 points 11 months ago (1 children)

You can call commands and vim functions from lua. To write the current buffer you can: vim.cmd.write(). Vim functions can be called with vim.fn.

It is completely fine to use vim functiona and not just pure lua, afaik some vim functions are not ever gonna get a lua alternative cause there is no need.

[–] Agility0971 2 points 11 months ago (1 children)

Thanks for the function signature, but how do I find the documentation for it? Searching for vim.cmd.write() on the website does not return anything. Maybe it takes in optional arguments or returns some sort of error.

[–] [email protected] 3 points 11 months ago (1 children)

vim.cmd.<command> calls a command. So vim.cmd.write is effectively the same as :write, the arguments passed to the function are the same that the command would take. Check :h vim.cmd() and for a specific command, e.g. write, you can check :h :write.

[–] Agility0971 2 points 11 months ago* (last edited 11 months ago) (1 children)

Ok, I found it. list of all vim functions are here :h builtin-function-list and all commands are here: :h ex-cmd-index.

From using other programming languages, I'm always looking for a list of functions with a complete function signature, "gotcha" notes, when errors can occur and so on. But vim.cmd() does not mention anything about if the command that is being passed in will succeed or fail. Nor does it mention anything about a return value. :h :write mentions that a write might fail, but how could that be detected if it's being called as vim.cmd.write()?

[–] [email protected] 1 points 11 months ago

You can wrap the call in pcall, which is a lua builtin for catching errors, which would suppress the error and let you know if the command failed.

You could for example do:

local ok, res = pcall(vim.cmd.write)
if not ok
then
    vim.notify('write failed with: ' .. res)
end

There are both lua and vim functions for writing to files but I recommend to not use them in this scenario, they write to the file directly and dont trigger autocommands.

I understand your frustration with no consitent error reporting and clear api, but I guess that's the consequence of the entire history of vi and vim and trying to be backwards compatible.