diff --git a/hosts/copland.ulu.nix b/hosts/copland.ulu.nix index 189cd2f..5bb54c8 100644 --- a/hosts/copland.ulu.nix +++ b/hosts/copland.ulu.nix @@ -48,6 +48,14 @@ in config.flake.homeModules.home-zellij-keybinds config.flake.homeModules.home-zellij-layout-ide config.flake.homeModules.home-zellij-ide-command + config.flake.homeModules.home-vscode + config.flake.homeModules.home-vscode-extensions + config.flake.homeModules.home-vscode-helix + config.flake.homeModules.home-vscode-panels + config.flake.homeModules.home-vscode-jujutsu + config.flake.homeModules.home-vscode-languages + config.flake.homeModules.home-vscode-projects + config.flake.homeModules.home-vscode-spellcheck config.flake.homeModules.home-theme config.flake.homeModules.home-theme-kemuri config.flake.homeModules.home-theme-gtk @@ -57,6 +65,7 @@ in config.flake.homeModules.home-theme-zellij config.flake.homeModules.home-theme-nushell config.flake.homeModules.home-theme-discord + config.flake.homeModules.home-theme-vscode config.flake.homeModules.home-direnv config.flake.homeModules.home-jujutsu config.flake.homeModules.home-jujutsu-difftastic @@ -89,6 +98,13 @@ in home.username = "elars"; home.homeDirectory = "/home/elars"; home.stateVersion = "25.05"; + + # Projects/ ve Projects/Projects_XFS/ altındaki depolar + # maxDepthRecursion = 2 ile kapsanıyor; copland ayrı satır. + elars.vscode.projectRoots = [ + "/home/elars/Projects" + "/home/elars/copland" + ]; }; }; } @@ -144,8 +160,6 @@ in zramSwap = { enable = true; - # 100% double-counts against 16G of RAM; 50% leaves headroom for - # the page cache during builds. memoryPercent = 50; algorithm = "zstd"; priority = 100; diff --git a/modules/home/niri/desktop-niri-keybinds.ulu.nix b/modules/home/niri/desktop-niri-keybinds.ulu.nix index e243ef9..525a2f3 100644 --- a/modules/home/niri/desktop-niri-keybinds.ulu.nix +++ b/modules/home/niri/desktop-niri-keybinds.ulu.nix @@ -34,7 +34,7 @@ "Mod+Return".action.spawn = [ "ghostty" ]; "Mod+W".action.spawn = [ "helium" ]; "Mod+E".action.spawn = [ "dolphin" ]; - "Mod+Z".action.spawn = [ "code" ]; + "Mod+Z".action.spawn = [ "codium" ]; "Mod+Alt+V".action.spawn = [ "pavucontrol" ]; "Mod+Shift+V".action.spawn-sh = "noctalia msg panel-toggle clipboard"; "Mod+Shift+L".action.spawn-sh = "noctalia msg lock"; diff --git a/modules/home/theme/home-theme-vscode.ulu.nix b/modules/home/theme/home-theme-vscode.ulu.nix new file mode 100644 index 0000000..134edf9 --- /dev/null +++ b/modules/home/theme/home-theme-vscode.ulu.nix @@ -0,0 +1,517 @@ +{ ... }: +{ + flake.homeModules.home-theme-vscode = + { config, lib, ... }: + # auto-generated + let + p = config.elars.theme.palette.withHashtag; + vivid = 125; + toHex = + n: + let + digits = "0123456789abcdef"; + c = + if n < 0 then + 0 + else if n > 255 then + 255 + else + n; + in + builtins.substring (c / 16) 1 digits + builtins.substring (lib.mod c 16) 1 digits; + lift = + pct: hex: "#" + lib.concatMapStrings (c: toHex (c * pct / 100)) (config.elars.theme.hexToRgb hex); + + bg = p.base00; + bgAlt = p.base01; + bgSoft = p.base02; + gutter = p.base03; + gray = lift vivid p.base04; + fg = p.base05; + fgSoft = p.base06; + fgBright = p.base07; + red = lift vivid p.base08; + orange = lift vivid p.base09; + yellow = lift vivid p.base0A; + green = lift vivid p.base0B; + cyan = lift vivid p.base0C; + blue = lift vivid p.base0D; + magenta = lift vivid p.base0E; + brown = lift 175 p.base0F; + + none = "#00000000"; + + overlay = "${gutter}80"; + overlayStrong = "${gray}80"; + overlaySoft = "${bgSoft}80"; + + sel = "${blue}66"; + selSoft = "${blue}33"; + selDim = "${blue}26"; + find = "${yellow}4d"; + findSoft = "${yellow}26"; + word = "${gray}33"; + wordStrong = "${gray}4d"; + + rule = scopes: fg': { + scope = scopes; + settings.foreground = fg'; + }; + ruleStyled = scopes: fg': style: { + scope = scopes; + settings = { + foreground = fg'; + fontStyle = style; + }; + }; + in + { + programs.vscodium.profiles.default.userSettings = { + "workbench.colorTheme" = "Default Dark Modern"; + + "workbench.colorCustomizations" = { + foreground = fg; + descriptionForeground = gray; + disabledForeground = gutter; + errorForeground = red; + focusBorder = gutter; + contrastBorder = none; + contrastActiveBorder = none; + "widget.border" = bgSoft; + "widget.shadow" = none; + "selection.background" = bgSoft; + "icon.foreground" = fgSoft; + "sash.hoverBorder" = gutter; + "textLink.foreground" = cyan; + "textLink.activeForeground" = fgSoft; + "textPreformat.foreground" = green; + "toolbar.hoverBackground" = bgSoft; + + # editor — ui.background / ui.cursor / ui.selection / ui.linenr + "editor.background" = bg; + "editor.foreground" = fg; + "editorLineNumber.foreground" = gutter; + "editorLineNumber.activeForeground" = orange; + "editorCursor.foreground" = fgBright; + "editorCursor.background" = bg; + "editor.lineHighlightBackground" = bgAlt; + "editor.lineHighlightBorder" = none; + "editor.selectionBackground" = sel; + "editor.inactiveSelectionBackground" = selDim; + "editor.selectionHighlightBackground" = selSoft; + "editor.selectionHighlightBorder" = none; + "editor.wordHighlightBackground" = word; + "editor.wordHighlightStrongBackground" = wordStrong; + "editor.findMatchBackground" = find; + "editor.findMatchHighlightBackground" = findSoft; + "editor.findMatchBorder" = orange; + "editor.rangeHighlightBackground" = overlaySoft; + "editor.foldBackground" = overlaySoft; + "editorBracketMatch.background" = none; + "editorBracketMatch.border" = orange; + "editorIndentGuide.background1" = bgSoft; + "editorIndentGuide.activeBackground1" = gutter; + "editorRuler.foreground" = bgAlt; + "editorWhitespace.foreground" = bgSoft; + "editorInlayHint.foreground" = gray; + "editorInlayHint.background" = none; + "editorInlayHint.typeForeground" = gray; + "editorInlayHint.parameterForeground" = gray; + "editorCodeLens.foreground" = gray; + "editorLink.activeForeground" = cyan; + "editorOverviewRuler.border" = none; + "editorGhostText.foreground" = gutter; + "editorStickyScroll.background" = bg; + + # gutter / diff + "editorGutter.background" = bg; + "editorGutter.addedBackground" = green; + "editorGutter.deletedBackground" = red; + "editorGutter.modifiedBackground" = blue; + "editorGutter.foldingControlForeground" = gutter; + "diffEditor.insertedTextBackground" = "${green}1a"; + "diffEditor.removedTextBackground" = "${red}1a"; + "diffEditor.insertedLineBackground" = "${green}14"; + "diffEditor.removedLineBackground" = "${red}14"; + "diffEditor.border" = bgSoft; + + # diagnostics + "editorError.foreground" = red; + "editorWarning.foreground" = yellow; + "editorInfo.foreground" = blue; + "editorHint.foreground" = cyan; + + # chrome + "titleBar.activeBackground" = bg; + "titleBar.activeForeground" = fgSoft; + "titleBar.inactiveBackground" = bg; + "titleBar.inactiveForeground" = gray; + "titleBar.border" = none; + "sideBar.background" = bg; + "sideBar.foreground" = fgSoft; + "sideBar.border" = bgAlt; + "sideBarSectionHeader.background" = bg; + "sideBarSectionHeader.foreground" = gray; + "sideBarSectionHeader.border" = none; + "sideBarTitle.foreground" = gray; + "activityBar.background" = bg; + "activityBar.foreground" = fgSoft; + "activityBar.inactiveForeground" = gutter; + "activityBar.border" = none; + "activityBarBadge.background" = fgSoft; + "activityBarBadge.foreground" = bg; + "panel.background" = bg; + "panel.border" = bgAlt; + "panelTitle.activeForeground" = fg; + "panelTitle.inactiveForeground" = gray; + "panelTitle.activeBorder" = fgSoft; + "panelSection.border" = bgAlt; + "editorGroupHeader.tabsBackground" = bg; + "editorGroupHeader.tabsBorder" = bgAlt; + "editorGroupHeader.noTabsBackground" = bg; + "editorGroup.border" = bgAlt; + "editorPane.background" = bg; + + # tabs — ui.bufferline + "tab.activeBackground" = bgSoft; + "tab.activeForeground" = fg; + "tab.inactiveBackground" = bgAlt; + "tab.inactiveForeground" = gray; + "tab.unfocusedActiveBackground" = bgAlt; + "tab.unfocusedActiveForeground" = gray; + "tab.border" = bg; + "tab.activeBorder" = none; + "tab.activeBorderTop" = fgSoft; + "tab.unfocusedActiveBorderTop" = gutter; + "tab.hoverBackground" = bgSoft; + "tab.activeModifiedBorder" = orange; + "tab.inactiveModifiedBorder" = gutter; + + # statusline — ui.statusline + "statusBar.background" = bgSoft; + "statusBar.foreground" = fg; + "statusBar.border" = none; + "statusBar.noFolderBackground" = bgAlt; + "statusBar.noFolderForeground" = gray; + "statusBar.debuggingBackground" = orange; + "statusBar.debuggingForeground" = bg; + "statusBarItem.hoverBackground" = gutter; + "statusBarItem.activeBackground" = gutter; + "statusBarItem.prominentBackground" = gutter; + "statusBarItem.remoteBackground" = blue; + "statusBarItem.remoteForeground" = bg; + "statusBarItem.errorBackground" = red; + "statusBarItem.errorForeground" = bg; + "statusBarItem.warningBackground" = yellow; + "statusBarItem.warningForeground" = bg; + + # popups / pickers — ui.popup, ui.menu + "editorWidget.background" = bgAlt; + "editorWidget.foreground" = fg; + "editorWidget.border" = bgSoft; + "editorHoverWidget.background" = bgAlt; + "editorHoverWidget.border" = bgSoft; + "editorSuggestWidget.background" = bgAlt; + "editorSuggestWidget.border" = bgSoft; + "editorSuggestWidget.foreground" = fg; + "editorSuggestWidget.selectedBackground" = gutter; + "editorSuggestWidget.selectedForeground" = fgBright; + "editorSuggestWidget.highlightForeground" = orange; + "editorSuggestWidget.focusHighlightForeground" = orange; + "peekView.border" = bgSoft; + "peekViewEditor.background" = bgAlt; + "peekViewEditor.matchHighlightBackground" = find; + "peekViewResult.background" = bgAlt; + "peekViewResult.selectionBackground" = gutter; + "peekViewTitle.background" = bgAlt; + "quickInput.background" = bgAlt; + "quickInput.foreground" = fg; + "quickInputList.focusBackground" = gutter; + "quickInputList.focusForeground" = fgBright; + "quickInputTitle.background" = bgAlt; + "pickerGroup.border" = bgSoft; + "pickerGroup.foreground" = gray; + + "list.activeSelectionBackground" = bgSoft; + "list.activeSelectionForeground" = fg; + "list.inactiveSelectionBackground" = bgAlt; + "list.inactiveSelectionForeground" = fgSoft; + "list.hoverBackground" = bgAlt; + "list.focusBackground" = bgSoft; + "list.focusOutline" = none; + "list.highlightForeground" = orange; + "list.errorForeground" = red; + "list.warningForeground" = yellow; + "tree.indentGuidesStroke" = bgAlt; + + "menu.background" = bgAlt; + "menu.foreground" = fg; + "menu.selectionBackground" = gutter; + "menu.selectionForeground" = fgBright; + "menu.border" = bgSoft; + "menu.separatorBackground" = bgSoft; + "menubar.selectionBackground" = bgSoft; + + "input.background" = bgAlt; + "input.foreground" = fg; + "input.border" = bgSoft; + "input.placeholderForeground" = gray; + "inputOption.activeBorder" = fgSoft; + "inputOption.activeBackground" = bgSoft; + "inputValidation.errorBackground" = bgAlt; + "inputValidation.errorBorder" = red; + "inputValidation.warningBackground" = bgAlt; + "inputValidation.warningBorder" = yellow; + "inputValidation.infoBackground" = bgAlt; + "inputValidation.infoBorder" = blue; + "dropdown.background" = bgAlt; + "dropdown.foreground" = fg; + "dropdown.border" = bgSoft; + + "button.background" = gutter; + "button.foreground" = fg; + "button.hoverBackground" = gray; + "button.secondaryBackground" = bgSoft; + "button.secondaryForeground" = fgSoft; + "badge.background" = bgSoft; + "badge.foreground" = fgSoft; + "progressBar.background" = fgSoft; + + "scrollbar.shadow" = none; + "scrollbarSlider.background" = "${bgSoft}80"; + "scrollbarSlider.hoverBackground" = gutter; + "scrollbarSlider.activeBackground" = gray; + + "notifications.background" = bgAlt; + "notifications.foreground" = fg; + "notifications.border" = bgSoft; + "notificationCenterHeader.background" = bgAlt; + "notificationCenterHeader.foreground" = gray; + "notificationsErrorIcon.foreground" = red; + "notificationsWarningIcon.foreground" = yellow; + "notificationsInfoIcon.foreground" = blue; + + # scm decorations + "gitDecoration.addedResourceForeground" = green; + "gitDecoration.modifiedResourceForeground" = blue; + "gitDecoration.deletedResourceForeground" = red; + "gitDecoration.untrackedResourceForeground" = green; + "gitDecoration.ignoredResourceForeground" = gutter; + "gitDecoration.conflictingResourceForeground" = orange; + "gitDecoration.stageModifiedResourceForeground" = cyan; + + # terminal — same 16 as home-theme-ghostty + "terminal.background" = bg; + "terminal.foreground" = fg; + "terminal.selectionBackground" = bgSoft; + "terminal.border" = bgAlt; + "terminalCursor.foreground" = p.accent; + "terminalCursor.background" = bg; + "terminal.ansiBlack" = bg; + "terminal.ansiRed" = red; + "terminal.ansiGreen" = green; + "terminal.ansiYellow" = yellow; + "terminal.ansiBlue" = blue; + "terminal.ansiMagenta" = magenta; + "terminal.ansiCyan" = cyan; + "terminal.ansiWhite" = fg; + "terminal.ansiBrightBlack" = gutter; + "terminal.ansiBrightRed" = red; + "terminal.ansiBrightGreen" = green; + "terminal.ansiBrightYellow" = orange; + "terminal.ansiBrightBlue" = blue; + "terminal.ansiBrightMagenta" = magenta; + "terminal.ansiBrightCyan" = cyan; + "terminal.ansiBrightWhite" = fgBright; + + # dap — ui.debug + "debugToolBar.background" = bgAlt; + "debugIcon.breakpointForeground" = red; + "editor.stackFrameHighlightBackground" = "${orange}33"; + + "keybindingLabel.background" = bgSoft; + "keybindingLabel.foreground" = fgSoft; + "keybindingLabel.border" = bgSoft; + "keybindingLabel.bottomBorder" = bgSoft; + + "charts.red" = red; + "charts.orange" = orange; + "charts.yellow" = yellow; + "charts.green" = green; + "charts.blue" = blue; + "charts.purple" = magenta; + "charts.foreground" = fg; + "charts.lines" = bgSoft; + }; + + # syntax + "editor.tokenColorCustomizations" = { + comments = { + foreground = gray; + fontStyle = "italic"; + }; + textMateRules = [ + (ruleStyled [ "comment" "punctuation.definition.comment" ] gray "italic") + (rule [ "variable" "meta.definition.variable.name" "support.variable" ] fg) + (rule [ "variable.parameter" "meta.function.parameters" ] fgSoft) + (rule [ "variable.language" "variable.other.builtin" "keyword.other.this" ] red) + (rule [ + "variable.other.member" + "variable.other.property" + "meta.object-literal.key" + "support.type.property-name" + ] cyan) + (rule [ "constant" "constant.language" "constant.other" "constant.numeric" ] orange) + (rule [ "constant.character.escape" "constant.other.placeholder" ] magenta) + (rule [ "string" "string.quoted" "punctuation.definition.string" ] green) + (rule [ "string.regexp" "constant.regexp" ] cyan) + (rule [ + "entity.name.type" + "support.type" + "storage.type" + "entity.name.class" + "entity.other.inherited-class" + "support.type.primitive" + "storage.type.primitive" + "storage.type.built-in" + ] yellow) + (rule [ "entity.name.function.constructor" "meta.object.constructor" ] blue) + (rule [ "entity.name.function" "support.function" "meta.function-call" ] blue) + (rule [ "entity.name.function.macro" "support.function.macro" "meta.preprocessor.macro" ] magenta) + (rule [ "keyword" "keyword.control" "keyword.operator.new" "storage.modifier" ] magenta) + (rule [ "keyword.control.directive" "meta.preprocessor" "punctuation.definition.directive" ] brown) + (rule [ "keyword.operator" "storage.type.function.arrow" ] fgSoft) + (rule [ "punctuation" "punctuation.separator" "punctuation.terminator" "meta.delimiter" ] gray) + (rule [ + "punctuation.section" + "meta.brace" + "punctuation.definition.block" + "punctuation.definition.parameters" + ] fgSoft) + (rule [ "entity.name.label" "constant.other.label" ] magenta) + (rule [ "entity.name.namespace" "entity.name.scope-resolution" "support.module" ] cyan) + (rule [ "entity.other.attribute-name" "meta.attribute" "meta.decorator" ] brown) + (rule [ "entity.name.tag" "punctuation.definition.tag" ] blue) + (rule [ "invalid" "invalid.illegal" ] red) + (ruleStyled [ "invalid.deprecated" ] yellow "strikethrough") + (ruleStyled [ "markup.heading" "entity.name.section" ] orange "bold") + (rule [ "punctuation.definition.heading" ] brown) + { + scope = [ "markup.bold" ]; + settings.fontStyle = "bold"; + } + { + scope = [ "markup.italic" ]; + settings.fontStyle = "italic"; + } + { + scope = [ "markup.strikethrough" ]; + settings.fontStyle = "strikethrough"; + } + (ruleStyled [ "markup.underline.link" "string.other.link" ] cyan "underline") + (rule [ "markup.inline.raw" "markup.fenced_code" "markup.raw" ] green) + (rule [ "markup.list" "punctuation.definition.list.begin" ] magenta) + (ruleStyled [ "markup.quote" ] fgSoft "italic") + (rule [ "markup.inserted" "meta.diff.header.to-file" ] green) + (rule [ "markup.deleted" "meta.diff.header.from-file" ] red) + (rule [ "markup.changed" ] blue) + ]; + }; + + "editor.semanticTokenColorCustomizations" = { + enabled = true; + rules = { + comment = { + foreground = gray; + fontStyle = "italic"; + }; + variable = fg; + parameter = fgSoft; + property = cyan; + function = blue; + method = blue; + macro = magenta; + type = yellow; + struct = yellow; + class = yellow; + enum = yellow; + union = yellow; + interface = yellow; + typeParameter = yellow; + builtinType = yellow; + enumMember = orange; + namespace = cyan; + keyword = magenta; + selfKeyword = red; + string = green; + number = orange; + boolean = orange; + character = green; + operator = fgSoft; + lifetime = magenta; + label = magenta; + attribute = brown; + attributeBracket = brown; + "*.mutable".underline = true; + "*.unsafe" = red; + "*.deprecated".strikethrough = true; + unresolvedReference = { + foreground = red; + underline = true; + }; + }; + }; + + "helixKeymap.yankHighlightBackgroundColor" = yellow; + "better-comments.multilineComments" = true; + "better-comments.highlightPlainText" = false; + "better-comments.tags" = [ + { + tag = "!"; + color = red; + strikethrough = false; + underline = false; + backgroundColor = "transparent"; + bold = true; + italic = true; + } + { + tag = "?"; + color = cyan; + strikethrough = false; + underline = false; + backgroundColor = "transparent"; + bold = false; + italic = true; + } + { + tag = "todo"; + color = orange; + strikethrough = false; + underline = false; + backgroundColor = "transparent"; + bold = true; + italic = true; + } + { + tag = "*"; + color = green; + strikethrough = false; + underline = false; + backgroundColor = "transparent"; + bold = false; + italic = true; + } + { + tag = "//"; + color = gutter; + strikethrough = true; + underline = false; + backgroundColor = "transparent"; + bold = false; + italic = true; + } + ]; + }; + }; +} diff --git a/modules/home/vscode/home-vscode-extensions.ulu.nix b/modules/home/vscode/home-vscode-extensions.ulu.nix new file mode 100644 index 0000000..12eab55 --- /dev/null +++ b/modules/home/vscode/home-vscode-extensions.ulu.nix @@ -0,0 +1,91 @@ +{ ... }: +{ + flake.homeModules.home-vscode-extensions = + { pkgs, ... }: + let + vscode-helix = pkgs.vscode-utils.buildVscodeMarketplaceExtension { + mktplcRef = { + publisher = "jasew"; + name = "vscode-helix-emulation"; + version = "0.7.0"; + hash = "sha256-gYyIVnXG9Atmik0c1FsRKO2idFnufwl26nOiH3DYPLY="; + }; + meta.description = "Helix keybindings and commands for VS Code"; + }; + + symbols = pkgs.vscode-utils.buildVscodeMarketplaceExtension { + mktplcRef = { + publisher = "miguelsolorio"; + name = "symbols"; + version = "0.0.26"; + hash = "sha256-UrkFmwwqMUsCuwZN2/t8ueDQBZ1WEzTF9IqirmTAZZU="; + }; + meta.description = "Symbols icon theme for VS Code"; + }; + + open-remote-ssh = pkgs.vscode-utils.buildVscodeMarketplaceExtension { + mktplcRef = { + publisher = "jeanp413"; + name = "open-remote-ssh"; + version = "0.3.1"; + }; + + vsix = pkgs.fetchurl { + url = "https://open-vsx.org/api/jeanp413/open-remote-ssh/0.3.1/file/jeanp413.open-remote-ssh-0.3.1.vsix"; + hash = "sha256-xvFrIlq4aSXyvZ6Mxbox5hSXjM+hIPFQm99umeW+8T8="; + name = "jeanp413-open-remote-ssh.vsix"; + }; + meta.description = "Remote SSH for VSCodium / Open VSX builds"; + }; + + gutter-preview = pkgs.vscode-utils.buildVscodeMarketplaceExtension { + mktplcRef = { + publisher = "kisstkondoros"; + name = "vscode-gutter-preview"; + version = "0.32.2"; + hash = "sha256-JIr4UGuwy9Z5oH8D8elGMBGP8s40pYLCEZGmJAO5Ga0="; + }; + meta.description = "Image preview in the gutter"; + }; + in + { + programs.vscodium.profiles.default.extensions = [ + vscode-helix + symbols + open-remote-ssh + gutter-preview + ] + ++ (with pkgs.vscode-extensions; [ + + # nix + jnoortheen.nix-ide + + # rust + rust-lang.rust-analyzer + tamasfe.even-better-toml + vadimcn.vscode-lldb + + # c / c++ — + llvm-vs-code-extensions.vscode-clangd + + # python + ms-python.python + charliermarsh.ruff + + # ansible / yaml / shell + redhat.vscode-yaml + redhat.ansible + timonwong.shellcheck + + # workflow + mkhl.direnv + usernamehw.errorlens + editorconfig.editorconfig + alefragnani.bookmarks + aaron-bond.better-comments + + # agent + anthropic.claude-code + ]); + }; +} diff --git a/modules/home/vscode/home-vscode-helix.ulu.nix b/modules/home/vscode/home-vscode-helix.ulu.nix new file mode 100644 index 0000000..9ae0916 --- /dev/null +++ b/modules/home/vscode/home-vscode-helix.ulu.nix @@ -0,0 +1,113 @@ +{ ... }: +{ + flake.homeModules.home-vscode-helix = + { ... }: + # auto-generated + let + hx = "editorTextFocus && (extension.helixKeymap.normalMode || extension.helixKeymap.visualMode)"; + + bind = key: command: { + inherit key command; + when = hx; + }; + in + { + programs.vscodium.profiles.default = { + userSettings = { + "helixKeymap.toggleRelativeLineNumbers" = true; + "extensions.experimental.affinity"."jasew.vscode-helix-emulation" = 1; + }; + + keybindings = [ + # space: pickers + (bind "space f" "workbench.action.quickOpen") + (bind "space shift+f" "workbench.action.openRecent") + (bind "space b" "workbench.action.showAllEditors") + (bind "space j" "workbench.action.quickOpenPreviousRecentlyUsedEditor") + (bind "space s" "workbench.action.gotoSymbol") + (bind "space shift+s" "workbench.action.showAllSymbols") + (bind "space slash" "workbench.action.findInFiles") + (bind "space shift+/" "workbench.action.showCommands") + (bind "space e" "workbench.view.explorer") + + # space: lsp + (bind "space k" "editor.action.showHover") + (bind "space r" "editor.action.rename") + (bind "space a" "editor.action.quickFix") + (bind "space h" "editor.action.referenceSearch.trigger") + (bind "space d" "workbench.actions.view.problems") + (bind "space shift+d" "workbench.actions.view.problems") + (bind "space g" "workbench.view.debug") + + # space: clipboard + (bind "space y" "editor.action.clipboardCopyAction") + (bind "space p" "editor.action.clipboardPasteAction") + + # space: window mode — hand back to the extension + (bind "space w" "extension.helixKeymap.enterWindowMode") + + # space q / Q — :buffer-close / :quit + (bind "space q" "workbench.action.closeActiveEditor") + (bind "space shift+q" "workbench.action.closeWindow") + + # space u … — toggles + (bind "space u w" "editor.action.toggleWordWrap") + (bind "space u i" "editor.action.toggleInlayHints") + (bind "space u h" "editor.action.toggleRenderWhitespace") + (bind "space u d" "errorLens.toggle") + (bind "space u m" "editor.action.toggleMinimap") + (bind "space u s" "editor.action.toggleStickyScroll") + (bind "space u z" "workbench.action.toggleZenMode") + + # space l … — lsp. VS Code has no generic :lsp-restart; bouncing the + # extension host is the one command that restarts every server. + (bind "space l f" "editor.action.formatDocument") + (bind "space l l" "workbench.action.output.toggleOutput") + (bind "space l r" "workbench.action.restartExtensionHost") + + # buffers — C-tab / C-S-tab without the MRU picker + { + key = "ctrl+tab"; + command = "workbench.action.nextEditor"; + when = "!extension.helixKeymap.insertMode"; + } + { + key = "ctrl+shift+tab"; + command = "workbench.action.previousEditor"; + when = "!extension.helixKeymap.insertMode"; + } + + # escape returns to the buffer from any panel + { + key = "escape"; + command = "workbench.action.focusActiveEditorGroup"; + when = "sideBarFocus && !inputFocus"; + } + { + key = "escape"; + command = "workbench.action.closePanel"; + when = "panelFocus && !terminalFocus && !inputFocus"; + } + + # unbind VS Code defaults that fight modal editing + { + key = "ctrl+shift+k"; + command = "-editor.action.deleteLines"; + } + { + key = "ctrl+enter"; + command = "-editor.action.insertLineAfter"; + } + { + key = "ctrl+shift+enter"; + command = "-editor.action.insertLineBefore"; + } + { + key = "tab"; + command = "-acceptSelectedSuggestion"; + when = "suggestWidgetVisible"; + } + ]; + }; + }; +} diff --git a/modules/home/vscode/home-vscode-jujutsu.ulu.nix b/modules/home/vscode/home-vscode-jujutsu.ulu.nix new file mode 100644 index 0000000..c470e4e --- /dev/null +++ b/modules/home/vscode/home-vscode-jujutsu.ulu.nix @@ -0,0 +1,69 @@ +{ ... }: +{ + flake.homeModules.home-vscode-jujutsu = + { pkgs, ... }: + let + hx = "editorTextFocus && (extension.helixKeymap.normalMode || extension.helixKeymap.visualMode)"; + bind = key: command: { + inherit key command; + when = hx; + }; + bindTask = key: name: { + inherit key; + command = "workbench.action.tasks.runTask"; + args = name; + when = hx; + }; + in + { + programs.vscodium.profiles.default = { + extensions = [ pkgs.vscode-extensions.jjk.jjk ]; + userSettings = { + "jjk.jjPath" = "${pkgs.jujutsu}/bin/jj"; + "git.enabled" = false; # jj confilict + }; + keybindings = [ + (bind "space v s" "workbench.view.scm") + (bind "space v d" "jj.openDiffEditor") + (bind "space v n" "workbench.action.editor.nextChange") + (bind "space v p" "workbench.action.editor.previousChange") + (bind "space v c" "jj.new") # jj commit ≈ describe + new + (bind "space v e" "jj.describe") + (bind "space v f" "jj.gitFetch") + (bind "space v u" "jj.operationUndo") + (bind "space v m" "jj.showBookmarkMenu") + (bind "space v r" "jj.refresh") + (bindTask "space v v" "lazyjj") + (bindTask "space v g" "lazygit") + (bindTask "space v l" "jj log") + ]; + + userTasks = { + version = "2.0.0"; + tasks = + let + task = close: label: command: { + inherit label command; + type = "shell"; + presentation = { + inherit close; + reveal = "always"; + panel = "dedicated"; + clear = true; + echo = false; + showReuseMessage = false; + }; + problemMatcher = [ ]; + }; + tui = task true; + run = task false; + in + [ + (tui "lazyjj" "${pkgs.lazyjj}/bin/lazyjj") + (tui "lazygit" "${pkgs.lazygit}/bin/lazygit") + (run "jj log" "${pkgs.jujutsu}/bin/jj log") + ]; + }; + }; + }; +} diff --git a/modules/home/vscode/home-vscode-languages.ulu.nix b/modules/home/vscode/home-vscode-languages.ulu.nix new file mode 100644 index 0000000..e258101 --- /dev/null +++ b/modules/home/vscode/home-vscode-languages.ulu.nix @@ -0,0 +1,95 @@ +{ ... }: +{ + # auto-generated + flake.homeModules.home-vscode-languages = + { + config, + lib, + pkgs, + ... + }: + { + options.elars.vscode.flakePath = lib.mkOption { + type = lib.types.str; + default = "${config.home.homeDirectory}/copland"; + description = '' + Absolute path to this flake on disk, used by nixd to evaluate + NixOS / home-manager options for completion. Must be a real path, + not a store path — nixd re-evaluates it live. Checkout dizini + `copland` (GitHub deposunun adı `copnix`, aynı şey değil). + ''; + }; + + config.programs.vscodium.profiles.default.userSettings = { + # ── nix ───────────────────────────────────────────────────────────── + "[nix]" = { + "editor.defaultFormatter" = "jnoortheen.nix-ide"; + "editor.tabSize" = 2; + }; + "nix.enableLanguageServer" = true; + "nix.serverPath" = "${pkgs.nixd}/bin/nixd"; + "nix.formatterPath" = [ "${pkgs.nixfmt}/bin/nixfmt" ]; + "nix.serverSettings".nixd = { + formatting.command = [ "${pkgs.nixfmt}/bin/nixfmt" ]; + options = { + nixos.expr = ''(builtins.getFlake "${config.elars.vscode.flakePath}").nixosConfigurations.copland.options''; + home-manager.expr = ''(builtins.getFlake "${config.elars.vscode.flakePath}").nixosConfigurations.copland.options.home-manager.users.value.${config.home.username}''; + }; + }; + + # ── rust ──────────────────────────────────────────────────────────── + "[rust]"."editor.defaultFormatter" = "rust-lang.rust-analyzer"; + "rust-analyzer.check.command" = "clippy"; + "rust-analyzer.checkOnSave" = true; + "rust-analyzer.cargo.buildScripts.enable" = true; + "rust-analyzer.procMacro.enable" = true; + "rust-analyzer.inlayHints.parameterHints.enable" = true; + "rust-analyzer.inlayHints.typeHints.enable" = true; + "rust-analyzer.inlayHints.chainingHints.enable" = true; + "rust-analyzer.inlayHints.maxLength" = 30; # = inlay-hints-length-limit + "rust-analyzer.completion.callable.snippets" = "add_parentheses"; + "rust-analyzer.lens.enable" = false; + "rust-analyzer.imports.granularity.group" = "module"; + + # ── c / c++ — mesa, kernel (clangd reads compile_commands.json) ───── + "[c]"."editor.defaultFormatter" = "llvm-vs-code-extensions.vscode-clangd"; + "[cpp]"."editor.defaultFormatter" = "llvm-vs-code-extensions.vscode-clangd"; + "clangd.path" = "${pkgs.clang-tools}/bin/clangd"; + "clangd.arguments" = [ + "--background-index" + "--clang-tidy" + "--header-insertion=never" + "--completion-style=detailed" + "--pch-storage=memory" + "-j=4" + ]; + "clangd.onConfigChanged" = "restart"; + + # ── python / shell / data ─────────────────────────────────────────── + "[python]"."editor.defaultFormatter" = "charliermarsh.ruff"; + "python.languageServer" = "None"; + "python.defaultInterpreterPath" = "${pkgs.python3}/bin/python3"; + "[yaml]"."editor.defaultFormatter" = "redhat.vscode-yaml"; + "[markdown]"."editor.defaultFormatter" = "vscode.markdown-language-features"; + "[json]"."editor.defaultFormatter" = "vscode.json-language-features"; + "[jsonc]"."editor.defaultFormatter" = "vscode.json-language-features"; + "[shellscript]"."editor.tabSize" = 2; + + # ── diagnostics — errorLens ≈ helix inline-diagnostics ────────────── + "errorLens.enabled" = true; + "errorLens.enabledDiagnosticLevels" = [ + "error" + "warning" + ]; + "errorLens.messageBackgroundMode" = "none"; + "errorLens.gutterIconsEnabled" = false; + "errorLens.fontStyleItalic" = true; + "errorLens.followCursor" = "allLines"; + "errorLens.messageTemplate" = "$message"; + "problems.showCurrentInStatus" = true; + + # ── direnv — every repo here is a flake devShell ──────────────────── + "direnv.restart.automatic" = true; + }; + }; +} diff --git a/modules/home/vscode/home-vscode-panels.ulu.nix b/modules/home/vscode/home-vscode-panels.ulu.nix new file mode 100644 index 0000000..a81ccd9 --- /dev/null +++ b/modules/home/vscode/home-vscode-panels.ulu.nix @@ -0,0 +1,45 @@ +{ ... }: +{ + flake.homeModules.home-vscode-panels = + { ... }: + { + programs.vscodium.profiles.default.keybindings = [ + # alt+s — explorer + { + key = "alt+s"; + command = "workbench.view.explorer"; + } + { + key = "alt+s"; + command = "workbench.action.closeSidebar"; + when = "sideBarFocus && activeViewlet == 'workbench.view.explorer'"; + } + + # alt+space — terminal + { + key = "alt+space"; + command = "workbench.action.terminal.toggleTerminal"; + } + + # ctrl+space — source control + { + key = "ctrl+space"; + command = "workbench.view.scm"; + } + { + key = "ctrl+space"; + command = "workbench.action.toggleAuxiliaryBar"; + when = "auxiliaryBarFocus && activeAuxiliary == 'workbench.view.scm'"; + } + { + key = "ctrl+space"; + command = "workbench.action.closeSidebar"; + when = "sideBarFocus && activeViewlet == 'workbench.view.scm'"; + } + { + key = "ctrl+space"; + command = "-editor.action.triggerSuggest"; + } + ]; + }; +} diff --git a/modules/home/vscode/home-vscode-projects.ulu.nix b/modules/home/vscode/home-vscode-projects.ulu.nix new file mode 100644 index 0000000..6cd3342 --- /dev/null +++ b/modules/home/vscode/home-vscode-projects.ulu.nix @@ -0,0 +1,44 @@ +{ ... }: +{ + flake.homeModules.home-vscode-projects = + { + config, + lib, + pkgs, + ... + }: + { + options.elars.vscode.projectRoots = lib.mkOption { + type = lib.types.listOf lib.types.str; + default = [ config.home.homeDirectory ]; + }; + + config.programs.vscodium.profiles.default = { + extensions = [ pkgs.vscode-extensions.alefragnani.project-manager ]; + + userSettings = { + "projectManager.git.baseFolders" = config.elars.vscode.projectRoots; + "projectManager.git.maxDepthRecursion" = 2; + "projectManager.git.ignoredFolders" = [ + ".direnv" + ".git" + ".jj" + "build" + "node_modules" + "result" + "target" + ]; + "projectManager.sortList" = "Recent"; + }; + + # space o — project manager + keybindings = [ + { + key = "space o"; + command = "projectManager.listProjects"; + when = "editorTextFocus && (extension.helixKeymap.normalMode || extension.helixKeymap.visualMode)"; + } + ]; + }; + }; +} diff --git a/modules/home/vscode/home-vscode-spellcheck.ulu.nix b/modules/home/vscode/home-vscode-spellcheck.ulu.nix new file mode 100644 index 0000000..7a0d78c --- /dev/null +++ b/modules/home/vscode/home-vscode-spellcheck.ulu.nix @@ -0,0 +1,85 @@ +{ ... }: +{ + flake.homeModules.home-vscode-spellcheck = + { config, pkgs, ... }: + { + xdg.configFile."cspell/.keep".text = ""; + programs.vscodium.profiles.default = { + extensions = [ pkgs.vscode-extensions.streetsidesoftware.code-spell-checker ]; + + userSettings = { + "cSpell.enabledFileTypes" = { + "*" = false; + markdown = true; + plaintext = true; + "git-commit" = true; + }; + "cSpell.ignorePaths" = [ + ".git/{index,*refs,*HEAD}" + ".vscode" + "**/.direnv/**" + "**/.jj/**" + "**/flake.lock" + "**/node_modules/**" + "**/result" + "**/target/**" + "package-lock.json" + ]; + "cSpell.customDictionaries"."user-words" = { + name = "user-words"; + path = "${config.home.homeDirectory}/.config/cspell/custom-words.txt"; + addWords = true; + scope = "user"; + }; + "cSpell.userWords" = [ + "agenix" + "bcachefs" + "bpf" + "clangd" + "clvk" + "copland" + "crocus" + "dendritic" + "difftastic" + "direnv" + "dxvk" + "easyeffects" + "elars" + "ghostty" + "hasvk" + "helix" + "hyperx" + "hyprland" + "jujutsu" + "kdeconnect" + "kemuri" + "kvantum" + "lazyjj" + "legcord" + "mergiraf" + "mesa" + "niri" + "nixd" + "nixfmt" + "nixos" + "nixpkgs" + "noctalia" + "nushell" + "pavucontrol" + "playerctl" + "radicle" + "rusticl" + "sched" + "scrcpy" + "soryu" + "vscodium" + "vsix" + "vulkan" + "wayland" + "zellij" + "zram" + ]; + }; + }; + }; +} diff --git a/modules/home/vscode/home-vscode.ulu.nix b/modules/home/vscode/home-vscode.ulu.nix new file mode 100644 index 0000000..096303f --- /dev/null +++ b/modules/home/vscode/home-vscode.ulu.nix @@ -0,0 +1,213 @@ +{ ... }: +{ + # auto-generated + flake.homeModules.home-vscode = + { + config, + lib, + pkgs, + ... + }: + let + settingsPath = "${config.xdg.configHome}/VSCodium/User/settings.json"; + in + { + home.file.${settingsPath}.enable = false; + + home.activation.vscodiumWritableSettings = lib.hm.dag.entryAfter [ "writeBoundary" ] '' + _target="${settingsPath}" + run mkdir -p "$(dirname "$_target")" + # Önce sil: hedef store'a symlink'se install onu takip edip + # salt-okunur dosyaya yazmaya çalışır. + run rm -f "$_target" + run install -m 0644 ${config.home.file.${settingsPath}.source} "$_target" + ''; + + programs.vscodium = { + enable = true; + mutableExtensionsDir = false; + + profiles.default.userSettings = { + # ── editor: helix parity ────────────────────────────────────────── + "editor.lineNumbers" = "relative"; + "editor.cursorSurroundingLines" = 8; # = scrolloff + "editor.cursorBlinking" = "solid"; + "editor.cursorSmoothCaretAnimation" = "explicit"; + "editor.cursorStyle" = "block"; # per-mode override by the extension + "editor.rulers" = [ + 80 + 100 + ]; + "editor.wordWrap" = "on"; # = soft-wrap.enable + "editor.wrappingIndent" = "indent"; + "editor.renderLineHighlight" = "all"; # = cursorline + "editor.guides.indentation" = true; # = indent-guides.render + "editor.guides.bracketPairs" = false; + "editor.bracketPairColorization.enabled" = false; + "editor.matchBrackets" = "always"; + "editor.renderWhitespace" = "none"; + "editor.renderControlCharacters" = true; + "editor.stickyScroll.enabled" = false; + "editor.occurrencesHighlight" = "singleFile"; + "editor.selectionHighlight" = true; + "editor.emptySelectionClipboard" = false; + "editor.find.seedSearchStringFromSelection" = "never"; + "editor.multiCursorModifier" = "alt"; + "editor.dragAndDrop" = false; + "editor.linkedEditing" = true; + "editor.foldingHighlight" = false; + "editor.overviewRulerBorder" = false; + "editor.hideCursorInOverviewRuler" = true; + "editor.scrollBeyondLastLine" = false; + "editor.smoothScrolling" = true; + "editor.formatOnSave" = true; + + # completion: enter inserts a newline, ctrl+x accepts + "editor.acceptSuggestionOnEnter" = "off"; + "editor.acceptSuggestionOnCommitCharacter" = false; + "editor.suggestSelection" = "first"; + "editor.suggest.insertMode" = "replace"; # = completion-replace + "editor.suggest.preview" = true; # = preview-completion-insert + "editor.suggest.showStatusBar" = true; + "editor.snippetSuggestions" = "bottom"; + "editor.quickSuggestionsDelay" = 50; # = idle-timeout + "editor.hover.delay" = 50; + "editor.inlayHints.enabled" = "on"; + "editor.inlayHints.padding" = true; + "editor.parameterHints.enabled" = true; + "editor.wordBasedSuggestions" = "off"; + + # ── typography ──────────────────────────────────────────────────── + "editor.fontFamily" = "'JetBrainsMono Nerd Font Mono', 'JetBrainsMono Nerd Font', monospace"; + "editor.fontWeight" = "500"; + "editor.fontLigatures" = false; + "editor.lineHeight" = 1.6; + "workbench.fontAliasing" = "antialiased"; + "chat.editor.fontFamily" = "'JetBrainsMono Nerd Font Mono', monospace"; + "debug.console.fontFamily" = "'JetBrainsMono Nerd Font Mono', monospace"; + "markdown.preview.fontFamily" = "'JetBrainsMono Nerd Font', monospace"; + "scm.inputFontFamily" = "'JetBrainsMono Nerd Font Mono', monospace"; + + # ── chrome: editor + bufferline + statusline, nothing else ──────── + "workbench.iconTheme" = "symbols"; + "workbench.activityBar.location" = "hidden"; + "workbench.layoutControl.enabled" = false; + "workbench.navigationControl.enabled" = false; + "workbench.startupEditor" = "none"; + "workbench.tips.enabled" = false; + "workbench.enableExperiments" = false; + "workbench.tree.indent" = 16; + "workbench.tree.renderIndentGuides" = "none"; + "workbench.list.smoothScrolling" = true; + "workbench.browser.showInTitleBar" = false; + "workbench.view.showQuietly"."workbench.panel.output" = false; + "workbench.editor.showTabs" = "multiple"; # = bufferline "multiple" + "workbench.editor.tabActionCloseVisibility" = false; + "workbench.editor.tabSizing" = "shrink"; + "workbench.editor.editorActionsLocation" = "hidden"; + "workbench.editor.decorations.badges" = true; + "workbench.editor.decorations.colors" = true; + "workbench.editor.limit.enabled" = true; + "workbench.editor.limit.value" = 12; + "workbench.editor.limit.perEditorGroup" = true; + "editor.minimap.enabled" = false; + "editor.scrollbar.vertical" = "hidden"; + "editor.scrollbar.horizontal" = "hidden"; + "editor.scrollbar.verticalScrollbarSize" = 0; + "breadcrumbs.enabled" = false; + "window.commandCenter" = false; + "window.titleBarStyle" = "custom"; + "window.menuStyle" = "custom"; + "window.controlsStyle" = "hidden"; + "window.customTitleBarVisibility" = "windowed"; + "window.title" = "\${rootName}\${separator}\${activeEditorMedium}\${separator}\${dirty}"; + "chat.titleBar.openInAgentsWindow.enabled" = false; + "explorer.decorations.badges" = true; + "explorer.decorations.colors" = true; + "explorer.compactFolders" = false; + "explorer.confirmDelete" = false; + "explorer.confirmDragAndDrop" = false; + "explorer.fileNesting.enabled" = true; + "explorer.fileNesting.patterns" = { + "flake.nix" = "flake.lock"; + "Cargo.toml" = "Cargo.lock, rust-toolchain.toml, rustfmt.toml, clippy.toml"; + }; + "outline.showVariables" = false; + + # ── files ───────────────────────────────────────────────────────── + "files.autoSave" = "onFocusChange"; # = auto-save.focus-lost + "files.eol" = "\n"; + "files.trimTrailingWhitespace" = true; + "files.trimFinalNewlines" = true; + "files.insertFinalNewline" = true; + "files.exclude" = { + "**/.direnv" = true; + "**/.jj" = true; + "**/result" = true; + "**/result-*" = true; + }; + "files.watcherExclude" = { + "**/.direnv/**" = true; + "**/.git/**" = true; + "**/.jj/**" = true; + "**/build/**" = true; + "**/dist/**" = true; + "**/node_modules/**" = true; + "**/target/**" = true; + }; + "search.exclude" = { + "**/.direnv" = true; + "**/.jj" = true; + "**/dist" = true; + "**/node_modules" = true; + "**/result" = true; + "**/result-*" = true; + "**/target" = true; + }; + "search.useIgnoreFiles" = true; + "search.smartCase" = true; + "search.followSymlinks" = false; + + # ── terminal: nushell, same colours as ghostty ──────────────────── + "terminal.integrated.defaultProfile.osx" = "nu"; + "terminal.integrated.defaultProfile.linux" = "nu"; + "terminal.integrated.profiles.osx".nu.path = "${pkgs.nushell}/bin/nu"; + "terminal.integrated.profiles.linux".nu.path = "${pkgs.nushell}/bin/nu"; + "terminal.integrated.fontFamily" = "'JetBrainsMono Nerd Font', monospace"; + "terminal.integrated.fontSize" = 13; + "terminal.integrated.cursorStyle" = "block"; + "terminal.integrated.cursorBlinking" = false; + "terminal.integrated.copyOnSelection" = true; + "terminal.integrated.scrollback" = 20000; + "terminal.integrated.minimumContrastRatio" = 1; + "terminal.integrated.gpuAcceleration" = "on"; + "terminal.integrated.smoothScrolling" = true; + "terminal.integrated.tabs.enabled" = false; + "terminal.integrated.shellIntegration.decorationsEnabled" = "never"; + "terminal.integrated.enableVisualBell" = false; + + # ── scm (jj colocated: the git view reads the git side) ─────────── + "git.confirmSync" = false; + "git.enableSmartCommit" = true; + "git.autofetch" = false; + "git.openRepositoryInParentFolders" = "never"; + "git.decorations.enabled" = true; + "scm.defaultViewMode" = "list"; + "scm.diffDecorations" = "gutter"; + "diffEditor.ignoreTrimWhitespace" = false; + "diffEditor.renderSideBySide" = true; + + # ── noise ───────────────────────────────────────────────────────── + "telemetry.telemetryLevel" = "off"; + "extensions.autoUpdate" = "off"; # nix owns the extension set + "extensions.autoCheckUpdates" = false; + "extensions.ignoreRecommendations" = true; + "update.mode" = "none"; + "update.showReleaseNotes" = false; + "security.workspace.trust.banner" = "never"; + "security.workspace.trust.untrustedFiles" = "open"; + "makefile.configureOnOpen" = false; + }; + }; + }; +} diff --git a/modules/nixos/common/common-packages.ulu.nix b/modules/nixos/common/common-packages.ulu.nix index b7eeb34..a26654c 100644 --- a/modules/nixos/common/common-packages.ulu.nix +++ b/modules/nixos/common/common-packages.ulu.nix @@ -70,7 +70,6 @@ ifuse # agents - # todo make claude lobotomize github-copilot-cli claude-mergetool claude-monitor @@ -173,7 +172,6 @@ # editors neovim - vscode # media ffmpegthumbnailer @@ -187,7 +185,6 @@ inputs.agenix.packages.${system}.default inputs.nix-alien.packages.${system}.nix-alien - inputs.copetch.packages.${system}.default pkgs.qt6Packages.qtwebsockets ]; }; diff --git a/modules/nixos/desktop/desktop-xdg-mime.ulu.nix b/modules/nixos/desktop/desktop-xdg-mime.ulu.nix index f2f77ef..0f60745 100644 --- a/modules/nixos/desktop/desktop-xdg-mime.ulu.nix +++ b/modules/nixos/desktop/desktop-xdg-mime.ulu.nix @@ -34,15 +34,15 @@ "audio/ogg" = "mpv.desktop"; # text - "text/plain" = "code.desktop"; - "text/x-rust" = "code.desktop"; - "text/x-nix" = "code.desktop"; - "text/x-csrc" = "code.desktop"; - "text/x-chdr" = "code.desktop"; - "text/x-python" = "code.desktop"; - "text/x-shellscript" = "code.desktop"; - "application/json" = "code.desktop"; - "application/x-shellscript" = "code.desktop"; + "text/plain" = "codium.desktop"; + "text/x-rust" = "codium.desktop"; + "text/x-nix" = "codium.desktop"; + "text/x-csrc" = "codium.desktop"; + "text/x-chdr" = "codium.desktop"; + "text/x-python" = "codium.desktop"; + "text/x-shellscript" = "codium.desktop"; + "application/json" = "codium.desktop"; + "application/x-shellscript" = "codium.desktop"; }; };