This commit is contained in:
elwrcl committed 2026-09-07 03:48:11 +03:00
1 parent e71abc6c13
commit b87dc873e9
13 files changed
+1298 -15

No files matched your search

@@ -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";
@@ -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;
}
];
};
};
}
@@ -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
]);
};
}
@@ -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";
}
];
};
};
}
@@ -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")
];
};
};
};
}
@@ -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;
};
};
}
@@ -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";
}
];
};
}
@@ -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)";
}
];
};
};
}
@@ -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"
];
};
};
};
}
+213
View File
@@ -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;
};
};
};
}
@@ -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
];
};
@@ -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";
};
};