Editors

Editors

Multi-editor setup supporting VS Code family, Neovim, Emacs, JetBrains, Zed, and Positron.


Architecture

Module Layout

modules/editors/
  default.nix       Shared options, common extensions, common settings
  vscode.nix        Visual Studio Code
  cursor.nix        Cursor AI Editor (VS Code fork)
  kiro.nix          Kiro IDE (VS Code fork, AWS)
  antigravity.nix   Antigravity (VS Code fork)
  vim.nix           Neovim
  emacs.nix         Emacs + Doom Emacs
  jetbrains.nix     JetBrains IDE family
  positron.nix      Positron (data science)
  zed.nix           Zed Editor

VS Code Family Extension Sharing

VS Code, Cursor, Kiro, and Antigravity share a single extension list via modules.editors.vscode.commonExtensions defined in default.nix. Each editor only adds its own unique extensions on top (if any). This eliminates 4x duplication.

default.nix  ──►  commonExtensions  ──┬──► vscode.nix       (uses directly)
                                       ├──► cursor.nix       (uses directly)
                                       ├──► kiro.nix         (uses directly)
                                       └──► antigravity.nix  (uses directly)

Settings are similarly shared via modules.editors.vscode.commonSettings.


Extension Categories

AI Coding Agents

ExtensionEditorDescription
anthropic.claude-codeVS Code familyClaude Code by Anthropic
openai.chatgptVS Code familyChatGPT by OpenAI
google.geminicodeassistVS Code familyGemini Code Assist
google.colabVS Code familyGoogle Colab integration
qwenlm.qwen-code-vscode-ide-companionVS Code familyQwen Code IDE companion
copilot-lua + copilot-cmpNeovimGitHub Copilot (via astrocommunity)

Programming Languages

LanguageVS Code ExtensionNeovim LSPNeovim Formatter
Pythonms-python.python, ms-python.vscode-pylancepyright, ruffisort, black
Gogolang.gogoplsgofmt, goimports
Rustrust-lang.rust-analyzerrust_analyzerrustfmt
C/C++ms-vscode.cpptoolsclangd
TypeScript/JSesbenp.prettier-vscode, dbaeumer.vscode-eslintts_ls, eslintprettierd
Javavscjava.vscode-java-packjdtlsgoogle-java-format
Kotlinfwcd.kotlinkotlin_language_serverktfmt
Rubyshopify.ruby-lspruby_lsprubocop
PHPbmewburn.vscode-intelephense-client
Luasumneko.lualua_lsstylua
Zigziglang.vscode-zigzls
Haskellhaskell.haskellhls
OCamlocamllabs.ocaml-platformocamllsp
Scalascalameta.metals
Clojurebetterthantomorrow.calva
Elixirelixir-tools.elixir-tools
Dart/Flutterdart-code.dart-code, dart-code.flutter
C#/.NETms-dotnettools.csdevkit
Nixjnoortheen.nix-ide, kamadorueda.alejandranixdalejandra
Janetjanet-lang.vscode-janet
Juliajulialang.language-julia
PowerShellms-vscode.powershell

Bioinformatics & Pipelines

ExtensionDescription
snakemake.snakemake-langSnakemake workflow language support
tfehlmann.snakefmtSnakemake formatter
nextflow.nextflowNextflow DSL support

File associations (in commonSettings):

  • *.smk, *.snakefile, Snakefile → Python (syntax highlighting via treesitter)
  • *.nf, nextflow.config → Groovy

Neovim filetype detection (in config/nvim/lua/plugins/languages.lua):

filetype = {
  extension = { smk = "python", snakefile = "python", nf = "groovy" },
  filename = { ["Snakefile"] = "python", ["nextflow.config"] = "groovy" },
},

Data Formats & Config

ExtensionLanguage
tamasfe.even-better-tomlTOML
redhat.vscode-xmlXML
redhat.vscode-yamlYAML
graphql.vscode-graphqlGraphQL
hashicorp.terraformHCL/Terraform
mechatroner.rainbow-csvCSV/TSV

DevOps & Infrastructure

ExtensionTool
ms-azuretools.vscode-dockerDocker + Podman
ms-kubernetes-tools.vscode-kubernetes-toolsKubernetes
tim-koehler.helm-intellisenseHelm charts
exiasr.hadolintDockerfile linting
github.vscode-github-actionsGitHub Actions CI/CD

Database

ExtensionDescription
mttools.sqltoolsSQL tools framework
cweijan.vscode-postgresql-client2PostgreSQL client

Version Control & Code Review

ExtensionDescription
eamodio.gitlensGit lens (shared across all VS Code family)
github.vscode-pull-request-githubGitHub PR integration
octo-nvimGitHub integration for Neovim
gitsigns-nvimGit signs for Neovim

Debugging

