Skip to content

Instantly share code, notes, and snippets.

@ironlungx
Last active December 24, 2024 01:15
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

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({})
		end,
	},
}

Setting up the project

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

$ cd path/to/the/project
$ curl https://gist.githubusercontent.com/ironlungx/a2b620de74f875c49c1d06999a8c41f8/raw/3f0d5d46c0d6369fc7e51e32487772ac194c27b1/script.sh | sh
$ 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:
      CompileFlags:                    
        Add:
          [
            # -mlong-calls,
            -DSSIZE_MAX,
            -DLWIP_NO_UNISTD_H=1,
            -Dssize_t=long,
            -D_SSIZE_T_DECLARED,
          ]
        Remove:
          [
            -fno-tree-switch-conversion,
            -mtext-section-literals,
            -mlongcalls,
            -fstrict-volatile-bitfields,
            -free,
            -fipa-pta,
          ]
    • .clang-tidy:
      Checks: '-*, -misc-definitions-in-headers' 
    • gen_compile_commands.py:
      import os
      Import("env")
      
      # include toolchain paths
      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

#! /usr/bin/env bash
echo 'CompileFlags:
Add:
[
# -mlong-calls,
-DSSIZE_MAX,
-DLWIP_NO_UNISTD_H=1,
-Dssize_t=long,
-D_SSIZE_T_DECLARED,
]
Remove:
[
-fno-tree-switch-conversion,
-mtext-section-literals,
-mlongcalls,
-fstrict-volatile-bitfields,
-free,
-fipa-pta,
]' > .clangd
echo "Checks: '-*, -misc-definitions-in-headers' " > .clangd-tidy
echo 'import os
Import("env")
# include toolchain paths
env.Replace(COMPILATIONDB_INCLUDE_TOOLCHAIN=True)
# override compilation DB path
env.Replace(COMPILATIONDB_PATH="compile_commands.json")' > gen_compile_commands.py
echo 'extra_scripts = pre:gen_compile_commands.py' >> platformio.ini
@LazyYuuki
Copy link

Hey, I just want to say thanks to you I manage to get my neovim C lsp to pick up the path to the file correctly. Given the fact that I also used clang on my Mac it make sense that I would probably need to configure a .clang file lol. That being said, I don't really understand what is happening here in all the setting script, so if you could add explanation line by line, that would be a really great addition for future users to learn more and contribute back to your solutions if there are errors that we might encounter. Once again, thanks for your efforts!

@diffusive0047
Copy link

I would also appreciate a short explanation, especially if I can copy and paste the scripts to use in my other existing projects, or if I need to create them for each project individually.

@tommasoclini
Copy link

Thank you so much, working straight out of the box for now.

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