.. _module-pw_ide-guide-vscode: ================== Visual Studio Code ================== .. pigweed-module-subpage:: :name: pw_ide .. toctree:: :maxdepth: 1 :hidden: code_intelligence extension_enforcement troubleshooting legacy development Pigweed provides rich and robust support for development in `Visual Studio Code `_, including: * High-quality C/C++ code intelligence for embedded systems projects using `clangd `_ integrated directly with your project's Bazel build graph * Bundled core Bazel tools, letting you get started immediately without the need to install global system dependencies * Interactive browsing, building, and running Bazel targets .. note:: Currently, this document only applies to :ref:`Bazel projects`. We're working on adding support for :ref:`bootstrap projects`. In the meantime, bootstrap projects can use the :ref:`command-line interface` with the :ref:`legacy support for Visual Studio Code`. --------------- Getting started --------------- .. _Pigweed extension: https://marketplace.visualstudio.com/items?itemName=pigweed.pigweed All you need to do is install the `Pigweed extension`_ from the extension marketplace. If you start your project from one of Pigweed's quickstart or showcase example projects, you will be prompted to install the extension as soon as you open the project. Once installed, the Pigweed extension will do a few things for you automatically when you open :ref:`Pigweed projects`: * The Bazel extension will discover all of the targets in your project * The Pigweed extension will generate `compilation databases `_ for the :ref:`target groups` in your project. You can now select a target group from the status bar item at the bottom of your window or by running the ``Pigweed: Select Code Analysis Target`` command. Once you select a target group, the ``clangd`` extension will be automatically configured to use the ``clang`` toolchain in the Bazel environment and the compilation database associated with the selected target group. What this gives you =================== Here's a non-exhaustive list of cool features you can now enjoy: * Code navigation, including routing through facades to the correct backend * Code completion, including correct class members and function signatures * Tooltips with docs, inferred types for ``auto``, inferred values for ``constexpr``, data type sizes, etc. * Compiler errors and warnings as you write your code * Code formatting via the standard ``Format ...`` commands, including Starlark files * Linting and debugging for Starlark files * A tree view of all Bazel targets, allowing you to build or run them directly ----------------- Code intelligence ----------------- Learn more about using and configuring code intelligence :ref:`here`. ---------------- Project settings ---------------- Pigweed manipulates some editor and ``clangd`` settings to support features like the ones described above. For example, when you select a code analysis target, Pigweed sets the ``clangd`` extensions settings in ``.vscode/settings.json`` to configure ``clangd`` to use the selected target. Likewise, when using the :ref:`feature to disable code intelligence for source files not in the target's build graph`, Pigweed will manipulate the ``.clangd`` `configuration file `_. These files shouldn't be committed to the project repository, because they contain state that is specific to what an individual developer is working on. Nonetheless, most projects will want to commit certain shared settings to their repository to help create a more consistent development environment. Pigweed provides a mechanism to achieve that through additional settings files. Visual Studio Code settings =========================== The ``.vscode/settings.json`` file should be excluded from source control. Instead, add your shared project settings to ``.vscode/settings.shared.json`` and commit *that* file to source control. The Pigweed extension watches the shared settings file and automatically applies those settings to you local settings file. So shared project settings can be committed to ``.vscode/settings.shared.json``, and your current editor state, as well as your personal configuration preferences, can be stored in ``.vscode/settings.json``. The automatic sync process will respect any settings you have in your personal settings file. In other words, if a conflicting setting appears in the shared settings file, the automatic sync will not override your personal setting. At some point, you may wish to *fully* synchronize with the shared settings, overriding any conflicting settings you may already have in your personal settings file. You can accomplish that by running the :ref:`settings sync command`. ``clangd`` settings =================== Additional configuration for ``clangd`` can be stored in ``.clangd.shared``, following the `YAML configuration format `_. The Pigweed extension watches this file and automatically applies its settings to a ``.clangd`` file that *should not* be committed to source control. That file will *also* be used to configure ``clangd`` in ways that are specific to your selected analysis target and the state of your code tree. -------- Commands -------- Access commands by opening the command palette :kbd:`Ctrl+Shift+P` (:kbd:`Cmd+Shift+P` on Mac). .. describe:: Pigweed: Check Extensions The Pigweed extension lets development teams maintain a consistent development environment for all members of the team by ensuring that the recommendations in ``extensions.json`` are enforced. Learn more at :ref:`extension enforcement`. .. describe:: Pigweed: File Bug Found a problem in the Pigweed Visual Studio Code extension, other Pigweed tools, or Pigweed itself? Add a bug to our bug tracker to help us fix it. .. _module-pw_ide-guide-vscode-commands-sync-settings: .. describe:: Pigweed: Sync Settings Pigweed automatically syncronizes shared Visual Studio Code settings from ``.vscode/settings.shared.json`` to ``.vscode/settings.json``, but in the case of conflicts, the automatic process will preserve the value in ``.vscode/settings.json``. If you want to do a full sync of the shared settings to your personal settings, including overriding conflicting values, run this command. .. _module-pw_ide-guide-vscode-commands-open-output-panel: .. describe:: Pigweed: Open Output Panel Opens the Pigweed output panel, which contains diagnostic output generated by the Pigweed extension. This is a good first place to look if things go wrong. .. _module-pw_ide-guide-vscode-commands-refresh-compile-commands: .. describe:: Pigweed: Refresh Compile Commands Manually trigger a refresh of the compilation databases used for C/C++ code intelligence. Normally, the databases are refreshed automatically when build files are changed, but if you have :ref:`automatic refreshing disabled` or need to refresh outside of the automatic cycle, this command will refresh manually. .. describe:: Pigweed: Refresh Compile Commands and Set Code Analysis Target This is the same as the :ref:`Pigweed: Refresh Compile Commands`, except that it also triggers :ref:`Pigweed: Select Code Analysis Target` after the refresh is complete. .. _module-pw_ide-guide-vscode-commands-select-target: .. describe:: Pigweed: Select Code Analysis Target Select the target group that ``clangd`` should use for code analysis. .. tip:: You might notice that the currently-selected code analysis target is stored in the ``pigweed.codeAnalysisTarget`` setting. If you edit this value manually, don't worry! The Pigweed extension will immediately do everything it would have done if you had run this command. .. describe:: Pigweed: Disable Inactive File Code Intelligence See :ref:`the associated setting`. .. describe:: Pigweed: Enable Inactive File Code Intelligence See :ref:`the associated setting`. .. describe:: Pigweed: Set Bazel Recommended Settings Configure Visual Studio Code to use Pigweed's recommended Bazel settings. Note that these settings are only applied to the *project* settings, so they don't affect any other project's settings, or your user settings. * Sets the Buildifier path to the version bundled with the Pigweed extension, enabling Starlark code intelligence * Enables Bazel CodeLens support, allowing you to build and run targets directly from Bazel files .. describe:: Pigweed: Set Bazelisk Path Pigweed recommends using `Bazelisk `_ instead of plain Bazel to ensure that the right version of Bazel is used. This command allows you to set the path to Bazelisk, selecting from versions installed on your system or the version bundled with the Pigweed extension. .. describe:: Pigweed: Activate Bazelisk in Terminal This will change the `$PATH` of your active integrated terminal to include the path to Bazelisk configured in your editor settings. This allows you to run Bazel actions via Visual Studio Code commands or via `bazelisk ...` invocations in the integrated terminal, while working in the same Bazel environment. --------------------- Configuration options --------------------- .. py:data:: pigweed.activateBazeliskInNewTerminals :type: boolean :value: true When enabled, the path to Bazelisk will be added to the integrated terminal when launched .. py:data:: pigweed.codeAnalysisTarget :type: string The build target to use for editor code intelligence .. warning:: You should only set this value by running the :ref:`Pigweed\: Select Code Analysis Target`. The command has other configuration side-effects that won't be triggered if you manually set the value in ``settings.json``. .. py:data:: pigweed.disableBazelSettingsRecommendation :type: boolean :value: false Disable reminders to use Pigweed's Bazel settings recommendations .. py:data:: pigweed.disableBazeliskCheck :type: boolean :value: false Disable the recommendation to use Bazelisk .. _module-pw_ide-guide-vscode-settings-disable-compile-commands-file-watcher: .. py:data:: pigweed.disableCompileCommandsFileWatcher :type: boolean :value: false Disable automatically refreshing compile commands .. _module-pw_ide-guide-vscode-settings-disable-inactive-file-code-intelligence: .. py:data:: pigweed.disableInactiveFileCodeIntelligence :type: boolean :value: true When you select a target for code analysis, some source files in the project may not appear in the compilation database for that target because they are not part of the build graph for the target. By default, ``clangd`` will attempt to provide code intelligence for those files anyway by inferring compile commands from similar files in the build graph, but this code intelligence is incorrect and meaningless, as the file won't actually be compiled for that target. Enabling this option will configure ``clangd`` to suppress all diagnostics for any source files that are *not* part of the build graph for the currently selected target. .. _module-pw_ide-guide-vscode-settings-enforce-extension-recommendations: .. py:data:: pigweed.enforceExtensionRecommendations :type: boolean :value: false Require installing and disabling extensions recommended in ``extensions.json`` .. _module-pw_ide-guide-vscode-settings-hide-inactive-file-indicators: .. py:data:: pigweed.hideInactiveFileIndicators :type: boolean :value: false When code intelligence is enabled for all files, hide indicators for inactive and orphaned files. Note that changing this setting requires you to reload Visual Studio Code to take effect. .. py:data:: pigweed.preserveBazelPath :type: boolean :value: false When enabled, this extension won't override the specified Bazel path under any circumstances. .. _module-pw_ide-guide-vscode-settings-project-root: .. py:data:: pigweed.projectRoot :type: string The root of the Pigweed project source directory .. _module-pw_ide-guide-vscode-settings-project-type: .. py:data:: pigweed.projectType :type: bootstrap or bazel The type of Pigweed project, either bootstrap or Bazel .. _module-pw_ide-guide-vscode-settings-refresh-compile-commands-target: .. py:data:: pigweed.refreshCompileCommandsTarget :type: string :value: //:refresh_compile_commands The Bazel target to run to refresh compile commands