{ config, 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; [ arrterian.nix-env-selector editorconfig.editorconfig efoerster.texlab github.vscode-pull-request-github gitlab.gitlab-workflow golang.go graphql.vscode-graphql 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 ms-vscode.cmake-tools pinage404.nix-extension-pack redhat.ansible redhat.java redhat.vscode-xml redhat.vscode-yaml rust-lang.rust streetsidesoftware.code-spell-checker streetsidesoftware.code-spell-checker-british-english streetsidesoftware.code-spell-checker-russian streetsidesoftware.code-spell-checker-scientific-terms sumneko.lua 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.visible = false; 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 = { external.linuxExec = if alacritty.enable then "${pkgs.alacritty}/bin/alacritty" else "${pkgs.xterm}/bin/xterm"; integrated = { inherit fontFamily fontSize; enableBell = true; }; }; update = { mode = "none"; showReleaseNotes = false; }; telemetry = { enableCrashReporter = false; enableTelemetry = false; }; security.workspace.trust.enabled = false; git.allowForcePush = true; vim = mkIf cfg.vim.enable rec { easymotion = true; easymotionMarkerFontFamily = fontFamily; easymotionMarkerFontSize = fontSize; leader = " "; useSystemClipboard = true; }; redhat.telemetry.enabled = false; }; }; }; }