Skip to content

Instantly share code, notes, and snippets.

@ironlungx
Last active May 5, 2025 17:23
Show Gist options
  • Save ironlungx/a2b620de74f875c49c1d06999a8c41f8 to your computer and use it in GitHub Desktop.
Save ironlungx/a2b620de74f875c49c1d06999a8c41f8 to your computer and use it in GitHub Desktop.
PlatformIO with Neovim

Caution

I've moved this gist over to a template repository here. Everything here is unmaintained...

Extensions

Following are the extensions required for neovim:

I use lazy.nvim so, just add the following to your plugins table, or create a new file in lua/plugins/lsp.lua

return {
	{
		"williamboman/mason.nvim",
		config = function()
			require("mason").setup({})
		end,
	},
	{
		"williamboman/mason-lspconfig.nvim",
		config = function()
			require("mason-lspconfig").setup({
				ensure_installed = { "lua_ls", "clangd" },
			})
		end,
	},
	{
		"neovim/nvim-lspconfig",
		config = function()
			local lspconfig = require("lspconfig")
			lspconfig.lua_ls.setup({})
            		lspconfig.clangd.setup({}) -- Minimal setup
		end,
	},
}

For the LSP server setup (as recommended by @omani) this is what I use, it improves auto complete functionality

lspconfig.clangd.setup({
    on_attach = on_attach,
    capabilities = capabilities,
    cmd = {
      "clangd",
      "--background-index",
      "-j=12",
    },
})

Setting up the project

I've made a script to do all this for you:

$ cd path/to/the/project
$ curl -sSL https://gist.github.com/ironlungx/a2b620de74f875c49c1d06999a8c41f8/raw/script.sh | sh
$ rm compile_commands.json
$ pio run -t compiledb

BUT I DONT LIKE curl|sh:

  1. Initialize a project with pio init

  2. In the project root create the following files

    • .clangd: (thanks @omani for fixing and adding flags to the file)

      # clangd controls options for the LSP *server*
      CompileFlags:
        Add: [
          -DSSIZE_MAX,
          -DLWIP_NO_UNISTD_H=1,
          -Dssize_t=long,
          -D_SSIZE_T_DECLARED,
          -Wno-unknown-warning-option
        ]
        Remove: [
          -mlong-calls,
          -fno-tree-switch-conversion,
          -mtext-section-literals,
          -mlongcalls,
          -fstrict-volatile-bitfields,
          -free,
          -fipa-pta,
          -march=*,
          -mabi=*,
          -mcpu=*
        ]
      Diagnostics:
        Suppress: "pp_including_mainfile_in_preamble"
    • .clang-tidy: (thanks @omani for adding more flags!)

      Checks: '-*, -misc-definitions-in-headers' # Fixes some issue with header reinclusion	        
      IndentWidth: 2 # Only if you like 2, replace with 3/4/.. if you'd like        
    • gen_compile_commands.py:

      import os
      Import("env") # platformio specific stuff
      
      # include toolchain paths (i.e. to have stuff like the Arduino framework headers present in the compile commands)
      env.Replace(COMPILATIONDB_INCLUDE_TOOLCHAIN=True)
      
      # override compilation DB path
      env.Replace(COMPILATIONDB_PATH="compile_commands.json")
  3. Now add the following to your platformio.ini

    extra_scripts = pre:gen_compile_commands.py
  4. Now in your terminal run: pio run -t compiledb (Just delete the old compile_commands.json before executing this)

Hopefully this helped, I spent a lot of time figuring it out

#!/bin/sh
echo "This script is no longer maintained"
echo "Use this repo instead: https://github.com/ironlungx/nvim-pio"
@ironlungx
Copy link
Author

Thanks for the contribution, I was thinking about moving this from a gist to a template repository on github, so you can make PRs and stuff, let me know if you all would be interested.

I don't fully get what you (@omani) are trying to do with the gen_includes.py script... I guess it's more full proof?

@omani
Copy link

omani commented May 4, 2025

I don't fully get what you (@omani) are trying to do with the gen_includes.py script... I guess it's more full proof?

the env.Replace(COMPILATIONDB_INCLUDE_TOOLCHAIN=True) in gen_compile_commands.py isolates the scope (see warning when running pio run -t compiledb -v.

when scoped, it does not find eg. the espressif8266 framework (which is located in $HOME/.platformio/). hence why for example @samuelbles07 had to import them manually here #5470163(comment).

this script includes all paths needed to have neovim LSP work without any errors.

@ironlungx
Copy link
Author

Oh okay... Would you like to make a PR on my repository for this?

@omani
Copy link

omani commented May 5, 2025

Oh okay... Would you like to make a PR on my repository for this?

sure

@ironlungx
Copy link
Author

https://github.com/ironlungx/nvim-pio 🙃
thank you very much for contributing!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment