9 Commits

Author SHA1 Message Date
J. Fernando Sánchez
93aeb0019e Replace wezterm with ghostty
wezterm was consuming quite a lot of memory, and I wasn't really using
any of the advanced features.

I will reconsider if ghostty ends up using just as much.
2026-02-26 11:13:04 +01:00
J. Fernando Sánchez
9befba5522 jj: improve ux 2026-02-11 10:33:09 +01:00
J. Fernando Sánchez
1522c8d6a0 Add helix and LSP for python 2026-02-09 14:25:17 +01:00
J. Fernando Sánchez
f0bda1964e Update niri 2026-02-09 14:25:14 +01:00
J. Fernando Sánchez
80d1ed1528 Improve git config 2026-02-09 14:24:20 +01:00
J. Fernando Sánchez
2d074e0b09 Move to nixpkgs 25.10 2026-02-09 14:22:44 +01:00
J. Fernando Sánchez
cf50f8800b Home manager: Remove unnecessary git config 2026-02-05 10:45:19 +01:00
J. Fernando Sánchez
d0a86c9dc5 Home manager: Add niri and jj as symlinks
This follows in the steps of mimicking stow.
2026-02-05 10:45:19 +01:00
J. Fernando Sánchez
6cc37ee562 Add git config and several pkgs
I've added the config to symlink my dotfiles .git like I used to do with
stow.
2026-02-05 10:44:47 +01:00
13 changed files with 240 additions and 77 deletions

8
flake.lock generated
View File

@@ -22,16 +22,16 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1756542300, "lastModified": 1770136044,
"narHash": "sha256-tlOn88coG5fzdyqz6R93SQL5Gpq+m/DsWpekNFhqPQk=", "narHash": "sha256-tlFqNG/uzz2++aAmn4v8J0vAkV3z7XngeIIB3rM3650=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "d7600c775f877cd87b4f5a831c28aa94137377aa", "rev": "e576e3c9cf9bad747afcddd9e34f51d18c855b4e",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "nixos", "owner": "nixos",
"ref": "nixos-unstable", "ref": "nixos-25.11",
"repo": "nixpkgs", "repo": "nixpkgs",
"type": "github" "type": "github"
} }

View File

