# Vim / Neovim ## AutoCompletion For C++, anything that can use an LSP like {code}`coc.nvim`, {code}`nvim-lspconfig`, or what not, should work as long as you generate a {ref}`compilation database ` and point to it. Additionally, [YouCompleteMe](https://github.com/ycm-core/YouCompleteMe/) works without the need of a C++ compilation database as long as you have run {code}`./mach build` or {code}`./mach configure`. Configuration for this lives in {searchfox}`.ycm_extra_conf <.ycm_extra_conf>` at the root of the repo. Rust auto-completion should work both with Rust's LSP {code}`rust-analyzer`. Make sure that the LSP is configured in a way that it detects the root of the tree as a workspace, not the crate you happen to be editing. For example, the default of {code}`nvim-lspconfig` is to search for the closest {code}`Cargo.toml` file, which is not what you want. You'd want something like: ``` root_dir = lspconfig.util.root_pattern(".git") ``` You also need to set some options to get full diagnostics: ``` "rust-analyzer.cargo.extraEnv": { "CARGO_TARGET_DIR": "/path/to/objdir" }, "rust-analyzer.vfs.extraIncludes": ["/path/to/objdir", "/optional/path/to/windows_rs_dir"], "rust-analyzer.check.overrideCommand": [ "/path/to/mach", "--log-no-times", "cargo", "check", "--all-crates", "--message-format-json" ], "rust-analyzer.cargo.buildScripts.overrideCommand": [ "/path/to/mach", "--log-no-times", "cargo", "check", "--all-crates", "--message-format-json" ], ``` The easiest way to make these work out of the box is using [codesettings.nvim](https://github.com/mrjones2014/codesettings.nvim), which automatically supports importing VSCode configuration files. {code}`./mach ide vscode --no-interactive` will then generate the right configuration for you. ## ESLint The easiest way to integrate ESLint with VIM is using the [Syntastic plugin](https://github.com/vim-syntastic/syntastic). {code}`mach eslint --setup` installs a specific ESLint version and some ESLint plugins into the repositories' {code}`node_modules`. You need something like this in your {code}`.vimrc` to run the checker automatically on save: ``` autocmd FileType javascript,html,xhtml let b:syntastic_checkers = ['javascript/eslint'] ``` You need to have {code}`eslint` in your {code}`PATH`, which you can get with {code}`npm install -g eslint`. You need at least version 6.0.0. You can also use something like [eslint_d](https://github.com/mantoni/eslint_d.js#editor-integration) which should also do that automatically: ``` let g:syntastic_javascript_eslint_exec = 'eslint_d' ```