warp-pipe/LSP_SETUP.md

3.7 KiB

LSP Setup for Warp Pipe

This project uses GCC 15 from Homebrew, which requires special configuration for clangd to find standard library headers.

Files Created

  1. compile_commands.json (symlink to build/compile_commands.json)

    • Tells clangd how files are compiled
  2. .clangd - Configuration file

    • Points clangd to the compilation database
  3. clangd-wrapper.sh - Wrapper script with --query-driver flag

    • Helps clangd extract system includes from GCC
  4. .envrc - Environment variables for LSP

    • Sets CLANGD_FLAGS to configure clangd globally

Using the LSP

Option 1: Use CLANGD_FLAGS Environment Variable (Easiest)

Set the environment variable in your shell before starting your editor:

export CLANGD_FLAGS="--query-driver=/home/linuxbrew/.linuxbrew/bin/g++"

Add this to your ~/.bashrc or ~/.zshrc to make it permanent.

Using direnv (Recommended for per-project setup):

  1. Install direnv: brew install direnv
  2. Copy .envrc.example to .envrc (or use the existing .envrc)
  3. Run direnv allow in the project directory
  4. The environment will be set automatically when you cd into the project

Neovim users: If you start Neovim from the shell with the env var set, clangd will automatically pick it up.

VS Code users: Add to your workspace settings (.vscode/settings.json):

{
  "terminal.integrated.env.linux": {
    "CLANGD_FLAGS": "--query-driver=/home/linuxbrew/.linuxbrew/bin/g++"
  }
}

Option 2: Use clangd-wrapper.sh

Configure your editor to use /var/home/joey/Projects/warppipe/clangd-wrapper.sh instead of clangd.

Neovim (nvim-lspconfig):

require('lspconfig').clangd.setup{
  cmd = { vim.fn.getcwd() .. '/clangd-wrapper.sh' }
}

VS Code (settings.json):

{
  "clangd.path": "/var/home/joey/Projects/warppipe/clangd-wrapper.sh"
}

Option 3: Pass --query-driver via Editor Config

Add to your editor's clangd configuration:

Neovim:

require('lspconfig').clangd.setup{
  cmd = { 'clangd', '--query-driver=/home/linuxbrew/.linuxbrew/bin/g++' }
}

VS Code (settings.json):

{
  "clangd.arguments": ["--query-driver=/home/linuxbrew/.linuxbrew/bin/g++"]
}

Option 4: Install llvm/clang++ from Homebrew

brew install llvm

Then rebuild with clang++ (requires libstdc++ setup).

Neovim with coc.nvim Setup

1. Install coc-clangd

In Neovim, run:

:CocInstall coc-clangd

2. Configure coc-clangd

Option A: Project-specific (Recommended)

A .vim/coc-settings.json file has been created in this project with the correct configuration. Just open Neovim in this directory and it will work automatically.

Option B: Global configuration

Edit ~/.config/nvim/coc-settings.json (or create it):

{
  "clangd.arguments": [
    "--background-index",
    "--clang-tidy",
    "--query-driver=/home/linuxbrew/.linuxbrew/bin/g++"
  ],
  "clangd.path": "/home/linuxbrew/.linuxbrew/bin/clangd"
}

Note: The global config will apply the --query-driver to all projects, which might cause issues for non-Homebrew projects. The project-specific config (Option A) is safer.

3. Restart coc

After configuration:

:CocRestart

Verifying LSP Works

After configuration, open any C++ file and check:

  • Autocomplete works
  • Go-to-definition works (F12/gd)
  • No errors on standard library includes (, , etc.)

Troubleshooting

If you still see "file not found" errors for standard headers:

  1. Ensure you're using the wrapper script
  2. Restart your LSP server
  3. Check that GCC 15 is still at the same path:
    ls -la /var/home/linuxbrew/.linuxbrew/Cellar/gcc/15.2.0/include/c++/15