@@ -3,7 +3,7 @@
inputs = { inputs = {
# Specify the source of Home Manager and Nixpkgs. # Specify the source of Home Manager and Nixpkgs.
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11";
home-manager = { home-manager = {
url = "github:nix-community/home-manager"; url = "github:nix-community/home-manager";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";

View File

@@ -0,0 +1,59 @@
# This is the configuration file for Ghostty.
#
# This template file has been automatically created at the following
# path since Ghostty couldn't find any existing config files on your system:
#
# /home/j/.config/ghostty/config
#
# The template does not set any default options, since Ghostty ships
# with sensible defaults for all options. Users should only need to set
# options that they want to change from the default.
#
# Run `ghostty +show-config --default --docs` to view a list of
# all available config options and their default values.
#
# Additionally, each config option is also explained in detail
# on Ghostty's website, at https://ghostty.org/docs/config.
#
# Ghostty can reload the configuration while running by using the menu
# options or the bound key (default: Command + Shift + comma on macOS and
# Control + Shift + comma on other platforms). Not all config options can be
# reloaded while running; some only apply to new windows and others may require
# a full restart to take effect.
# Config syntax crash course
# ==========================
# # The config file consists of simple key-value pairs,
# # separated by equals signs.
font-family = Iosevka
# window-padding-x = 2
#
# # Spacing around the equals sign does not matter.
# # All of these are identical:
# key=value
# key= value
# key =value
# key = value
#
# # Any line beginning with a # is a comment. It's not possible to put
# # a comment after a config option, since it would be interpreted as a
# # part of the value. For example, this will have a value of "#123abc":
# background = black
#123abc
# theme = Dark Modern
# theme = Soft Server
# theme = Zenwritten Dark
# theme = Operator Mono Dark
# theme = Monokai Remastered
# theme = Solarized Dark Patched
theme = 3024 Night
#
# # Empty values are used to reset config keys to default.
# key =
#
# # Some config options have unique syntaxes for their value,
# # which is explained in the docs for that config option.
# # Just for example:
# resize-overlay-duration = 4s 200ms
keybind = ctrl+[=text:\x1b

13
git/.config/git/config Normal file
View File

@@ -0,0 +1,13 @@
[user]
name = J. Fernando Sánchez
email = j@sinpapel.es
[core]
pager = delta
[delta]
side-by-side = true
[includeIf "gitdir:~/git/work/tcs/"]
path = tcs.config

View File

@@ -0,0 +1,3 @@
[user]
name = J. Fernando Sánchez
email = f.sanchez@thechannelstore.tv

View File

@@ -1,10 +1,15 @@
[user] [user]
name = J. Fernando Sánchez name = J. Fernando Sánchez
email = balkian@gmail.com email = j@sanchezrada.es
[diff] [diff]
tool = vimdiff tool = delta
[alias] [alias]
d = difftool d = difftool
[includeIf "gitdir:~/git/work/tcs"]
path = ~/.config/git/tcs.config
[include] [include]
path = ~/.gitconfig_secret path = ~/.gitconfig_secret

View File

@@ -0,0 +1,14 @@
theme = "github_dark"
[editor]
line-number = "relative"
mouse = false
auto-pairs = false
[editor.cursor-shape]
insert = "bar"
normal = "block"
select = "underline"
[editor.file-picker]
hidden = false

View File

@@ -29,7 +29,8 @@
pkgs.nerd-fonts.fira-code pkgs.nerd-fonts.fira-code
pkgs.nerd-fonts.monoid pkgs.nerd-fonts.monoid
wezterm #wezterm
ghostty
# Editors # Editors
emacs emacs
@@ -39,6 +40,7 @@
# Utils # Utils
jq jq
bat # Replacement for less bat # Replacement for less
delta # Replacement for less (for git diff and the like)
eza # Better ld eza # Better ld
zoxide # better cd zoxide # better cd
yazi # File manager yazi # File manager
@@ -47,12 +49,13 @@
dust # File disk utilization dust # File disk utilization
gnumake gnumake
zenith # System monitor
# Productivity
taskwarrior3 taskwarrior3
taskwarrior-tui taskwarrior-tui
timewarrior timewarrior
zenith # System monitor
# Shells # Shells
fish fish
grc # Colorizer grc # Colorizer
@@ -63,6 +66,7 @@
# Dev tools # Dev tools
git git
lazygit lazygit
jujutsu
# Python # Python
python3 python3
@@ -120,7 +124,8 @@
home.sessionVariables = { home.sessionVariables = {
XDG_BIN_HOME = "${config.home.homeDirectory}/.local/bin"; XDG_BIN_HOME = "${config.home.homeDirectory}/.local/bin";
#This variable is overriden. It does not work #This variable is overriden. It does not work
EDITOR = "nvim"; EDITOR = "hx";
#PAGER = "bat";
}; };
home.sessionPath = [ "$XDG_BIN_HOME" ]; home.sessionPath = [ "$XDG_BIN_HOME" ];
@@ -143,7 +148,12 @@
home.shellAliases = { home.shellAliases = {
lg = "lazygit"; lg = "lazygit";
gs = "git status"; gs = "git status";
j = "jj";
js = "jj status";
jt = "jj tug";
jf = "jj git fetch";
jl = "jj log";
}; };
programs.fish = { programs.fish = {
@@ -165,9 +175,16 @@
}; };
#programs.neovim.enable = true; #programs.neovim.enable = true;
programs.neovim.defaultEditor = true; #programs.neovim.defaultEditor = false;
#programs.helix.enable = true;
#programs.helix.defaultEditor = true;
programs.zoxide.enable = true; programs.zoxide = {
enable = true;
options = [
"--cmd z"
];
};
programs.bash = { programs.bash = {
enable = true; enable = true;
initExtra = '' initExtra = ''
@@ -181,6 +198,19 @@
fonts.fontconfig.enable = true; fonts.fontconfig.enable = true;
xdg.configFile = let
dotfiles = "${config.home.homeDirectory}/git/dotfiles";
createDotLink = name: {
source = config.lib.file.mkOutOfStoreSymlink "${dotfiles}/${name}/.config/${name}";
recursive = true;
};
in {
"git" = createDotLink "git";
"niri" = createDotLink "niri";
"jj" = createDotLink "jj";
"helix" = createDotLink "helix";
"ghostty" = createDotLink "ghostty";
};
} }

View File

@@ -1,18 +1,16 @@
{ config, pkgs, ... }: { config, pkgs, ... }:
{ {
home.packages = with pkgs; [ home.packages = with pkgs; [
jujutsu
ansible ansible
awscli2 awscli2
tinybird cargo-cross
rustup
rustc
gcc
python3Packages.jedi-language-server
ruff
vial
chromium
]; ];
programs.git = {
enable = true;
userName = "Fernando Sánchez";
userEmail = "f.sanchez@thechannelstore.tv";
extraConfig = {
init.defaultBranch = "main";
};
};
} }

View File

@@ -1,13 +1,4 @@
{ config, pkgs, ... }: { config, pkgs, ... }:
{ {
home.packages = with pkgs; [ ]; home.packages = with pkgs; [ ];
programs.git = {
enable = true;
userName = "J. Fernando Sánchez";
userEmail = "balkian@gmail.com";
extraConfig = {
init.defaultBranch = "main";
};
};
} }

27
jj/.config/jj/config.toml Normal file
View File

@@ -0,0 +1,27 @@
"$schema" = "https://jj-vcs.github.io/jj/latest/config-schema.json"
[user]
name = "J. Fernando Sánchez"
email = "j@sanchezrada.es"
[[--scope]]
--when.repositories = ["~/git/work/tcs"]
[--scope.user]
name = "J. Fernando Sánchez"
email = "f.sanchez@thechannelstore.tv"
[aliases]
tug = ["bookmark", "move", "--from", "heads(::@- & bookmarks())", "--to", "@-"]
l = ["log"]
s = ["status"]
f = ["git", "fetch"]
p = ["git", "push"]
[ui]
pager = "delta" #":builtin"
diff-formatter=":git"
paginate = "auto"
default-command = ["log", "--reversed"]
[merge-tools.delta]
diff-args=["--color-only", "--side-by-side", "$left", "$right", "--width=$width"]

View File

@@ -0,0 +1,15 @@
customCommands:
# - key: "m"
# description: "Merge (noff, nocommit)"
# command: "git merge --no-ff --no-commit {{.SelectedBranch}}"
# context: "localBranches"
# output: terminal
- key: "m"
description: "Merge (noff, nocommit)"
command: "git merge --no-ff --no-commit {{.SelectedLocalBranch.Name}}"
context: "localBranches"
output: terminal
#keybindings:
# branches:
# merge: "m" # make the UI “Merge” use our custom command

View File

@@ -103,6 +103,7 @@ output "eDP-1" {
// If the position is unset or results in an overlap, the output is instead placed // If the position is unset or results in an overlap, the output is instead placed
// automatically. // automatically.
position x=0 y=0 position x=0 y=0
//position x=0 y=1080
} }
output "DP-1" { output "DP-1" {
@@ -115,10 +116,15 @@ output "DP-1" {
// for the resolution. // for the resolution.
// If the mode is omitted altogether or is invalid, niri will pick one automatically. // If the mode is omitted altogether or is invalid, niri will pick one automatically.
// Run `niri msg outputs` while inside a niri instance to list all outputs and their modes. // Run `niri msg outputs` while inside a niri instance to list all outputs and their modes.
//mode "3840x2160@60"
mode "3840x2160@60" mode "3840x2160@60"
scale 1.25
//mode "1920x1080@60"
//mode "2560x1440"
//scale 1
// You can use integer or fractional scale, for example use 1.5 for 150% scale. // You can use integer or fractional scale, for example use 1.5 for 150% scale.
scale 1.25 //scale 1.0
// Transform allows to rotate the output counter-clockwise, valid values are: // Transform allows to rotate the output counter-clockwise, valid values are:
// normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270. // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270.
@@ -134,6 +140,7 @@ output "DP-1" {
// If the position is unset or results in an overlap, the output is instead placed // If the position is unset or results in an overlap, the output is instead placed
// automatically. // automatically.
position x=1920 y=-500 position x=1920 y=-500
//position x=0 y=0
} }
// Settings that influence how windows are positioned and sized. // Settings that influence how windows are positioned and sized.
@@ -141,7 +148,7 @@ output "DP-1" {
// https://github.com/YaLTeR/niri/wiki/Configuration:-Layout // https://github.com/YaLTeR/niri/wiki/Configuration:-Layout
layout { layout {
// Set gaps around windows in logical pixels. // Set gaps around windows in logical pixels.
gaps 5 gaps 0
// When to center a column when changing focus, options are: // When to center a column when changing focus, options are:
// - "never", default behavior, focusing an off-screen column will keep at the left // - "never", default behavior, focusing an off-screen column will keep at the left
@@ -288,10 +295,10 @@ layout {
// Top and bottom struts will simply add outer gaps in addition to the area occupied by // Top and bottom struts will simply add outer gaps in addition to the area occupied by
// layer-shell panels and regular gaps. // layer-shell panels and regular gaps.
struts { struts {
left 5 left 2
right 5 right 2
top 5 top 2
bottom 5 bottom 2
} }
} }
@@ -307,13 +314,9 @@ workspace "teams" {
open-on-output "eDP-1" open-on-output "eDP-1"
} }
workspace "3" {} workspace "notes" {
workspace "4" {} open-on-output "eDP-1"
workspace "5" {} }
workspace "6" {}
workspace "7" {}
workspace "8" {}
workspace "9" {}
// Add lines like this to spawn processes at startup. // Add lines like this to spawn processes at startup.
// Note that running niri as a session supports xdg-desktop-autostart, // Note that running niri as a session supports xdg-desktop-autostart,
@@ -348,7 +351,7 @@ animations {
// off // off
// Slow down all animations by this factor. Values below 1 speed them up instead. // Slow down all animations by this factor. Values below 1 speed them up instead.
slowdown 0.5 slowdown 0.75
} }
// Window rules let you adjust behavior for individual windows. // Window rules let you adjust behavior for individual windows.
@@ -371,12 +374,14 @@ window-rule {
// - host Firefox (app-id is "firefox") // - host Firefox (app-id is "firefox")
// - Flatpak Firefox (app-id is "org.mozilla.firefox") // - Flatpak Firefox (app-id is "org.mozilla.firefox")
match app-id=r#"firefox$"# title="^Picture-in-Picture$" match app-id=r#"firefox$"# title="^Picture-in-Picture$"
default-column-width {}
open-floating true open-floating true
} }
window-rule { window-rule {
match app-id=r#"firefox$"# title="Bitwarden" match app-id="firefox" title=r#".*Bitwarden.*"#
open-floating true open-floating true
block-out-from "screen-capture"
} }
// Example: block out two password managers from screen capture. // Example: block out two password managers from screen capture.
@@ -419,7 +424,7 @@ binds {
Mod+Shift+Slash { show-hotkey-overlay; } Mod+Shift+Slash { show-hotkey-overlay; }
// Suggested binds for running programs: terminal, app launcher, screen locker. // Suggested binds for running programs: terminal, app launcher, screen locker.
Mod+return hotkey-overlay-title="Open a Terminal: wezterm" { spawn "wezterm"; } Mod+return hotkey-overlay-title="Open a Terminal: ghostty" { spawn "ghostty"; }
Mod+space hotkey-overlay-title="Run an Application: wofi" { spawn "sh" "-c" "wofi --show dmenu,drun"; } Mod+space hotkey-overlay-title="Run an Application: wofi" { spawn "sh" "-c" "wofi --show dmenu,drun"; }
Mod+Delete hotkey-overlay-title="Lock the Screen: hyprlock" { spawn "hyprlock"; } Mod+Delete hotkey-overlay-title="Lock the Screen: hyprlock" { spawn "hyprlock"; }
@@ -427,6 +432,9 @@ binds {
// Note: the entire command goes as a single argument in the end. // Note: the entire command goes as a single argument in the end.
// Mod+T { spawn "bash" "-c" "notify-send hello && exec wezterm"; } // Mod+T { spawn "bash" "-c" "notify-send hello && exec wezterm"; }
Ctrl+Alt+W { spawn "firefox" "--ProfileManager"; }
Ctrl+Alt+Q { spawn "chromium-browser" "--ozone-platform=wayland"; }
// Brightness control // Brightness control
XF86MonBrightnessUp allow-when-locked=true { spawn "brightnessctl" "s" "+5%"; } XF86MonBrightnessUp allow-when-locked=true { spawn "brightnessctl" "s" "+5%"; }
XF86MonBrightnessDown allow-when-locked=true { spawn "brightnessctl" "s" "5%-"; } XF86MonBrightnessDown allow-when-locked=true { spawn "brightnessctl" "s" "5%-"; }
@@ -449,10 +457,15 @@ binds {
Mod+K { focus-window-up; } Mod+K { focus-window-up; }
Mod+L { focus-column-right; } Mod+L { focus-column-right; }
//Mod+Alt+H { move-window-left; }
Mod+Alt+J { move-window-down; }
//Mod+Alt+L { move-window-right; }
Mod+Alt+K { move-window-up; }
Mod+Ctrl+H { move-column-left-or-to-monitor-left; } Mod+Ctrl+H { move-column-left-or-to-monitor-left; }
Mod+Ctrl+J { move-window-down; }
Mod+Ctrl+L { move-column-right-or-to-monitor-right; } Mod+Ctrl+L { move-column-right-or-to-monitor-right; }
Mod+Ctrl+J { move-window-down-or-to-workspace-down; } Mod+Ctrl+K { move-window-up; }
Mod+Ctrl+K { move-window-up-or-to-workspace-up; }
Mod+Home { focus-column-first; } Mod+Home { focus-column-first; }
Mod+End { focus-column-last; } Mod+End { focus-column-last; }
@@ -469,30 +482,23 @@ binds {
Mod+Shift+K { focus-monitor-up; } Mod+Shift+K { focus-monitor-up; }
Mod+Shift+L { focus-monitor-right; } Mod+Shift+L { focus-monitor-right; }
Ctrl+Alt+H { move-workspace-to-monitor-left; }
Ctrl+Alt+J { move-workspace-to-monitor-down; }
Ctrl+Alt+K { move-workspace-to-monitor-up; }
Ctrl+Alt+L { move-workspace-to-monitor-right; }
Mod+Alt+H { move-column-to-monitor-left; }
Mod+Alt+J { move-column-to-monitor-down; }
Mod+Alt+K { move-column-to-monitor-up; }
Mod+Alt+L { move-column-to-monitor-right; }
// Alternatively, there are commands to move just a single window: // Alternatively, there are commands to move just a single window:
// Mod+Shift+Ctrl+Left { move-window-to-monitor-left; } // Mod+Shift+Ctrl+Left { move-window-to-monitor-left; }
// ... // ...
// And you can also move a whole workspace to another monitor: // And you can also move a whole workspace to another monitor:
Mod+Ctrl+Shift+H { move-workspace-to-monitor-left; } Ctrl+Alt+H { move-workspace-to-monitor-left; }
Mod+Ctrl+Shift+L { move-workspace-to-monitor-right; } Ctrl+Alt+L { move-workspace-to-monitor-right; }
Mod+Ctrl+Shift+J { move-workspace-to-monitor-down; } Ctrl+Alt+J { move-workspace-to-monitor-down; }
Mod+Ctrl+Shift+K { move-workspace-to-monitor-up; } Ctrl+Alt+K { move-workspace-to-monitor-up; }
// ... // ...
Mod+Page_Down { focus-workspace-down; } Mod+Page_Down { focus-workspace-down; }
Mod+Page_Up { focus-workspace-up; } Mod+Page_Up { focus-workspace-up; }
Mod+D { focus-workspace-down; } Mod+D { focus-workspace-down; }
Mod+U { focus-workspace-up; } Mod+U { focus-workspace-up; }
Mod+Ctrl+Page_Down { move-column-to-workspace-down; } Mod+Ctrl+Page_Down { move-column-to-workspace-down; }
Mod+Ctrl+Page_Up { move-column-to-workspace-up; } Mod+Ctrl+Page_Up { move-column-to-workspace-up; }
Mod+Ctrl+U { move-column-to-workspace-down; } Mod+Ctrl+U { move-column-to-workspace-down; }
@@ -549,23 +555,24 @@ binds {
// will all refer to the 3rd workspace. // will all refer to the 3rd workspace.
Mod+1 { focus-workspace "terminal"; } Mod+1 { focus-workspace "terminal"; }
Mod+2 { focus-workspace "firefox"; } Mod+2 { focus-workspace "firefox"; }
Mod+3 { focus-workspace "3"; } Mod+3 { focus-workspace "notes"; }
Mod+4 { focus-workspace "4"; } //Mod+4 { focus-workspace 4; }
Mod+5 { focus-workspace "5"; } //Mod+5 { focus-workspace "5"; }
Mod+6 { focus-workspace "6"; } //Mod+6 { focus-workspace "6"; }
Mod+7 { focus-workspace "7"; } //Mod+7 { focus-workspace "7"; }
Mod+8 { focus-workspace "8"; } //Mod+8 { focus-workspace "8"; }
Mod+9 { focus-workspace "9"; } //Mod+9 { focus-workspace "9"; }
Mod+grave { focus-workspace "teams"; }
Mod+0 { focus-workspace "teams"; } Mod+0 { focus-workspace "teams"; }
Mod+Ctrl+1 { move-column-to-workspace "terminal"; } Mod+Ctrl+1 { move-column-to-workspace "terminal"; }
Mod+Ctrl+2 { move-column-to-workspace "firefox"; } Mod+Ctrl+2 { move-column-to-workspace "firefox"; }
Mod+Ctrl+3 { move-column-to-workspace "3"; } Mod+Ctrl+3 { move-column-to-workspace "notes"; }
Mod+Ctrl+4 { move-column-to-workspace "4"; } //Mod+Ctrl+4 { move-column-to-workspace "4"; }
Mod+Ctrl+5 { move-column-to-workspace "5"; } //Mod+Ctrl+5 { move-column-to-workspace "5"; }
Mod+Ctrl+6 { move-column-to-workspace "6"; } //Mod+Ctrl+6 { move-column-to-workspace "6"; }
Mod+Ctrl+7 { move-column-to-workspace "7"; } //Mod+Ctrl+7 { move-column-to-workspace "7"; }
Mod+Ctrl+8 { move-column-to-workspace "8"; } //Mod+Ctrl+8 { move-column-to-workspace "8"; }
Mod+Ctrl+9 { move-column-to-workspace "9"; } //Mod+Ctrl+9 { move-column-to-workspace "9"; }
Mod+Ctrl+0 { move-column-to-workspace "teams"; } Mod+Ctrl+0 { move-column-to-workspace "teams"; }
// Alternatively, there are commands to move just a single window: // Alternatively, there are commands to move just a single window:
@@ -589,6 +596,7 @@ binds {
Mod+Shift+R { switch-preset-window-height; } Mod+Shift+R { switch-preset-window-height; }
Mod+Ctrl+R { reset-window-height; } Mod+Ctrl+R { reset-window-height; }
Mod+F { maximize-column; } Mod+F { maximize-column; }
Mod+G { maximize-window-to-edges; }
Mod+Shift+F { fullscreen-window; } Mod+Shift+F { fullscreen-window; }
// Expand the focused column to space not taken up by other fully visible columns. // Expand the focused column to space not taken up by other fully visible columns.