Мінімальні вимоги (must-have)

Перевір, що виконано:

idf.py set-target esp32s3
idf.py reconfigure
idf.py build

Після цього ОБОВʼЯЗКОВО має зʼявитися файл: build/compile_commands.json

clangd НЕ шукає compile_commands автоматично, якщо ти відкрив vim не з кореня. в корені проекту створити симлінк:

$ ln -s build/compile_commands.json compile_commands.json

👉 Саме він — джерело істини для clangd

Налаштування clangd у vim (через coc)

КРОК 1. Знайди xtensa-gcc

$ which xtensa-esp32s3-elf-gcc

Типово:

~/.espressif/tools/xtensa-esp32s3-elf/bin/xtensa-esp32s3-elf-gcc

КРОК 2. Додай .clangd у корінь проєкту

Саме так, файл .clangd, без розширення.

CompileFlags:
  # Дозволяє clangd використовувати базу даних компіляції з build/
  CompilationDatabase: "."
  Add: [
    - --target=xtensa-esp32s3-elf
    # Важливо: вказуємо шлях до інклюдів інструментарію espressif
    - -I/home/archpi/.espressif/tools/xtensa-esp32s3-elf/esp-12.2.0_20230208/xtensa-esp32s3-elf/xtensa-esp32s3-elf/include,
    - -I/home/archpi/.espressif/tools/xtensa-esp32s3-elf/esp-12.2.0_20230208/xtensa-esp32s3-elf/lib/gcc/xtensa-esp32s3-elf/12.2.0/include,
    "--driver-mode=gcc"
  ]
  Remove: [-m*, -f*]

Index:
  Background: Build

Шляхи інклудів можна знай ти, наприклад так:

$ xtensa-esp32s3-elf-gcc -v -E -x c -
Using built-in specs.
COLLECT_GCC=xtensa-esp32s3-elf-gcc
Target: xtensa-esp32s3-elf
Configured with: /builds/idf/crosstool-NG/.build/HOST-aarch64-linux-gnu/xtensa-esp32s3-elf/src/gcc/configure --build=x86_64-build_pc-linux-gnu --host=aarch64-host_unknown-linux-gnu --target=xtensa-esp32s3-elf --prefix=/builds/idf/crosstool-NG/builds/xtensa-esp32s3-elf --exec_prefix=/builds/idf/crosstool-NG/builds/xtensa-esp32s3-elf --with-local-prefix=/builds/idf/crosstool-NG/builds/xtensa-esp32s3-elf/xtensa-esp32s3-elf --with-headers=/builds/idf/crosstool-NG/builds/xtensa-esp32s3-elf/xtensa-esp32s3-elf/include --with-newlib --enable-threads=no --disable-shared --with-pkgversion='crosstool-NG esp-12.2.0_20230208' --disable-__cxa_atexit --enable-cxx-flags=-ffunction-sections --disable-libgomp --disable-libmudflap --disable-libmpx --disable-libssp --disable-libquadmath --disable-libquadmath-support --disable-libstdcxx-verbose --with-gmp=/builds/idf/crosstool-NG/.build/HOST-aarch64-linux-gnu/xtensa-esp32s3-elf/buildtools/complibs-host --with-mpfr=/builds/idf/crosstool-NG/.build/HOST-aarch64-linux-gnu/xtensa-esp32s3-elf/buildtools/complibs-host --with-mpc=/builds/idf/crosstool-NG/.build/HOST-aarch64-linux-gnu/xtensa-esp32s3-elf/buildtools/complibs-host --with-isl=/builds/idf/crosstool-NG/.build/HOST-aarch64-linux-gnu/xtensa-esp32s3-elf/buildtools/complibs-host --enable-lto --enable-target-optspace --without-long-double-128 --disable-nls --enable-multiarch --enable-languages=c,c++ --disable-libstdcxx-verbose --enable-threads=posix --enable-gcov-custom-rtio --enable-libstdcxx-time=yes
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 12.2.0 (crosstool-NG esp-12.2.0_20230208) 
COLLECT_GCC_OPTIONS='-v' '-E'
 /home/archpi/.espressif/tools/xtensa-esp32s3-elf/esp-12.2.0_20230208/xtensa-esp32s3-elf/bin/../libexec/gcc/xtensa-esp32s3-elf/12.2.0/cc1 -E -quiet -v -iprefix /home/archpi/.espressif/tools/xtensa-esp32s3-elf/esp-12.2.0_20230208/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/12.2.0/ - -dumpbase -
ignoring duplicate directory "/home/archpi/.espressif/tools/xtensa-esp32s3-elf/esp-12.2.0_20230208/xtensa-esp32s3-elf/bin/../lib/gcc/../../lib/gcc/xtensa-esp32s3-elf/12.2.0/include"
ignoring duplicate directory "/home/archpi/.espressif/tools/xtensa-esp32s3-elf/esp-12.2.0_20230208/xtensa-esp32s3-elf/bin/../lib/gcc/../../lib/gcc/xtensa-esp32s3-elf/12.2.0/include-fixed"
ignoring duplicate directory "/home/archpi/.espressif/tools/xtensa-esp32s3-elf/esp-12.2.0_20230208/xtensa-esp32s3-elf/bin/../lib/gcc/../../lib/gcc/xtensa-esp32s3-elf/12.2.0/../../../../xtensa-esp32s3-elf/sys-include"
ignoring duplicate directory "/home/archpi/.espressif/tools/xtensa-esp32s3-elf/esp-12.2.0_20230208/xtensa-esp32s3-elf/bin/../lib/gcc/../../lib/gcc/xtensa-esp32s3-elf/12.2.0/../../../../xtensa-esp32s3-elf/include"
#include "..." search starts here:
#include <...> search starts here:
 /home/archpi/.espressif/tools/xtensa-esp32s3-elf/esp-12.2.0_20230208/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/12.2.0/include
 /home/archpi/.espressif/tools/xtensa-esp32s3-elf/esp-12.2.0_20230208/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/12.2.0/include-fixed
 /home/archpi/.espressif/tools/xtensa-esp32s3-elf/esp-12.2.0_20230208/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/12.2.0/../../../../xtensa-esp32s3-elf/sys-include
 /home/archpi/.espressif/tools/xtensa-esp32s3-elf/esp-12.2.0_20230208/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/12.2.0/../../../../xtensa-esp32s3-elf/include
End of search list.

... і шукаємо #include <...> search starts here:. Після цього йде список усіх шляхів, де компілятор шукає файли.

КРОК 3. Конфігурація vim

У coc-settings.json:

{
  "clangd.path": "/usr/lib/llvm18/bin/clangd",
  "clangd.arguments": [
    // ВИКОРИСТОВУЙТЕ ШЛЯХ, ЗНАЙДЕНИЙ КОМАНДОЮ 'which'
    "--query-driver=/home/archpi/.espressif/tools/**/bin/xtensa-esp32s3-elf-gcc*",

    "--background-index",
    "--compile-commands-dir=build",
    "--query-driver=/home/archpi/.espressif/tools/**/riscv32-esp-elf-gcc"
    "--clang-tidy",
    "--completion-style=detailed"
    // Залиште `--header-insertion=never` якщо вам так зручно
  ],
  "clangd.semanticHighlighting": true,
  "coc.preferences.formatOnSaveFiletypes": ["cpp", "c"]
}

Як скинути кеш і обновити настройки

  • rm -rf build/ sdkconfig build/compile_commands.json
  • Створи свіжий compile_commands.json:
    idf.py set-target esp32s3
    idf.py reconfigure
    ln -s build/compile_commands.json .
    • Закрити, та знову відкрити vim, або :CocRestart