{ config, inputs, lib, pkgs, ... }: with lib; let cfg = config.nixfiles.modules.vscode; in { options.nixfiles.modules.vscode = { enable = mkEnableOption "VSCode"; package = with pkgs; mkOption { type = types.enum [ vscodium vscode vscode-fhs ]; default = vscodium; description = "Which package to use as a VSCode implementation."; }; vim.enable = mkOption { type = types.bool; default = true; description = "Whether to enable Vim emulation."; }; }; config = mkIf cfg.enable { hm = { stylix.targets.vscode.enable = false; programs.vscode = with config.nixfiles; with modules; with profiles; { enable = true; inherit (cfg) package; extensions = with pkgs.open-vsx; [ editorconfig.editorconfig efoerster.texlab github.vscode-pull-request-github golang.go graphql.vscode-graphql graphql.vscode-graphql-execution graphql.vscode-graphql-syntax hashicorp.hcl hashicorp.terraform haskell.haskell jnoortheen.nix-ide kahole.magit mads-hartmann.bash-ide-vscode mkhl.direnv ms-kubernetes-tools.vscode-kubernetes-tools ms-python.python redhat.ansible redhat.vscode-xml redhat.vscode-yaml rust-lang.rust signageos.signageos-vscode-sops skellock.just streetsidesoftware.code-spell-checker streetsidesoftware.code-spell-checker-russian streetsidesoftware.code-spell-checker-scientific-terms tamasfe.even-better-toml task.vscode-task vscode-org-mode.org-mode ] ++ optional cfg.vim.enable vscodevim.vim; userSettings = { # Something tries to write this every startup. I can't be arsed to # figure out what, so I'll leave this like this. "accessibility.signals.terminalBell".sound = "on"; editor = { codeLens = false; cursorStyle = "block"; detectIndentation = true; minimap.enabled = false; renderWhitespace = "trailing"; rulers = [ 80 120 ]; smoothScrolling = false; tabCompletion = "on"; cursorSurroundingLines = 10; scrollBeyondLastColumn = 10; }; keyboard.dispatch = "keyCode"; diffEditor.codeLens = false; files = { autoSave = "off"; enableTrash = false; }; workbench = { activityBar.location = "hidden"; colorTheme = "Default Light Modern"; editor.highlightModifiedTabs = true; enableExperiments = false; settings.enableNaturalLanguageSearch = false; startupEditor = "none"; tips.enabled = false; tree.indent = 4; welcomePage = { walkthroughs.openOnInstall = false; preferReducedMotion = true; }; }; extensions = { autoCheckUpdates = false; autoUpdate = false; ignoreRecommendations = true; }; terminal.integrated = { enableBell = true; }; update = { mode = "none"; showReleaseNotes = false; }; telemetry = { enableCrashReporter = false; enableTelemetry = false; }; security.workspace.trust.enabled = false; # Extensions. ansible = { ansible = { useFullyQualifiedCollectionNames = true; reuseTerminal = true; }; validation.lint.path = getExe' pkgs.ansible-lint "ansible-lint"; }; bashIde.shellcheckPath = getExe' pkgs.shellcheck "shellcheck"; cSpell.language = "en-GB,en,ru"; direnv = { restart.automatic = true; }; magit = { forge-enabled = true; git-path = getExe config.hm.programs.git.package; }; git.openRepositoryInParentFolders = "always"; github = { branchProtection = true; gitProtocol = "ssh"; }; terraform = { languageServer.path = getExe' pkgs.terraform-ls "terraform-ls"; languageServer.terraform.path = getExe pkgs.opentofu; }; haskell = { formattingProvider = "ormolu"; serverExecutablePath = getExe' pkgs.haskell-language-server "haskell-language-server"; }; nix = { formatterPath = getExe pkgs.nixfmt; enableLanguageServer = true; serverPath = getExe pkgs.nixd; serverSettings.nixd.formatting.command = getExe pkgs.nixfmt; }; python = with pkgs.python311Packages; { experiments.optOutFrom = [ "All" ]; pipenvPath = getExe' pkgs.pipenv "pipenv"; poetryPath = getExe' pkgs.poetry "poetry"; formatting = { provider = "black"; autopep8Path = getExe' autopep8 "autopep8"; blackPath = getExe' black "black"; yapfPath = getExe' yapf "yapf"; }; linting = { enabled = true; banditPath = getExe' bandit "bandit"; flake8Path = getExe' flake8 "flake8"; mypyPath = getExe' mypy "mypy"; pycodestylePath = getExe' pycodestyle "pycodestyle"; pydocstylePath = getExe' pydocstyle "pydocstyle"; pylamaPath = getExe' pylama "pylama"; pylintPath = getExe' pylint "pylint"; }; testing = { pytestPath = getExe' pytest "pytest"; }; }; rust-client = { disableRustup = true; rustupPath = getExe' pkgs.rustup "rustup"; rustfmt_path = getExe pkgs.rustfmt; }; vim = mkIf cfg.vim.enable { easymotion = true; leader = " "; useSystemClipboard = true; }; redhat.telemetry.enabled = false; }; }; }; nixpkgs.overlays = [ inputs.vscode-extensions.overlays.default ]; }; }