I think it’s really important to do something nobody here has done so far, and that’s to separate the Arduino IDE (the desktop software) from the Arduino framework (the language and libraries), because they aren’t the indivisible monolith many people think they are.
In fact, one of the most common IDEs used for programming with the Arduino framework is PlatformIO in Visual Studio Code. This is particularly popular among advanced users, because the two Arduino IDEs (the original Java-based “Arduino 1.x” and the new, currently in beta “Arduino IDE” 2.0) are both just too dumbed-down for advanced use. (2.0 adds a lot, but it’s still nowhere near PlatformIO in VS Code.) There are other alternatives, too, like VisualMicro (a commercial Arduino extension for the “big” Visual Studio), the Arduino extension for VS Code, and emCode, another extension for VS Code (and the spiritual successor to embedXcode, the same author’s now discontinued extension for Xcode).
In PlatformIO, when you create a new project using the Arduino framework, it literally creates a C++ file, with the Arduino.h header already included. The only change from regular .ino files is needing to create function prototypes yourself. But you can also rename your .cpp file to .ino, and then you don’t need to add the header or prototypes. (IIRC, code auto-completion works better when set to .cpp.)
Other than features to speed up text editing (autocomplete, etc) thanks to VS Code’s infinitely better editor and autocomplete engine, PlatformIO also supports hardware debugging on a wide array of MCUs, including boards not supported by Arduino IDE 2.0 (which itself only supports debugging on a small handful of boards). The official ESP32 debugger is just $11 or so, while there is a wide array of inexpensive STM32 boards (Nucleo and Discovery) with built-in ST-Link debuggers, which perform better than the ESP32 debugger. The last major advantage of PlatformIO is per-project, versioned library management, rather than Arduino’s global libraries. No more breaking one project when you update another project’s libraries!
PlatformIO also supports other frameworks, including Mbed, ESP-IDF, STM32 CMSIS, and STM32 Cube.