{ 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.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 gitlab.gitlab-workflow 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-british-english streetsidesoftware.code-spell-checker-russian streetsidesoftware.code-spell-checker-scientific-terms tamasfe.even-better-toml task.vscode-task vscode-org-mode.org-mode ziglang.vscode-zig ] ++ optional cfg.vim.enable vscodevim.vim; userSettings = let font = config.fontScheme.monospaceFont; fontFamily = font.family; fontSize = font.size; in { editor = { inherit fontFamily fontSize; inlayHints = {inherit fontFamily fontSize;}; codeLens = false; cursorStyle = "block"; detectIndentation = true; minimap.enabled = false; renderWhitespace = "trailing"; rulers = [80 120]; smoothScrolling = false; tabCompletion = "on"; } // (let surround = 10; in { cursorSurroundingLines = surround; scrollBeyondLastColumn = surround; }); keyboard.dispatch = "keyCode"; diffEditor.codeLens = false; files = { autoSave = "off"; enableTrash = false; }; workbench = { activityBar.location = "hidden"; editor.highlightModifiedTabs = true; enableExperiments = false; settings.enableNaturalLanguageSearch = false; startupEditor = "none"; tips.enabled = false; tree.indent = 4; welcomePage = { walkthroughs.openOnInstall = false; preferReducedMotion = true; }; }; debug.console = {inherit fontFamily fontSize;}; scm = { inputFontFamily = fontFamily; inputFontSize = fontSize; }; extensions = { autoCheckUpdates = false; autoUpdate = false; ignoreRecommendations = true; }; terminal.integrated = { inherit fontFamily fontSize; 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 = { enableLanguageServer = true; serverPath = getExe pkgs.nil; }; 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; easymotionMarkerFontFamily = fontFamily; easymotionMarkerFontSize = fontSize; leader = " "; useSystemClipboard = true; }; zig.zls = { checkForUpdate = false; path = getExe' pkgs.zls "zls"; }; redhat.telemetry.enabled = false; }; }; nixpkgs.overlays = [inputs.vscode-extensions.overlays.default]; }; }