EditorDebug Adapters
VS Code familyvadimcn.vscode-lldb (Rust/C++), ms-python.debugpy (Python)
Neovimnvim-dap, nvim-dap-ui, nvim-dap-python, nvim-dap-go, delve

UI & Theme

ExtensionDescription
pkief.material-icon-themeFile icons
catppuccin.catppuccin-vscCatppuccin Mocha theme
usernamehw.errorlensInline error highlighting
vscodevim.vimVim keybindings

Neovim (vim.nix)

Architecture

AstroNvim v6 + lazy.nvim + Nix-provided LSP tools. See docs/neovim.md for the complete developer guide.

Nix provides:     neovim (bare) + 50+ LSP/formatter/linter packages
Config link:      config/nvim/ → ~/.config/nvim/ (home.configFile, recursive symlink)
Plugin manager:   lazy.nvim (downloads to ~/.local/share/nvim/lazy/)
Framework:        AstroNvim v6 (keybindings, UI, LSP, completion)
Completion:       blink.cmp (Rust-based, replaces nvim-cmp)
Theme:            catppuccin-mocha (via astrocommunity)
File explorer:    neo-tree.nvim
Fuzzy finder:     snacks.nvim (replaces Telescope)

LSP Servers

Configured via astrolsp with native vim.lsp.config:

ServerLanguageSpecial Config
nixd + nilNixDual server coverage
basedpyrightPythonType checking
ruffPythonLinting + formatting
clangdC/C++UTF-8 offset encoding
rust_analyzerRust
goplsGo
bashlsBash, Zsh, ShExtended for zsh filetype
lua_lsLuaNeovim runtime awareness
vtslsTypeScript/JS
yamllsYAML
taploTOML
terraformlsHCL/Terraform
typos_lspAllTypo detection
zlsZig
jdtlsJava
kotlin_language_serverKotlin
ruby_lspRuby

Formatters & Linters (none-ls)

ToolLanguagesType
styluaLuaFormatter
prettierHTML/CSS/JS/TS/JSON/YAML/XML/MarkdownFormatter
shfmtBash, Zsh, ShFormatter (2-space indent)
alejandra + nixfmtNixFormatter
black + isortPythonFormatter
rustfmtRustFormatter
gofumptGoFormatter
golangci_lintGoLinter
implGoCode action (interface impl)
google-java-formatJavaFormatter
rubocopRubyFormatter + linter
sql-formatterSQLFormatter

DAP (Debug Adapter Protocol)

  • nvim-dap + nvim-dap-ui + nvim-dap-virtual-text
  • nvim-dap-python — Python debugging (debugpy)
  • nvim-dap-go — Go debugging (delve)
  • Keybindings: F5 continue, F10 step over, F11 step into, F12 step out, <Space>b breakpoint

Keybindings (Custom)

KeyAction
<Space><Space>Find files (snacks.nvim)
<Space>fwLive grep (snacks.nvim)
<Space>*Grep word under cursor
<Space>fbBuffers
<Space>xxToggle diagnostics (Trouble)
<Space>eToggle neo-tree (git status)
<Space>oFocus neo-tree
Tab / Shift+TabNext/prev buffer
gfOpen/create file under cursor
gdGo to definition
gDGo to declaration
KHover documentation
giGo to implementation
grReferences
<Space>rnRename symbol
<Space>caCode action
Ctrl+kSignature help

Fake HOME Jailing

All VS Code family editors and JetBrains IDEs use wrapFakeHome or mkWrapper to set HOME to ~/.local/user. This isolates editor state from the real home directory.

  • VS Code: HOME="$XDG_FAKE_HOME"
  • Cursor/Kiro/Antigravity: HOME=${config.home.fakeDir}
  • JetBrains: wrapFakeHome per IDE binary
  • Positron: mkWrapper with HOME=fakeDir

Remote SSH servers are configured to install to ~/.local/user/.vscode-server.


Adding New Extensions

To VS Code family editors

Add to modules/editors/default.nix under commonExtensions:

  • Nixpkgs extensions: add to the with pkgs.vscode-extensions; [...] list
  • Marketplace extensions: add to the with vscodeExtensionsPkgs.vscode-marketplace; [...] list

To Neovim

  1. Add a Lua file in config/nvim/lua/plugins/ with the plugin spec (lazy.nvim format)
  2. If it needs an LSP server, add the Nix package to nvim-lsp-packages in vim.nix
  3. Reopen Neovim — lazy.nvim auto-installs the plugin
  4. Commit the updated lazy-lock.json

ModuleRelationship
modules/dev/*.nixLanguage toolchains (compilers, runtimes, package managers)
modules/themes/apps.nixApp theming (does not cover editors directly)
modules/themes/default.nixFont definitions (vscodeFamily, vscodeTerminalFamily)
modules/home.nixHome Manager bridge (home.file, home.configFile)
modules/persist.nixImpermanence persistence paths