Formated with alejandra

This commit is contained in:
Tomas Rivera
2026-04-13 15:32:01 +02:00
parent 0b2b88d41b
commit baaad664db
18 changed files with 1560 additions and 1545 deletions
+2 -1
View File
@@ -10,7 +10,8 @@
url = "github:nix-community/home-manager/release-25.11"; url = "github:nix-community/home-manager/release-25.11";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
caelestia-shell = { # based on quickshell. See https://github.com/caelestia-dots/shell caelestia-shell = {
# based on quickshell. See https://github.com/caelestia-dots/shell
url = "github:caelestia-dots/shell"; url = "github:caelestia-dots/shell";
inputs.nixpkgs.follows = "nixpkgs-unstable"; inputs.nixpkgs.follows = "nixpkgs-unstable";
}; };
+19 -21
View File
@@ -8,10 +8,7 @@
libs, libs,
inputs, inputs,
... ...
}: }: {
{
imports = [ imports = [
# Include the results of the hardware scan. # Include the results of the hardware scan.
./hardware-configuration.nix ./hardware-configuration.nix
@@ -23,11 +20,10 @@
../../modules/nixos/udevsimple.nix ../../modules/nixos/udevsimple.nix
]; ];
programs.nix-ld.enable = true; #Run unpatched dynamic binaries on NixOS. For example lets run ./a.out from gcc
programs.nix-ld.enable=true; #Run unpatched dynamic binaries on NixOS. For example lets run ./a.out from gcc
documentation.man.generateCaches = true; # used for the man script documentation.man.generateCaches = true; # used for the man script
hardware.bluetooth.enable = true; hardware.bluetooth.enable = true;
qt.enable = true; qt.enable = true;
@@ -83,12 +79,13 @@
# zsh dont want to work if it is not initialzed here. # zsh dont want to work if it is not initialzed here.
programs.zsh.enable = true; programs.zsh.enable = true;
security.wrappers.gsr-kms-server = { # to remove the password prompt when using gpu-screen-recorder security.wrappers.gsr-kms-server = {
owner = "root"; # to remove the password prompt when using gpu-screen-recorder
group = "root"; owner = "root";
capabilities = "cap_sys_admin+ep"; group = "root";
source = "${pkgs.gpu-screen-recorder}/bin/gsr-kms-server"; capabilities = "cap_sys_admin+ep";
}; source = "${pkgs.gpu-screen-recorder}/bin/gsr-kms-server";
};
# Enable the GNOME Desktop Environment. # Enable the GNOME Desktop Environment.
# services.displayManager.gdm.enable = true; # services.displayManager.gdm.enable = true;
@@ -160,7 +157,6 @@
options = "--delete-older-than 7d"; # every week delete generations older than a month options = "--delete-older-than 7d"; # every week delete generations older than a month
}; };
# Allow unfree packages # Allow unfree packages
nixpkgs.config.allowUnfree = true; # Nonfree packages: Obsidian nixpkgs.config.allowUnfree = true; # Nonfree packages: Obsidian
@@ -221,20 +217,22 @@
framework-tool framework-tool
framework-tool-tui framework-tool-tui
krita # image edition krita # image edition
yt-dlp# some youtube downloader yt-dlp # some youtube downloader
vlc vlc
(pkgs-unstable.python314.withPackages (ps: with ps; [ (pkgs-unstable.python314.withPackages (ps:
matplotlib with ps; [
networkx matplotlib
scipy networkx
])) scipy
]))
iamb # matrix client iamb # matrix client
direnv direnv
vivify # for nvimnotes vivify # for nvimnotes
# utils for dev # utils for dev
pkg-config pkg-config
gdb gdb
raylib glfw # raylib and some dependecies raylib
glfw # raylib and some dependecies
rembg # background remover rembg # background remover
#some nix tools #some nix tools
manix manix
+40 -38
View File
@@ -17,7 +17,7 @@
../../modules/home-manager/hyprland.nix ../../modules/home-manager/hyprland.nix
#../../modules/home-manager/wlogout.nix # logout utility #../../modules/home-manager/wlogout.nix # logout utility
../../modules/home-manager/rofi.nix # used for keybinds and for clipboard ../../modules/home-manager/rofi.nix # used for keybinds and for clipboard
#notifications are now manager with quickshell../../modules/home-manager/swaync.nix # notification daemon #notifications are now manager with quickshell../../modules/home-manager/swaync.nix # notification daemon
../../modules/home-manager/neovim.nix # dont use nixvim. broken ../../modules/home-manager/neovim.nix # dont use nixvim. broken
#../../modules/home-manager/neovim2.nix # ./neovim2.nix uses vim plug instead of the nix repository as with ./neovim.nix see the begining of neovim2 for an explanation #../../modules/home-manager/neovim2.nix # ./neovim2.nix uses vim plug instead of the nix repository as with ./neovim.nix see the begining of neovim2 for an explanation
../../modules/home-manager/rclone.nix ../../modules/home-manager/rclone.nix
@@ -25,7 +25,7 @@
#../../modules/home-manager/quickshell.nix # used for widgets, waybar and notifications # i migrated to caelestia-shell #../../modules/home-manager/quickshell.nix # used for widgets, waybar and notifications # i migrated to caelestia-shell
inputs.caelestia-shell.homeManagerModules.default inputs.caelestia-shell.homeManagerModules.default
../../modules/home-manager/caelestia.nix # caelestia shell is based on quickshell ../../modules/home-manager/caelestia.nix # caelestia shell is based on quickshell
#../../modules/home-manager/oh-my-posh.nix # zsh customizer #../../modules/home-manager/oh-my-posh.nix # zsh customizer
../../modules/home-manager/oh-my-zsh.nix # another zsh customizer ../../modules/home-manager/oh-my-zsh.nix # another zsh customizer
#../../modules/home-manager/hypridle.nix #../../modules/home-manager/hypridle.nix
#../../modules/home-manager/swaylock.nix #../../modules/home-manager/swaylock.nix
@@ -88,45 +88,47 @@
#(pkgs.callPackage ../../modules/scripts/QSsysinfo.nix {}) #(pkgs.callPackage ../../modules/scripts/QSsysinfo.nix {})
#(pkgs.callPackage ../../modules/scripts/QSnotifycache.nix {}) #(pkgs.callPackage ../../modules/scripts/QSnotifycache.nix {})
#(pkgs.callPackage ../../modules/scripts/QSnotifyhistory.nix {}) #(pkgs.callPackage ../../modules/scripts/QSnotifyhistory.nix {})
#pkgs #pkgs
pkgs.gruvbox-gtk-theme pkgs.gruvbox-gtk-theme
pkgs.biber pkgs.biber
(pkgs.texliveMedium.withPackages ( (pkgs.texliveMedium.withPackages (
ps: with ps; [ ps:
# these few pkgs are used in the CV template with ps; [
titlesec # allows creating custom \section # these few pkgs are used in the CV template
marvosym # some symboles titlesec # allows creating custom \section
ebgaramond # Use the EB Garamond font marvosym # some symboles
microtype # To enable letterspacing ebgaramond # Use the EB Garamond font
fontaxes microtype # To enable letterspacing
# these few pkgs were used for my TM fontaxes
svg # these few pkgs were used for my TM
catchfile svg
caption catchfile
transparent caption
cfr-lm transparent
svn-prov cfr-lm
nfssext-cfr svn-prov
hyphenat nfssext-cfr
csquotes hyphenat
enumitem csquotes
chngcntr enumitem
tcolorbox chngcntr
pdfcol tcolorbox
wrapfig pdfcol
tocloft wrapfig
lastpage tocloft
biblatex lastpage
biblatex-iso690 biblatex
libertine biblatex-iso690
minted libertine
upquote minted
lipsum upquote
footmisc lipsum
#(setq org-latex-compiler "lualatex") footmisc
#(setq org-preview-latex-default-process 'dvisvgm) #(setq org-latex-compiler "lualatex")
])) #(setq org-preview-latex-default-process 'dvisvgm)
# # It is sometimes useful to fine-tune packages, for example, by applying ]
))
# # It is sometimes useful to fine-tune packages, for example, by applying
# # overrides. You can do that directly here, just don't forget the # # overrides. You can do that directly here, just don't forget the
# # parentheses. Maybe you want to install Nerd Fonts with a limited number of # # parentheses. Maybe you want to install Nerd Fonts with a limited number of
# # fonts? # # fonts?
File diff suppressed because it is too large Load Diff
+93 -88
View File
@@ -1,14 +1,19 @@
{ config, pkgs, ... }: # ls replacement {
config,
pkgs,
...
}:
# ls replacement
# see ./zsh.nix for the alias (usefull to se default flags) # see ./zsh.nix for the alias (usefull to se default flags)
{ {
programs.eza = { programs.eza = {
enable = true; enable = true;
enableZshIntegration = true; enableZshIntegration = true;
theme = { # from https://github.com/eza-community/eza-themes/blob/main/themes/gruvbox-dark.yml theme = {
# from https://github.com/eza-community/eza-themes/blob/main/themes/gruvbox-dark.yml
colourful = true; colourful = true;
filekinds= { filekinds = {
normal = {foreground = "#ebdbb2";}; normal = {foreground = "#ebdbb2";};
directory = {foreground = "#83a598";}; directory = {foreground = "#83a598";};
symlink = {foreground = "#8ec07c";}; symlink = {foreground = "#8ec07c";};
@@ -16,98 +21,98 @@
block_device = {foreground = "#fb4934";}; block_device = {foreground = "#fb4934";};
char_device = {foreground = "#fb4934";}; char_device = {foreground = "#fb4934";};
socket = {foreground = "#665c54";}; socket = {foreground = "#665c54";};
special= {foreground= "#d3869b";}; special = {foreground = "#d3869b";};
executable= {foreground= "#b8bb26";}; executable = {foreground = "#b8bb26";};
mount_point= {foreground= "#fe8019";}; mount_point = {foreground = "#fe8019";};
}; };
perms = { perms = {
user_read= {foreground= "#ebdbb2";}; user_read = {foreground = "#ebdbb2";};
user_write= {foreground= "#fabd2f";}; user_write = {foreground = "#fabd2f";};
user_execute_file= {foreground= "#b8bb26";}; user_execute_file = {foreground = "#b8bb26";};
user_execute_other= {foreground= "#b8bb26";}; user_execute_other = {foreground = "#b8bb26";};
group_read= {foreground= "#ebdbb2";}; group_read = {foreground = "#ebdbb2";};
group_write= {foreground= "#fabd2f";}; group_write = {foreground = "#fabd2f";};
group_execute= {foreground= "#b8bb26";}; group_execute = {foreground = "#b8bb26";};
other_read= {foreground= "#bdae93";}; other_read = {foreground = "#bdae93";};
other_write= {foreground= "#fabd2f";}; other_write = {foreground = "#fabd2f";};
other_execute= {foreground= "#b8bb26";}; other_execute = {foreground = "#b8bb26";};
special_user_file= {foreground= "#d3869b";}; special_user_file = {foreground = "#d3869b";};
special_other= {foreground= "#928374";}; special_other = {foreground = "#928374";};
attribute= {foreground= "#bdae93";}; attribute = {foreground = "#bdae93";};
}; };
size= { size = {
major= {foreground= "#bdae93";}; major = {foreground = "#bdae93";};
minor= {foreground= "#8ec07c";}; minor = {foreground = "#8ec07c";};
number_byte= {foreground= "#ebdbb2";}; number_byte = {foreground = "#ebdbb2";};
number_kilo= {foreground= "#ebdbb2";}; number_kilo = {foreground = "#ebdbb2";};
number_mega= {foreground= "#83a598";}; number_mega = {foreground = "#83a598";};
number_giga= {foreground= "#d3869b";}; number_giga = {foreground = "#d3869b";};
number_huge= {foreground= "#d3869b";}; number_huge = {foreground = "#d3869b";};
unit_byte= {foreground= "#bdae93";}; unit_byte = {foreground = "#bdae93";};
unit_kilo= {foreground= "#83a598";}; unit_kilo = {foreground = "#83a598";};
unit_mega= {foreground= "#d3869b";}; unit_mega = {foreground = "#d3869b";};
unit_giga= {foreground= "#d3869b";}; unit_giga = {foreground = "#d3869b";};
unit_huge= {foreground= "#fe8019";}; unit_huge = {foreground = "#fe8019";};
}; };
users= { users = {
user_you= {foreground= "#ebdbb2";}; user_you = {foreground = "#ebdbb2";};
user_root= {foreground= "#fb4934";}; user_root = {foreground = "#fb4934";};
user_other= {foreground= "#d3869b";}; user_other = {foreground = "#d3869b";};
group_yours= {foreground= "#ebdbb2";}; group_yours = {foreground = "#ebdbb2";};
group_other= {foreground= "#928374";}; group_other = {foreground = "#928374";};
group_root= {foreground= "#fb4934";}; group_root = {foreground = "#fb4934";};
}; };
links= { links = {
normal= {foreground= "#8ec07c";}; normal = {foreground = "#8ec07c";};
multi_link_file= {foreground= "#fe8019";}; multi_link_file = {foreground = "#fe8019";};
}; };
git= { git = {
new= {foreground= "#b8bb26";}; new = {foreground = "#b8bb26";};
modified= {foreground= "#fabd2f";}; modified = {foreground = "#fabd2f";};
deleted= {foreground= "#fb4934";}; deleted = {foreground = "#fb4934";};
renamed= {foreground= "#8ec07c";}; renamed = {foreground = "#8ec07c";};
typechange= {foreground= "#d3869b";}; typechange = {foreground = "#d3869b";};
ignored= {foreground= "#928374";}; ignored = {foreground = "#928374";};
conflicted= {foreground= "#cc241d";}; conflicted = {foreground = "#cc241d";};
}; };
git_repo= { git_repo = {
branch_main= {foreground= "#ebdbb2";}; branch_main = {foreground = "#ebdbb2";};
branch_other= {foreground= "#d3869b";}; branch_other = {foreground = "#d3869b";};
git_clean= {foreground= "#b8bb26";}; git_clean = {foreground = "#b8bb26";};
git_dirty= {foreground= "#fb4934";}; git_dirty = {foreground = "#fb4934";};
}; };
security_context= { security_context = {
colon= {foreground= "#928374";}; colon = {foreground = "#928374";};
user= {foreground= "#ebdbb2";}; user = {foreground = "#ebdbb2";};
role= {foreground= "#d3869b";}; role = {foreground = "#d3869b";};
typ= {foreground= "#665c54";}; typ = {foreground = "#665c54";};
range= {foreground= "#d3869b";}; range = {foreground = "#d3869b";};
};
file_type = {
image = {foreground = "#fabd2f";};
video = {foreground = "#fb4934";};
music = {foreground = "#b8bb26";};
lossless = {foreground = "#8ec07c";};
crypto = {foreground = "#928374";};
document = {foreground = "#ebdbb2";};
compressed = {foreground = "#d3869b";};
temp = {foreground = "#cc241d";};
compiled = {foreground = "#83a598";};
build = {foreground = "#928374";};
source = {foreground = "#83a598";};
punctuation = {foreground = "#928374";};
date = {foreground = "#fabd2f";};
inode = {foreground = "#bdae93";};
blocks = {foreground = "#a89984";};
header = {foreground = "#ebdbb2";};
octal = {foreground = "#8ec07c";};
flags = {foreground = "#d3869b";};
symlink_path = {foreground = "#8ec07c";};
control_char = {foreground = "#83a598";};
broken_symlink = {foreground = "#fb4934";};
broken_path_overlay = {foreground = "#928374";};
}; };
file_type= {
image= {foreground= "#fabd2f";};
video= {foreground= "#fb4934";};
music= {foreground= "#b8bb26";};
lossless= {foreground= "#8ec07c";};
crypto= {foreground= "#928374";};
document= {foreground= "#ebdbb2";};
compressed= {foreground= "#d3869b";};
temp= {foreground= "#cc241d";};
compiled= {foreground= "#83a598";};
build= {foreground= "#928374";};
source= {foreground= "#83a598";};
punctuation= {foreground= "#928374";};
date= {foreground= "#fabd2f";};
inode= {foreground= "#bdae93";};
blocks= {foreground= "#a89984";};
header= {foreground= "#ebdbb2";};
octal= {foreground= "#8ec07c";};
flags= {foreground= "#d3869b";};
symlink_path= {foreground= "#8ec07c";};
control_char= {foreground= "#83a598";};
broken_symlink= {foreground= "#fb4934";};
broken_path_overlay= {foreground= "#928374";};
};
}; };
}; };
} }
+10 -6
View File
@@ -149,15 +149,17 @@ in {
"Ctrl+Alt, 7, exec, caelestia shell gameMode toggle" "Ctrl+Alt, 7, exec, caelestia shell gameMode toggle"
# reloads the autostart programs # pos 3 1 # reloads the autostart programs # pos 3 1
# we passed to caelestia-shell and stoped using that # we passed to caelestia-shell and stoped using that
/*"Ctrl+$mod, 4, exec, sleep 1 && kitty -o font_size=16 -e sh -c 'custom-weather'" /*
"Ctrl+$mod, 4, exec, sleep 1 && kitty -o font_size=16 -e sh -c 'custom-weather'"
"Ctrl+$mod, 4, exec, sleep 1 && kitty -o font_size=11 -e sh -c 'custom-cowsay'" "Ctrl+$mod, 4, exec, sleep 1 && kitty -o font_size=11 -e sh -c 'custom-cowsay'"
"Ctrl+$mod, 4, exec, kitty -e 'custom-launch'" "Ctrl+$mod, 4, exec, kitty -e 'custom-launch'"
"Ctrl+$mod, 4, exec, sleep 1 && kitty -o font_size=5 -e btm --theme gruvbox --disable-click --disable_advanced_kill --enable_cache_memory -g -R -T " "Ctrl+$mod, 4, exec, sleep 1 && kitty -o font_size=5 -e btm --theme gruvbox --disable-click --disable_advanced_kill --enable_cache_memory -g -R -T "
"Ctrl+$mod, 4, exec, sleep 1 && kitty -o font_size=1 -e sh -c 'cmatrix -br'" "Ctrl+$mod, 4, exec, sleep 1 && kitty -o font_size=1 -e sh -c 'cmatrix -br'"
#"Ctrl+Alt, 1, exec, swaync-client -t" # pos 4 1 notification center #"Ctrl+Alt, 1, exec, swaync-client -t" # pos 4 1 notification center
"Ctrl+Alt, 1, exec, qs ipc call notifications toggle" */ "Ctrl+Alt, 1, exec, qs ipc call notifications toggle"
*/
"Ctrl+Alt, 1, exec, caelestia shell drawers toggle sidebar" "Ctrl+Alt, 1, exec, caelestia shell drawers toggle sidebar"
"Ctrl+$mod, 4, exec, caelestia shell notifs toggleDnd" "Ctrl+$mod, 4, exec, caelestia shell notifs toggleDnd"
"Ctrl+$mod, 3, exec, pavucontrol" # pos 1 2 audiocontrol "Ctrl+$mod, 3, exec, pavucontrol" # pos 1 2 audiocontrol
"Ctrl+$mod, 5, exec, gnome-characters" # pos 2 2 special chars "Ctrl+$mod, 5, exec, gnome-characters" # pos 2 2 special chars
"Ctrl+Alt, 8, exec, hyprpicker | tee >(wl-copy) | cliphist store" # pos 3 2 colorpicker "Ctrl+Alt, 8, exec, hyprpicker | tee >(wl-copy) | cliphist store" # pos 3 2 colorpicker
@@ -220,7 +222,8 @@ in {
#"custom-obsidianbackup" # backups the obsidian notes to kdrive and to a timed hidden dir (~/.Notes.backup/) #"custom-obsidianbackup" # backups the obsidian notes to kdrive and to a timed hidden dir (~/.Notes.backup/)
#"QS-notifycache" # builds the cache that will be used for the notification history #"QS-notifycache" # builds the cache that will be used for the notification history
"sleep 2 & caelestia-shell" #works better if it sleeps a bit before "sleep 2 & caelestia-shell" #works better if it sleeps a bit before
/* We stopped using that ######################### maybe we should desactivate those scripts /*
We stopped using that ######################### maybe we should desactivate those scripts
# login autostart # login autostart
####################### #######################
"[workspace 1 silent] sleep 1 && kitty -o font_size=16 -e sh -c 'custom-weather'" "[workspace 1 silent] sleep 1 && kitty -o font_size=16 -e sh -c 'custom-weather'"
@@ -229,7 +232,8 @@ in {
"[workspace 1 silent] sleep 1 && kitty -o font_size=5 -e btm --theme gruvbox --disable-click --disable_advanced_kill --enable_cache_memory -g -R -T " "[workspace 1 silent] sleep 1 && kitty -o font_size=5 -e btm --theme gruvbox --disable-click --disable_advanced_kill --enable_cache_memory -g -R -T "
"[workspace 1 silent] sleep 1 && kitty -o font_size=1 -e sh -c 'cmatrix -br'" "[workspace 1 silent] sleep 1 && kitty -o font_size=1 -e sh -c 'cmatrix -br'"
###################### ######################
######################*/ ######################
*/
]; ];
# gestures (also keybindings) # gestures (also keybindings)
+46 -44
View File
@@ -10,62 +10,63 @@
## new config (matches with caelestia ## new config (matches with caelestia
## old condfig ## old condfig
extraConfig = '' extraConfig = ''
font_size 14 font_size 14
bold_font auto bold_font auto
italic_font auto italic_font auto
bold_italic_font auto bold_italic_font auto
window_padding_width 25 window_padding_width 25
# --- Core --- # --- Core ---
foreground #ece0d9 foreground #ece0d9
background #18120e background #18120e
selection_foreground #18120e selection_foreground #18120e
selection_background #ece0d9 selection_background #ece0d9
cursor #ffb878 cursor #ffb878
cursor_text_color #18120e cursor_text_color #18120e
# --- Tabs --- # --- Tabs ---
active_tab_foreground #18120e active_tab_foreground #18120e
active_tab_background #5c412a active_tab_background #5c412a
inactive_tab_foreground #d6c3b5 inactive_tab_foreground #d6c3b5
inactive_tab_background #241e1a inactive_tab_background #241e1a
# --- Black / Gray --- # --- Black / Gray ---
color0 #353433 color0 #353433
color8 #b29f91 color8 #b29f91
# --- Red --- # --- Red ---
color1 #e17300 color1 #e17300
color9 #ff8a20 color9 #ff8a20
# --- Green --- # --- Green ---
color2 #ffc071 color2 #ffc071
color10 #ffd6a8 color10 #ffd6a8
# --- Yellow --- # --- Yellow ---
color3 #ffe0c6 color3 #ffe0c6
color11 #fff2e8 color11 #fff2e8
# --- Blue --- # --- Blue ---
color4 #b9ab66 color4 #b9ab66
color12 #d7be91 color12 #d7be91
# --- Magenta --- # --- Magenta ---
color5 #ed9562 color5 #ed9562
color13 #fcad7e color13 #fcad7e
# --- Cyan --- # --- Cyan ---
color6 #f4c16d color6 #f4c16d
color14 #ffd497 color14 #ffd497
# --- White --- # --- White ---
color7 #ebd4c1 color7 #ebd4c1
color15 #FFFFFF color15 #FFFFFF
''; '';
/*extraConfig = '' /*
extraConfig = ''
# font nerd-fonts._0xproto # this key dont work and causes errors # font nerd-fonts._0xproto # this key dont work and causes errors
font_size 14 font_size 14
bold_font auto bold_font auto
@@ -118,6 +119,7 @@ color15 #FFFFFF
# white # white
color7 #FFF0CC color7 #FFF0CC
color15 #F0DBAA color15 #F0DBAA
'';*/ '';
*/
}; };
} }
+349 -350
View File
@@ -4,12 +4,11 @@
pkgs-unstable, pkgs-unstable,
... ...
}: { }: {
programs.neovim = { programs.neovim = {
enable = true; enable = true;
vimAlias = false; vimAlias = false;
viAlias = true; viAlias = true;
package = pkgs-unstable.neovim-unwrapped; # required for unwrapped version package = pkgs-unstable.neovim-unwrapped; # required for unwrapped version
plugins = [ plugins = [
pkgs-unstable.vimPlugins.vivify-vim pkgs-unstable.vimPlugins.vivify-vim
pkgs-unstable.vimPlugins.vimtex pkgs-unstable.vimPlugins.vimtex
@@ -70,369 +69,369 @@
]; ];
extraLuaConfig = '' extraLuaConfig = ''
local vim = vim local vim = vim
-- ========================= -- =========================
-- LEADER & KEY DISABLE -- LEADER & KEY DISABLE
-- ========================= -- =========================
vim.g.mapleader = ' ' vim.g.mapleader = ' '
vim.g.maplocalleader = ' ' vim.g.maplocalleader = ' '
vim.keymap.set({'n', 'v'}, '<Space>', '<Nop>', { desc = 'Leader key, disable default behavior' }) vim.keymap.set({'n', 'v'}, '<Space>', '<Nop>', { desc = 'Leader key, disable default behavior' })
vim.keymap.set('n', 'q', '<Nop>', { desc = 'Disable macro recording' }) vim.keymap.set('n', 'q', '<Nop>', { desc = 'Disable macro recording' })
vim.keymap.set('n', 'gg', '<Nop>', { desc = 'Disable g motion' }) vim.keymap.set('n', 'gg', '<Nop>', { desc = 'Disable g motion' })
vim.keymap.set('n', 'gG', '<Nop>', { desc = 'Disable g motion' }) vim.keymap.set('n', 'gG', '<Nop>', { desc = 'Disable g motion' })
vim.keymap.set('n', 'g0', '<Nop>', { desc = 'Disable g motion' }) vim.keymap.set('n', 'g0', '<Nop>', { desc = 'Disable g motion' })
vim.keymap.set('n', 'g^', '<Nop>', { desc = 'Disable g motion' }) vim.keymap.set('n', 'g^', '<Nop>', { desc = 'Disable g motion' })
vim.keymap.set('n', 'g$', '<Nop>', { desc = 'Disable g motion' }) vim.keymap.set('n', 'g$', '<Nop>', { desc = 'Disable g motion' })
vim.keymap.set('n', 'gj', '<Nop>', { desc = 'Disable g motion' }) vim.keymap.set('n', 'gj', '<Nop>', { desc = 'Disable g motion' })
vim.keymap.set('n', 'gk', '<Nop>', { desc = 'Disable g motion' }) vim.keymap.set('n', 'gk', '<Nop>', { desc = 'Disable g motion' })
vim.keymap.set('n', 'g~', '<Nop>', { desc = 'Disable g motion' }) vim.keymap.set('n', 'g~', '<Nop>', { desc = 'Disable g motion' })
vim.keymap.set('n', 'gu', '<Nop>', { desc = 'Disable g motion' }) vim.keymap.set('n', 'gu', '<Nop>', { desc = 'Disable g motion' })
vim.keymap.set('n', 'gU', '<Nop>', { desc = 'Disable g motion' }) vim.keymap.set('n', 'gU', '<Nop>', { desc = 'Disable g motion' })
vim.keymap.set('n', 'g=', '<Nop>', { desc = 'Disable g motion' }) vim.keymap.set('n', 'g=', '<Nop>', { desc = 'Disable g motion' })
vim.keymap.set('n', 'gq', '<Nop>', { desc = 'Disable g motion' }) vim.keymap.set('n', 'gq', '<Nop>', { desc = 'Disable g motion' })
vim.keymap.set('n', 'g@', '<Nop>', { desc = 'Disable g motion' }) vim.keymap.set('n', 'g@', '<Nop>', { desc = 'Disable g motion' })
vim.keymap.set('n', 'g?', '<Nop>', { desc = 'Disable g motion' }) vim.keymap.set('n', 'g?', '<Nop>', { desc = 'Disable g motion' })
vim.keymap.set('n', 'gC', '<Nop>', { desc = 'Disable g motion' }) vim.keymap.set('n', 'gC', '<Nop>', { desc = 'Disable g motion' })
vim.keymap.set('n', 'gD', '<Nop>', { desc = 'Disable g motion' }) vim.keymap.set('n', 'gD', '<Nop>', { desc = 'Disable g motion' })
vim.keymap.set('n', 'gx', '<Nop>', { desc = 'Disable g motion' }) vim.keymap.set('n', 'gx', '<Nop>', { desc = 'Disable g motion' })
vim.keymap.set('n', 'gr', '<Nop>', { desc = 'Disable g motion' }) vim.keymap.set('n', 'gr', '<Nop>', { desc = 'Disable g motion' })
vim.keymap.set('n', 'g[', '<Nop>', { desc = 'Disable g motion' }) vim.keymap.set('n', 'g[', '<Nop>', { desc = 'Disable g motion' })
vim.keymap.set('n', 'g]', '<Nop>', { desc = 'Disable g motion' }) vim.keymap.set('n', 'g]', '<Nop>', { desc = 'Disable g motion' })
vim.keymap.set('n', 'g;', '<Nop>', { desc = 'Disable g motion' }) vim.keymap.set('n', 'g;', '<Nop>', { desc = 'Disable g motion' })
vim.keymap.set('n', 'g,', '<Nop>', { desc = 'Disable g motion' }) vim.keymap.set('n', 'g,', '<Nop>', { desc = 'Disable g motion' })
-- ========================= -- =========================
-- GENERAL OPTIONS -- GENERAL OPTIONS
-- ========================= -- =========================
vim.g.have_nerd_font = true vim.g.have_nerd_font = true
vim.opt.relativenumber = false vim.opt.relativenumber = false
vim.opt.number = true vim.opt.number = true
vim.opt.mouse = 'a' vim.opt.mouse = 'a'
vim.opt.showmode = false vim.opt.showmode = false
vim.schedule(function() vim.schedule(function()
vim.opt.clipboard = 'unnamedplus' vim.opt.clipboard = 'unnamedplus'
end) end)
vim.opt.breakindent = true vim.opt.breakindent = true
vim.opt.undofile = true vim.opt.undofile = true
vim.opt.ignorecase = true vim.opt.ignorecase = true
vim.opt.smartcase = true vim.opt.smartcase = true
vim.opt.signcolumn = 'yes' vim.opt.signcolumn = 'yes'
vim.opt.updatetime = 250 vim.opt.updatetime = 250
vim.opt.timeoutlen = 300 vim.opt.timeoutlen = 300
vim.opt.splitright = true vim.opt.splitright = true
vim.opt.splitbelow = true vim.opt.splitbelow = true
vim.opt.list = true vim.opt.list = true
vim.opt.listchars = { tab = '» ', trail = '·', nbsp = '' } vim.opt.listchars = { tab = '» ', trail = '·', nbsp = '' }
vim.opt.expandtab = true vim.opt.expandtab = true
vim.opt.smartindent = true vim.opt.smartindent = true
vim.opt.tabstop = 4 vim.opt.tabstop = 4
vim.opt.shiftwidth = 4 vim.opt.shiftwidth = 4
vim.opt.inccommand = 'split' vim.opt.inccommand = 'split'
vim.opt.cursorline = true vim.opt.cursorline = true
vim.opt.scrolloff = 10 vim.opt.scrolloff = 10
-- =========================
-- BASIC KEYMAPS
-- =========================
vim.keymap.set('n', '<Esc>', '<cmd>nohlsearch<CR>')
vim.keymap.set('t', '<Esc><Esc>', '<C-\\><C-n>', { desc = 'Exit terminal mode' })
-- Disable arrow keys in normal mode
vim.keymap.set('n', '<left>', '<cmd>echo "Use h to move!!"<CR>')
vim.keymap.set('n', '<right>', '<cmd>echo "Use l to move!!"<CR>')
vim.keymap.set('n', '<up>', '<cmd>echo "Use k to move!!"<CR>')
vim.keymap.set('n', '<down>', '<cmd>echo "Use j to move!!"<CR>')
-- Window navigation
vim.keymap.set('n', '<C-Left>', '<C-w><C-h>', { desc = 'Move focus to the left window' })
vim.keymap.set('n', '<C-Right>', '<C-w><C-l>', { desc = 'Move focus to the right window' })
vim.keymap.set('n', '<C-Down>', '<C-w><C-j>', { desc = 'Move focus to the lower window' })
vim.keymap.set('n', '<C-Up>', '<C-w><C-k>', { desc = 'Move focus to the upper window' })
-- Cheatsheet
vim.keymap.set("n","§", "<cmd>Cheatsheet<CR>")
require("cheatsheet").setup({
bundled_cheatsheets = { enabled = { "default" } },
bundled_plugin_cheatsheets = { disabled = { "gitsigns.nvim" } }
})
-- Highlight yanked text
vim.api.nvim_create_autocmd('TextYankPost', {
desc = 'Highlight on yank',
group = vim.api.nvim_create_augroup('kickstart-highlight-yank', { clear = true }),
callback = function() vim.highlight.on_yank() end,
})
-- ========================
-- terminal
-- =======================
require("runner-nvim").setup({
position = 'right', -- position of the terminal window when using the shell_handler
-- can be: top, left, right, bottom
-- will be overwritten when using the telescope mapping to open horizontally or vertically
width = 80, -- width of window when position is left or right
height = 10, -- height of window when position is top or bottom
handlers = {
lua = function(bufnr)
vim.print('Running lua file in buffer ' .. bufnr)
-- Run the file here
end
}
})
vim.keymap.set("n", "<leader><leader>", function() require("runner-nvim").run() end)
-- =========================
-- SCROLLBAR
-- =========================
require("scrollbar").setup()
-- =========================
-- UFO FOLDING
-- =========================
vim.o.foldcolumn = '1'
vim.o.foldlevel = 99
vim.o.foldlevelstart = 99
vim.o.foldenable = true
vim.keymap.set('n', '<leader>1', "<cmd>foldopen<CR>")
vim.keymap.set('n', '<leader>2', "<cmd>foldclose<CR>")
require('ufo').setup({
provider_selector = function() return {'treesitter', 'indent'} end
})
-- =========================
-- treesitter
-- ========================
require('nvim-treesitter').setup({
ensure_installed = {},
highlight = {
enable = true,
additional_vim_regex_highlighting = false,
},
indent = { enable = true },
})
-- =========================
-- NVIM-TREE
-- =========================
vim.g.loaded_netrw = 1
vim.g.loaded_netrwPlugin = 1
require("nvim-tree").setup({
sort = { sorter = "case_sensitive" },
view = { width = 30 },
renderer = { group_empty = true },
filters = { dotfiles = true },
})
-- =========================
-- CMP CONFIGURATION
-- =========================
local cmp = require'cmp'
cmp.setup({
snippet = { expand = function(args) vim.fn["vsnip#anonymous"](args.body) end },
mapping = cmp.mapping.preset.insert({
['<C-b>'] = cmp.mapping.scroll_docs(-4),
['<C-f>'] = cmp.mapping.scroll_docs(4),
['<C-Space>'] = cmp.mapping.complete(),
['<C-e>'] = cmp.mapping.abort(),
['<CR>'] = cmp.mapping.confirm({ select = true }),
}),
sources = cmp.config.sources({ { name = 'nvim_lsp' }, { name = 'vsnip' } }, { { name = 'buffer' } }),
})
cmp.setup.cmdline({ '/', '?' }, { mapping = cmp.mapping.preset.cmdline(), sources = { { name = 'buffer' } } })
cmp.setup.cmdline(':', { mapping = cmp.mapping.preset.cmdline(), sources = cmp.config.sources({ { name = 'path' } }, { { name = 'cmdline' } }), matching = { disallow_symbol_nonprefix_matching = false } })
-- =========================
-- LSP CONFIGURATION
-- =========================
local capabilities = require('cmp_nvim_lsp').default_capabilities()
-- Diagnostics
vim.keymap.set("n", "<leader>e1", function() vim.diagnostic.jump({ prev=true, count = 1 }) end, { desc = "Previous diagnostic" })
vim.keymap.set("n", "<leader>e2", function() vim.diagnostic.jump({ prev=false, count = 1 }) end, { desc = "Next diagnostic" })
vim.keymap.set("n", "<leader>e3", vim.diagnostic.open_float, { desc = "Show diagnostic" })
vim.keymap.set("n", "<leader>e4", vim.diagnostic.setloclist, { desc = "Diagnostic list" })
vim.diagnostic.config({
update_in_insert = false, -- i don't get any new error when in insert
})
require("better-diagnostic-virtual-text").setup({
ui = {
wrap_line_after = false, -- wrap the line after this length to avoid the virtual text is too long
left_kept_space = 3, --- the number of spaces kept on the left side of the virtual text, make sure it enough to custom for each line
right_kept_space = 3, --- the number of spaces kept on the right side of the virtual text, make sure it enough to custom for each line
arrow = " ",
up_arrow = " ",
down_arrow = " ",
above = false, -- the virtual text will be displayed above the line
},
priority = 2003, -- the priority of virtual text
inline = false,
})
-- LSP functionality -- =========================
vim.keymap.set("n", "<leader>g1", vim.lsp.buf.hover, { desc = "Hover documentation" }) -- BASIC KEYMAPS
vim.keymap.set("n", "<leader>g2", vim.lsp.buf.definition, { desc = "Go to definition" }) -- =========================
vim.keymap.set("n", "<leader>g3", vim.lsp.buf.declaration, { desc = "Go to declaration" }) vim.keymap.set('n', '<Esc>', '<cmd>nohlsearch<CR>')
vim.keymap.set("n", "<leader>g4", vim.lsp.buf.implementation, { desc = "Go to implementation" }) vim.keymap.set('t', '<Esc><Esc>', '<C-\\><C-n>', { desc = 'Exit terminal mode' })
vim.keymap.set("n", "<leader>g5", vim.lsp.buf.references, { desc = "Show references" })
-- LSP server setup -- Disable arrow keys in normal mode
vim.lsp.config("lua_ls", { cmd = { "lua-language-server" }, filetypes = { "lua" }, root_dir = vim.fs.dirname, on_attach = on_attach }) vim.keymap.set('n', '<left>', '<cmd>echo "Use h to move!!"<CR>')
vim.lsp.config("clangd", { vim.keymap.set('n', '<right>', '<cmd>echo "Use l to move!!"<CR>')
cmd = { "clangd" }, vim.keymap.set('n', '<up>', '<cmd>echo "Use k to move!!"<CR>')
filetypes = { "c","cpp","objc","objcpp" }, vim.keymap.set('n', '<down>', '<cmd>echo "Use j to move!!"<CR>')
on_attach = on_attach ,
init_options = { -- Window navigation
clangdFileStatus = true, vim.keymap.set('n', '<C-Left>', '<C-w><C-h>', { desc = 'Move focus to the left window' })
usePlaceholders = true, vim.keymap.set('n', '<C-Right>', '<C-w><C-l>', { desc = 'Move focus to the right window' })
completeUnimported = true, vim.keymap.set('n', '<C-Down>', '<C-w><C-j>', { desc = 'Move focus to the lower window' })
semanticHighlighting = true} vim.keymap.set('n', '<C-Up>', '<C-w><C-k>', { desc = 'Move focus to the upper window' })
})
vim.lsp.config("nixd", { -- Cheatsheet
cmd = { "nixd" }, vim.keymap.set("n","§", "<cmd>Cheatsheet<CR>")
filetyypes = { "nix" }, require("cheatsheet").setup({
on_attach = on_attach, bundled_cheatsheets = { enabled = { "default" } },
}) bundled_plugin_cheatsheets = { disabled = { "gitsigns.nvim" } }
vim.lsp.config("pylsp", { })
cmd = { "pylsp" },
filetypes = { "python" }, -- Highlight yanked text
on_attach = on_attach, vim.api.nvim_create_autocmd('TextYankPost', {
settings = { desc = 'Highlight on yank',
pylsp = { group = vim.api.nvim_create_augroup('kickstart-highlight-yank', { clear = true }),
plugins = { callback = function() vim.highlight.on_yank() end,
pylsp_mypy = { enabled = true }, })
jedi_completion = { fuzzy = true }
-- ========================
-- terminal
-- =======================
require("runner-nvim").setup({
position = 'right', -- position of the terminal window when using the shell_handler
-- can be: top, left, right, bottom
-- will be overwritten when using the telescope mapping to open horizontally or vertically
width = 80, -- width of window when position is left or right
height = 10, -- height of window when position is top or bottom
handlers = {
lua = function(bufnr)
vim.print('Running lua file in buffer ' .. bufnr)
-- Run the file here
end
} }
} })
}
})
vim.lsp.config("texlab", { cmd = { "texlab" }, filetypes = { "tex" }, on_attach = on_attach })
vim.lsp.enable({ "lua_ls", "clangd", "pylsp", "texlab", "nixd"}) vim.keymap.set("n", "<leader><leader>", function() require("runner-nvim").run() end)
-- ========================= -- =========================
-- DASHBOARD -- SCROLLBAR
-- ========================= -- =========================
require('dashboard').setup { require("scrollbar").setup()
theme = 'hyper',
config = {
header = {
" ... ... . ",
" .=*8888n..\"%888: @88> ",
" X ?8888f '8888 u. ... .. %8P .. . : ",
" 88x. '8888X 8888> .u ...ue888b :~\"\"888h.:^\"888: . .888: x888 x888. ",
"'8888k 8888X '\"*8h. ud8888. 888R Y888r 8X `8888X 8888> .@88u ~`8888~'888X`?888f` ",
" \"8888 X888X .xH8 :888'8888. 888R I888> X888n. 8888X ?888> '\"888E` X888 888X '888> ",
" `8\" X888!:888X d888 '88%\" 888R I888> '88888 8888X ?**h. 888E X888 888X '888> ",
" =~` X888 X888X 8888.+\" 888R I888> `*88 8888~ x88x. 888E X888 888X '888> ",
" :h. X8*` !888X 8888L u8888cJ888 ..<\" 88*` 88888X 888E X888 888X '888> ",
" X888xX\" '8888..: '8888c. .+ \"*888*P\" ..XC. `*8888k 888& \"*88%\"\"*88\" '888!` ",
":~`888f '*888*\" \"88888% 'Y\" :888888H. `%88> R888\" `~ \" `\"` ",
" \"\" `\"` \"YP' < `\"888888: X\" \"\" ",
" %888888x.-` ",
" \"\"**\"\" ",
"",
""
},
shortcut = { { desc = " Open File Tree", group = "", key = 't', action = 'NvimTreeOpen' } },
packages = { enable = false },
project = { enable = true, limit = 8, icon = ' New file', action = 'Telescope find_files cwd=' },
mru = { limit = 10, icon = ' History' },
footer = {},
}
}
-- jumps cursor when was last cursor last time -- =========================
require("nvim-lastplace").setup({ -- UFO FOLDING
-- Filetypes to ignore -- =========================
ignore_filetypes = { vim.o.foldcolumn = '1'
"gitcommit", "gitrebase", "svn", "hgcommit", "xxd", "COMMIT_EDITMSG" vim.o.foldlevel = 99
vim.o.foldlevelstart = 99
vim.o.foldenable = true
vim.keymap.set('n', '<leader>1', "<cmd>foldopen<CR>")
vim.keymap.set('n', '<leader>2', "<cmd>foldclose<CR>")
require('ufo').setup({
provider_selector = function() return {'treesitter', 'indent'} end
})
-- =========================
-- treesitter
-- ========================
require('nvim-treesitter').setup({
ensure_installed = {},
highlight = {
enable = true,
additional_vim_regex_highlighting = false,
}, },
indent = { enable = true },
-- Buffer types to ignore
ignore_buftypes = {
"quickfix", "nofile", "help", "terminal"
},
-- Center cursor after jumping
center_on_jump = true,
-- Only jump if target line is not visible
jump_only_if_not_visible = false,
-- Minimum lines required to enable jumping
min_lines = 10,
-- Maximum line to jump to (0 = no limit)
max_line = 0,
-- Open folds after jumping
open_folds = true,
-- Enable debug messages
debug = false,
}) })
-- ====================== -- =========================
-- gruvbox -- NVIM-TREE
-- ====================== -- =========================
vim.g.loaded_netrw = 1
vim.g.loaded_netrwPlugin = 1
require("nvim-tree").setup({
sort = { sorter = "case_sensitive" },
view = { width = 30 },
renderer = { group_empty = true },
filters = { dotfiles = true },
})
require("gruvbox").setup({ -- =========================
terminal_colors = false, -- add neovim terminal colors -- CMP CONFIGURATION
undercurl = true, -- =========================
underline = true, local cmp = require'cmp'
bold = true, cmp.setup({
italic = { snippet = { expand = function(args) vim.fn["vsnip#anonymous"](args.body) end },
strings = false, mapping = cmp.mapping.preset.insert({
emphasis = true, ['<C-b>'] = cmp.mapping.scroll_docs(-4),
comments = true, ['<C-f>'] = cmp.mapping.scroll_docs(4),
operators = false, ['<C-Space>'] = cmp.mapping.complete(),
folds = true, ['<C-e>'] = cmp.mapping.abort(),
}, ['<CR>'] = cmp.mapping.confirm({ select = true }),
strikethrough = true, }),
invert_selection = false, sources = cmp.config.sources({ { name = 'nvim_lsp' }, { name = 'vsnip' } }, { { name = 'buffer' } }),
invert_signs = false, })
invert_tabline = false,
inverse = true, -- invert background for search, diffs, statuslines and errors cmp.setup.cmdline({ '/', '?' }, { mapping = cmp.mapping.preset.cmdline(), sources = { { name = 'buffer' } } })
contrast = "hard", -- can be "hard", "soft" or empty string cmp.setup.cmdline(':', { mapping = cmp.mapping.preset.cmdline(), sources = cmp.config.sources({ { name = 'path' } }, { { name = 'cmdline' } }), matching = { disallow_symbol_nonprefix_matching = false } })
palette_overrides = { -- for overrides see https://github.com/ellisonleao/gruvbox.nvim/blob/main/lua/gruvbox.lua
dark0_hard = "#241F17" -- =========================
}, -- LSP CONFIGURATION
overrides = { -- =========================
String = {fg = "#FFB878", italic = false}, local capabilities = require('cmp_nvim_lsp').default_capabilities()
FoldColumn = {fg = faded_orange, bg = dark0_hard}
}, -- Diagnostics
dim_inactive = false, vim.keymap.set("n", "<leader>e1", function() vim.diagnostic.jump({ prev=true, count = 1 }) end, { desc = "Previous diagnostic" })
transparent_mode = false, vim.keymap.set("n", "<leader>e2", function() vim.diagnostic.jump({ prev=false, count = 1 }) end, { desc = "Next diagnostic" })
vim.keymap.set("n", "<leader>e3", vim.diagnostic.open_float, { desc = "Show diagnostic" })
vim.keymap.set("n", "<leader>e4", vim.diagnostic.setloclist, { desc = "Diagnostic list" })
vim.diagnostic.config({
update_in_insert = false, -- i don't get any new error when in insert
})
require("better-diagnostic-virtual-text").setup({
ui = {
wrap_line_after = false, -- wrap the line after this length to avoid the virtual text is too long
left_kept_space = 3, --- the number of spaces kept on the left side of the virtual text, make sure it enough to custom for each line
right_kept_space = 3, --- the number of spaces kept on the right side of the virtual text, make sure it enough to custom for each line
arrow = " ",
up_arrow = " ",
down_arrow = " ",
above = false, -- the virtual text will be displayed above the line
},
priority = 2003, -- the priority of virtual text
inline = false,
})
-- LSP functionality
vim.keymap.set("n", "<leader>g1", vim.lsp.buf.hover, { desc = "Hover documentation" })
vim.keymap.set("n", "<leader>g2", vim.lsp.buf.definition, { desc = "Go to definition" })
vim.keymap.set("n", "<leader>g3", vim.lsp.buf.declaration, { desc = "Go to declaration" })
vim.keymap.set("n", "<leader>g4", vim.lsp.buf.implementation, { desc = "Go to implementation" })
vim.keymap.set("n", "<leader>g5", vim.lsp.buf.references, { desc = "Show references" })
-- LSP server setup
vim.lsp.config("lua_ls", { cmd = { "lua-language-server" }, filetypes = { "lua" }, root_dir = vim.fs.dirname, on_attach = on_attach })
vim.lsp.config("clangd", {
cmd = { "clangd" },
filetypes = { "c","cpp","objc","objcpp" },
on_attach = on_attach ,
init_options = {
clangdFileStatus = true,
usePlaceholders = true,
completeUnimported = true,
semanticHighlighting = true}
})
vim.lsp.config("nixd", {
cmd = { "nixd" },
filetyypes = { "nix" },
on_attach = on_attach,
})
vim.lsp.config("pylsp", {
cmd = { "pylsp" },
filetypes = { "python" },
on_attach = on_attach,
settings = {
pylsp = {
plugins = {
pylsp_mypy = { enabled = true },
jedi_completion = { fuzzy = true }
}
}
}
}) })
vim.opt.termguicolors = false vim.lsp.config("texlab", { cmd = { "texlab" }, filetypes = { "tex" }, on_attach = on_attach })
vim.o.background = "dark"
vim.cmd("colorscheme gruvbox") vim.lsp.enable({ "lua_ls", "clangd", "pylsp", "texlab", "nixd"})
-- ========================= -- =========================
-- LUALINE -- DASHBOARD
-- ========================= -- =========================
require('lualine').setup { options = { theme = "gruvbox_dark" } } require('dashboard').setup {
theme = 'hyper',
config = {
header = {
" ... ... . ",
" .=*8888n..\"%888: @88> ",
" X ?8888f '8888 u. ... .. %8P .. . : ",
" 88x. '8888X 8888> .u ...ue888b :~\"\"888h.:^\"888: . .888: x888 x888. ",
"'8888k 8888X '\"*8h. ud8888. 888R Y888r 8X `8888X 8888> .@88u ~`8888~'888X`?888f` ",
" \"8888 X888X .xH8 :888'8888. 888R I888> X888n. 8888X ?888> '\"888E` X888 888X '888> ",
" `8\" X888!:888X d888 '88%\" 888R I888> '88888 8888X ?**h. 888E X888 888X '888> ",
" =~` X888 X888X 8888.+\" 888R I888> `*88 8888~ x88x. 888E X888 888X '888> ",
" :h. X8*` !888X 8888L u8888cJ888 ..<\" 88*` 88888X 888E X888 888X '888> ",
" X888xX\" '8888..: '8888c. .+ \"*888*P\" ..XC. `*8888k 888& \"*88%\"\"*88\" '888!` ",
":~`888f '*888*\" \"88888% 'Y\" :888888H. `%88> R888\" `~ \" `\"` ",
" \"\" `\"` \"YP' < `\"888888: X\" \"\" ",
" %888888x.-` ",
" \"\"**\"\" ",
"",
""
},
shortcut = { { desc = " Open File Tree", group = "", key = 't', action = 'NvimTreeOpen' } },
packages = { enable = false },
project = { enable = true, limit = 8, icon = ' New file', action = 'Telescope find_files cwd=' },
mru = { limit = 10, icon = ' History' },
footer = {},
}
}
-- jumps cursor when was last cursor last time
require("nvim-lastplace").setup({
-- Filetypes to ignore
ignore_filetypes = {
"gitcommit", "gitrebase", "svn", "hgcommit", "xxd", "COMMIT_EDITMSG"
},
-- Buffer types to ignore
ignore_buftypes = {
"quickfix", "nofile", "help", "terminal"
},
-- Center cursor after jumping
center_on_jump = true,
-- Only jump if target line is not visible
jump_only_if_not_visible = false,
-- Minimum lines required to enable jumping
min_lines = 10,
-- Maximum line to jump to (0 = no limit)
max_line = 0,
-- Open folds after jumping
open_folds = true,
-- Enable debug messages
debug = false,
})
-- ======================
-- gruvbox
-- ======================
require("gruvbox").setup({
terminal_colors = false, -- add neovim terminal colors
undercurl = true,
underline = true,
bold = true,
italic = {
strings = false,
emphasis = true,
comments = true,
operators = false,
folds = true,
},
strikethrough = true,
invert_selection = false,
invert_signs = false,
invert_tabline = false,
inverse = true, -- invert background for search, diffs, statuslines and errors
contrast = "hard", -- can be "hard", "soft" or empty string
palette_overrides = { -- for overrides see https://github.com/ellisonleao/gruvbox.nvim/blob/main/lua/gruvbox.lua
dark0_hard = "#241F17"
},
overrides = {
String = {fg = "#FFB878", italic = false},
FoldColumn = {fg = faded_orange, bg = dark0_hard}
},
dim_inactive = false,
transparent_mode = false,
})
vim.opt.termguicolors = false
vim.o.background = "dark"
vim.cmd("colorscheme gruvbox")
-- =========================
-- LUALINE
-- =========================
require('lualine').setup { options = { theme = "gruvbox_dark" } }
--==================0 --==================0
-- Some utils -- Some utils
--================== --==================
vim.keymap.set('n', '<leader>r1', '<cmd>Fugit2<CR>', { desc = 'Open git helper' }) vim.keymap.set('n', '<leader>r1', '<cmd>Fugit2<CR>', { desc = 'Open git helper' })
-- ========================= -- =========================
-- telescope -- telescope
-- ======================= -- =======================
local builtin = require('telescope.builtin') local builtin = require('telescope.builtin')
vim.keymap.set('n', '<leader>f1', builtin.find_files, { desc = 'Telescope find files' }) vim.keymap.set('n', '<leader>f1', builtin.find_files, { desc = 'Telescope find files' })
vim.keymap.set('n', '<leader>f2', builtin.live_grep, { desc = 'Telescope live grep' }) vim.keymap.set('n', '<leader>f2', builtin.live_grep, { desc = 'Telescope live grep' })
vim.keymap.set('n', '<leader>f3', builtin.buffers, { desc = 'Telescope buffers' }) vim.keymap.set('n', '<leader>f3', builtin.buffers, { desc = 'Telescope buffers' })
vim.keymap.set('n', '<leader>f4', builtin.help_tags, { desc = 'Telescope help tags' }) vim.keymap.set('n', '<leader>f4', builtin.help_tags, { desc = 'Telescope help tags' })
-- Disable relative numbers even if plugins override -- Disable relative numbers even if plugins override
vim.api.nvim_create_autocmd("VimEnter", { callback = function() vim.opt.colorcolumn = ""; vim.opt.relativenumber = false end }) vim.api.nvim_create_autocmd("VimEnter", { callback = function() vim.opt.colorcolumn = ""; vim.opt.relativenumber = false end })
''; '';
}; };
} }
+14 -6
View File
@@ -1,12 +1,20 @@
{ config, pkgs, ... }:
{ {
config,
pkgs,
...
}: {
programs.obsidian = { programs.obsidian = {
enable = true; enable = true;
vaults = { vaults = {
miscellanious = { enable = true; target = "/Documents/Notes/miscellanious"; }; miscellanious = {
work = { enable = true; target = "/Documents/Notes/work"; }; enable = true;
target = "/Documents/Notes/miscellanious";
};
work = {
enable = true;
target = "/Documents/Notes/work";
};
}; };
defaultSettings = { defaultSettings = {
@@ -14,8 +22,8 @@
extraFiles = { extraFiles = {
".obsidian/themes/gruvbox/manifest.json" = ../../other/obsidian-theme/manifest.json; ".obsidian/themes/gruvbox/manifest.json" = ../../other/obsidian-theme/manifest.json;
".obsidian/themes/gruvbox/obsidian.css" = ../../other/obsidian-theme/obsidian.css; ".obsidian/themes/gruvbox/obsidian.css" = ../../other/obsidian-theme/obsidian.css;
".obsidian/themes/gruvbox/theme.css" = ../../other/obsidian-theme/theme.css; ".obsidian/themes/gruvbox/theme.css" = ../../other/obsidian-theme/theme.css;
}; };
}; };
}; };
+5 -6
View File
@@ -1,17 +1,16 @@
# pulled from https://codeberg.org/zacoons/rivendell-hyprdots # pulled from https://codeberg.org/zacoons/rivendell-hyprdots
{ {
config, config,
pkgs, pkgs,
... ...
}: { }: {
qt.enable =true; qt.enable = true;
programs.quickshell = { programs.quickshell = {
systemd.enable = true; systemd.enable = true;
enable = true; enable = true;
}; };
home.file.".config/quickshell" = { home.file.".config/quickshell" = {
source = ../../other/quickshell; source = ../../other/quickshell;
recursive = true; recursive = true;
}; };
} }
+108 -108
View File
@@ -3,13 +3,13 @@
# https://chatgpt.com/c/69da11b3-ba24-8331-b7b0-a58a72e69d42 # https://chatgpt.com/c/69da11b3-ba24-8331-b7b0-a58a72e69d42
# at your risk and perils # at your risk and perils
# click on the icon to get a notification with state, percentage and wattage # click on the icon to get a notification with state, percentage and wattage
{ lib {
, stdenv lib,
, qt6 stdenv,
, pkg-config qt6,
, pkgs pkg-config,
pkgs,
}: }:
stdenv.mkDerivation { stdenv.mkDerivation {
pname = "qtbatticon"; pname = "qtbatticon";
version = "1.0"; version = "1.0";
@@ -17,137 +17,137 @@ stdenv.mkDerivation {
src = pkgs.writeTextFile { src = pkgs.writeTextFile {
name = "qtbatticon.cpp"; name = "qtbatticon.cpp";
text = '' text = ''
#include <QApplication> #include <QApplication>
#include <QSystemTrayIcon> #include <QSystemTrayIcon>
#include <QTimer> #include <QTimer>
#include <QFile> #include <QFile>
#include <QTextStream> #include <QTextStream>
#include <QIcon> #include <QIcon>
#include <QString> #include <QString>
#include <QDebug> #include <QDebug>
#include <cstdlib> #include <cstdlib>
QString readFile(const QString &path) { QString readFile(const QString &path) {
QFile f(path); QFile f(path);
if (!f.open(QIODevice::ReadOnly)) return ""; if (!f.open(QIODevice::ReadOnly)) return "";
QTextStream in(&f); QTextStream in(&f);
return in.readAll().trimmed(); return in.readAll().trimmed();
} }
int readInt(const QString &path) { int readInt(const QString &path) {
return readFile(path).toInt(); return readFile(path).toInt();
} }
double readDouble(const QString &path) { double readDouble(const QString &path) {
QFile f(path); QFile f(path);
if (!f.open(QIODevice::ReadOnly)) return 0; if (!f.open(QIODevice::ReadOnly)) return 0;
QTextStream in(&f); QTextStream in(&f);
return in.readAll().trimmed().toDouble(); return in.readAll().trimmed().toDouble();
} }
int toStep(int capacity) { int toStep(int capacity) {
return (capacity / 10) * 10; return (capacity / 10) * 10;
} }
QString pad3(int n) { QString pad3(int n) {
return QString("%1").arg(n, 3, 10, QChar('0')); return QString("%1").arg(n, 3, 10, QChar('0'));
} }
double getPowerW(const QString &batPath) { double getPowerW(const QString &batPath) {
double current_uA = readDouble(batPath + "/current_now"); double current_uA = readDouble(batPath + "/current_now");
double voltage_uV = readDouble(batPath + "/voltage_now"); double voltage_uV = readDouble(batPath + "/voltage_now");
if (current_uA > 0 && voltage_uV > 0) { if (current_uA > 0 && voltage_uV > 0) {
return (current_uA * voltage_uV) / 1e12; return (current_uA * voltage_uV) / 1e12;
} }
return -1; return -1;
} }
QIcon batteryIcon(int capacity, bool charging) { QIcon batteryIcon(int capacity, bool charging) {
int step = toStep(capacity); int step = toStep(capacity);
QString num = pad3(step); QString num = pad3(step);
QString base = "/run/current-system/sw/share/icons/Papirus/24x24/panel/"; QString base = "/run/current-system/sw/share/icons/Papirus/24x24/panel/";
QString file; QString file;
if (charging) { if (charging) {
file = base + "battery-" + num + "-charging.svg"; file = base + "battery-" + num + "-charging.svg";
} else { } else {
file = base + "battery-" + num + ".svg"; file = base + "battery-" + num + ".svg";
} }
QIcon icon(file); QIcon icon(file);
if (icon.isNull()) { if (icon.isNull()) {
qDebug() << "FAILED icon:" << file; qDebug() << "FAILED icon:" << file;
icon = QIcon(base + "battery-100.svg"); icon = QIcon(base + "battery-100.svg");
} }
return icon; return icon;
} }
void sendNotification(const QString &title, const QString &body) { void sendNotification(const QString &title, const QString &body) {
QString cmd = "notify-send \"" + title + "\" \"" + body + "\""; QString cmd = "notify-send \"" + title + "\" \"" + body + "\"";
system(cmd.toUtf8().constData()); system(cmd.toUtf8().constData());
} }
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
QApplication app(argc, argv); QApplication app(argc, argv);
QString batPath = "/sys/class/power_supply/BAT1"; QString batPath = "/sys/class/power_supply/BAT1";
QSystemTrayIcon tray; QSystemTrayIcon tray;
auto updateIcon = [&]() { auto updateIcon = [&]() {
int capacity = readInt(batPath + "/capacity"); int capacity = readInt(batPath + "/capacity");
QString status = readFile(batPath + "/status"); QString status = readFile(batPath + "/status");
bool charging = status.contains("Charging"); bool charging = status.contains("Charging");
tray.setIcon(batteryIcon(capacity, charging)); tray.setIcon(batteryIcon(capacity, charging));
}; };
auto notify = [&]() { auto notify = [&]() {
int capacity = readInt(batPath + "/capacity"); int capacity = readInt(batPath + "/capacity");
QString status = readFile(batPath + "/status"); QString status = readFile(batPath + "/status");
bool charging = status.contains("Charging"); bool charging = status.contains("Charging");
bool discharging = status.contains("Discharging"); bool discharging = status.contains("Discharging");
double power = getPowerW(batPath); double power = getPowerW(batPath);
QString state; QString state;
if (charging) state = "Charging"; if (charging) state = "Charging";
else if (discharging) state = "Discharging"; else if (discharging) state = "Discharging";
else state = status; else state = status;
QString powerStr = (power > 0.01) QString powerStr = (power > 0.01)
? QString::number(power, 'f', 2) + " W" ? QString::number(power, 'f', 2) + " W"
: "N/A"; : "N/A";
QString msg = QString msg =
QString("%1\n%2%\n%3") QString("%1\n%2%\n%3")
.arg(state) .arg(state)
.arg(capacity) .arg(capacity)
.arg(powerStr); .arg(powerStr);
sendNotification("Battery status", msg); sendNotification("Battery status", msg);
}; };
QObject::connect(&tray, &QSystemTrayIcon::activated, QObject::connect(&tray, &QSystemTrayIcon::activated,
[&](QSystemTrayIcon::ActivationReason r) { [&](QSystemTrayIcon::ActivationReason r) {
if (r == QSystemTrayIcon::Trigger) { if (r == QSystemTrayIcon::Trigger) {
notify(); notify();
} }
}); });
updateIcon(); updateIcon();
tray.setVisible(true); tray.setVisible(true);
QTimer timer; QTimer timer;
QObject::connect(&timer, &QTimer::timeout, updateIcon); QObject::connect(&timer, &QTimer::timeout, updateIcon);
timer.start(5000); timer.start(5000);
return app.exec(); return app.exec();
} }
''; '';
}; };
+6 -9
View File
@@ -1,17 +1,14 @@
# creates and maintains cache file for the notification history # creates and maintains cache file for the notification history
{ {writeShellApplication, ...}:
writeShellApplication,
...
}:
writeShellApplication { writeShellApplication {
name = "QS-notifycache"; name = "QS-notifycache";
runtimeInputs = [ runtimeInputs = [
]; ];
text = '' text = ''
CACHE="$HOME/.cache/notify_history" CACHE="$HOME/.cache/notify_history"
# Create or erase existing cache # Create or erase existing cache
mkdir -p "$(dirname "$CACHE")" mkdir -p "$(dirname "$CACHE")"
: > "$CACHE" # truncate file : > "$CACHE" # truncate file
echo "Notification history initialized at $(date)" >> "$CACHE" echo "Notification history initialized at $(date)" >> "$CACHE"
''; '';
} }
+1 -4
View File
@@ -1,7 +1,4 @@
{ {writeShellApplication, ...}:
writeShellApplication,
...
}:
writeShellApplication { writeShellApplication {
name = "QS-notifyhistory"; name = "QS-notifyhistory";
runtimeInputs = [ runtimeInputs = [
+62 -62
View File
@@ -1,80 +1,80 @@
{ {
writeShellApplication, writeShellApplication,
ripgrep, ripgrep,
gawkInteractive, gawkInteractive,
iproute2, iproute2,
coreutils, coreutils,
procps, procps,
upower, upower,
... ...
}: }:
writeShellApplication { writeShellApplication {
name = "QS-sysinfo"; name = "QS-sysinfo";
runtimeInputs = [ runtimeInputs = [
ripgrep ripgrep
gawkInteractive gawkInteractive
iproute2 iproute2
coreutils coreutils
procps procps
upower upower
]; ];
text = '' text = ''
# Pad CPU, MEM, DISK to 2 chars (right-aligned) # Pad CPU, MEM, DISK to 2 chars (right-aligned)
cpu=$(awk '/^cpu /{printf("%.0f", ($2+$4)*100/($2+$4+$5))}' /proc/stat)
cpu=$(printf "%2s" "$cpu")
sum=0 cpu=$(awk '/^cpu /{printf("%.0f", ($2+$4)*100/($2+$4+$5))}' /proc/stat)
count=0 cpu=$(printf "%2s" "$cpu")
for f in /sys/class/hwmon/hwmon*/temp*_input; do sum=0
if [ -r "$f" ]; then count=0
val=$(cat "$f" 2>/dev/null) || continue
sum=$((sum + val))
count=$((count + 1))
fi
done
temp=$(( sum / count / 1000 )) for f in /sys/class/hwmon/hwmon*/temp*_input; do
if [ -r "$f" ]; then
val=$(cat "$f" 2>/dev/null) || continue
sum=$((sum + val))
count=$((count + 1))
fi
done
sum=0 temp=$(( sum / count / 1000 ))
count=0
for f in /sys/class/hwmon/hwmon*/fan*_input; do sum=0
if [ -r "$f" ]; then count=0
val=$(cat "$f" 2>/dev/null) || continue
sum=$((sum + val))
count=$((count + 1))
fi
done
fan=$(( sum / count ))
fan=$(printf "%4s" "$fan")
mem=$(free | awk '/Mem:/ {printf("%.0f",$3/$2*100)}') for f in /sys/class/hwmon/hwmon*/fan*_input; do
mem=$(printf "%2s" "$mem") if [ -r "$f" ]; then
val=$(cat "$f" 2>/dev/null) || continue
sum=$((sum + val))
count=$((count + 1))
fi
done
fan=$(( sum / count ))
fan=$(printf "%4s" "$fan")
disk=$(df / | awk 'NR==2 {gsub("%",""); print $5}') mem=$(free | awk '/Mem:/ {printf("%.0f",$3/$2*100)}')
disk=$(printf "%2s" "$disk") mem=$(printf "%2s" "$mem")
# Pad POWER to 5 chars (XX.XX) disk=$(df / | awk 'NR==2 {gsub("%",""); print $5}')
power=$(upower -b | awk -F: '/energy-rate/ {gsub(/^[ \t]+/, "", $2); split($2,a," "); printf("%.2f", a[1])}') disk=$(printf "%2s" "$disk")
power=$(printf "%5s" "$power")
# network calculations # Pad POWER to 5 chars (XX.XX)
iface=$(ip route get 1.1.1.1 | awk '{print $5; exit}') power=$(upower -b | awk -F: '/energy-rate/ {gsub(/^[ \t]+/, "", $2); split($2,a," "); printf("%.2f", a[1])}')
power=$(printf "%5s" "$power")
rx1=$(cat "/sys/class/net/$iface/statistics/rx_bytes") # network calculations
tx1=$(cat "/sys/class/net/$iface/statistics/tx_bytes") iface=$(ip route get 1.1.1.1 | awk '{print $5; exit}')
sleep 1 rx1=$(cat "/sys/class/net/$iface/statistics/rx_bytes")
tx1=$(cat "/sys/class/net/$iface/statistics/tx_bytes")
rx2=$(cat "/sys/class/net/$iface/statistics/rx_bytes") sleep 1
tx2=$(cat "/sys/class/net/$iface/statistics/tx_bytes")
down_speed=$(( (rx2 - rx1) / 1024 )) rx2=$(cat "/sys/class/net/$iface/statistics/rx_bytes")
up_speed=$(( (tx2 - tx1) / 1024 )) tx2=$(cat "/sys/class/net/$iface/statistics/tx_bytes")
# Output JSON down_speed=$(( (rx2 - rx1) / 1024 ))
echo "{\"cpu\":\"$cpu\",\"temp\":\"$temp\",\"fan\":\"$fan\",\"mem\":\"$mem\",\"disk\":\"$disk\",\"power\":\"$power\",\"down\":\"$down_speed\",\"up\":\"$up_speed\"}" up_speed=$(( (tx2 - tx1) / 1024 ))
'';
# Output JSON
echo "{\"cpu\":\"$cpu\",\"temp\":\"$temp\",\"fan\":\"$fan\",\"mem\":\"$mem\",\"disk\":\"$disk\",\"power\":\"$power\",\"down\":\"$down_speed\",\"up\":\"$up_speed\"}"
'';
} }
+36 -36
View File
@@ -1,48 +1,48 @@
# taken and adapted https://github.com/miniMinn24/Battery_Notify with MIT License # taken and adapted https://github.com/miniMinn24/Battery_Notify with MIT License
{ {
writeShellApplication, writeShellApplication,
mplayer, mplayer,
brightnessctl, brightnessctl,
... ...
}: let }: let
NotifySound = ../../assets/battery_notify.mp3; NotifySound = ../../assets/battery_notify.mp3;
in in
writeShellApplication { writeShellApplication {
name = "custom-batterywarning"; name = "custom-batterywarning";
runtimeInputs = [ runtimeInputs = [
mplayer mplayer
brightnessctl brightnessctl
]; ];
text = '' text = ''
# Delay for startup # Delay for startup
sleep 5 sleep 5
playsound() { playsound() {
mplayer ${NotifySound} mplayer ${NotifySound}
} }
while true; do while true; do
Battery_Status="$(cat /sys/class/power_supply/BAT*/status)" Battery_Status="$(cat /sys/class/power_supply/BAT*/status)"
Battery_Capacity="$(cat /sys/class/power_supply/BAT*/capacity)" Battery_Capacity="$(cat /sys/class/power_supply/BAT*/capacity)"
if [ "$Battery_Status" == "Discharging" ]; then if [ "$Battery_Status" == "Discharging" ]; then
if [ "$Battery_Capacity" -le 20 ] && [ "$Battery_Capacity" -ge 10 ]; then if [ "$Battery_Capacity" -le 20 ] && [ "$Battery_Capacity" -ge 10 ]; then
notify-send -e -u critical "Battery Low!" "Power running out: <b>''${Battery_Capacity}%</b>" notify-send -e -u critical "Battery Low!" "Power running out: <b>''${Battery_Capacity}%</b>"
playsound playsound
sleep 180 sleep 180
elif [ "$Battery_Capacity" -lt 10 ]; then elif [ "$Battery_Capacity" -lt 10 ]; then
notify-send -e -u critical "Battery Low!" "<b>Save your works</b> before immediate shutdown." notify-send -e -u critical "Battery Low!" "<b>Save your works</b> before immediate shutdown."
playsound playsound
sleep 180 sleep 180
fi fi
else else
sleep 120 sleep 120
fi fi
done done
''; '';
} }
-1
View File
@@ -5,7 +5,6 @@
rsync, rsync,
... ...
}: }:
writeShellApplication { writeShellApplication {
name = "custom-obsidianbackup"; name = "custom-obsidianbackup";
runtimeInputs = [ runtimeInputs = [
+1 -2
View File
@@ -5,7 +5,6 @@
ripgrep, ripgrep,
... ...
}: }:
writeShellApplication { writeShellApplication {
name = "custom-obsidianvaults"; name = "custom-obsidianvaults";
runtimeInputs = [ runtimeInputs = [
@@ -42,5 +41,5 @@ writeShellApplication {
# Exit the kitty terminal after selection # Exit the kitty terminal after selection
pkill -f "kitty.*Select Obsidian vault" pkill -f "kitty.*Select Obsidian vault"
exit exit
''; '';
} }
+230 -230
View File
@@ -10,257 +10,257 @@ writeShellApplication {
nix nix
]; ];
text = '' text = ''
set -euo pipefail set -euo pipefail
## Defaults ## Defaults
keepGensDef=30; keepDaysDef=7 keepGensDef=30; keepDaysDef=7
keepGens=$keepGensDef; keepDays=$keepDaysDef keepGens=$keepGensDef; keepDays=$keepDaysDef
## Usage ## Usage
usage () { usage () {
printf "Usage:\n\t ./trim-generations.sh <keep-generations> <keep-days> <profile> \n\n printf "Usage:\n\t ./trim-generations.sh <keep-generations> <keep-days> <profile> \n\n
(defaults are: Keep-Gens=%d Keep-Days=%d Profile=user)\n\n" "$keepGensDef" "$keepDaysDef" (defaults are: Keep-Gens=%d Keep-Days=%d Profile=user)\n\n" "$keepGensDef" "$keepDaysDef"
printf "If you enter any parameters, you must enter all three, or none to use defaults.\n" printf "If you enter any parameters, you must enter all three, or none to use defaults.\n"
printf "Example:\n\t trim-generations.sh 15 10 home-manager\n" printf "Example:\n\t trim-generations.sh 15 10 home-manager\n"
printf " this will work on the home-manager profile and keep all generations from the\n" printf " this will work on the home-manager profile and keep all generations from the\n"
printf "last 10 days, and keep at least 15 generations no matter how old.\n" printf "last 10 days, and keep at least 15 generations no matter how old.\n"
printf "\nProfiles available are:\tuser, home-manager, channels, system (root)\n" printf "\nProfiles available are:\tuser, home-manager, channels, system (root)\n"
printf "\n-h or --help prints this help text." printf "\n-h or --help prints this help text."
} }
if [ $# -eq 1 ]; then # if help requested if [ $# -eq 1 ]; then # if help requested
if [ "$1" = "-h" ]; then if [ "$1" = "-h" ]; then
usage usage
exit 1; exit 1;
fi
if [ "$1" = "--help" ]; then
usage
exit 2;
fi
printf "Dont recognise your option exiting..\n\n"
usage
exit 3;
elif [ $# -eq 0 ]; then # print the defaults
printf "The current defaults are:\n Keep-Gens=%d Keep-Days=%d \n\n" "$keepGensDef" "$keepDaysDef"
read -r -p "Keep these defaults? (y/n):" answer
case "$answer" in
[yY1] )
printf "Using defaults..\n"
;;
[nN0] ) printf "ok, doing nothing, exiting..\n"
exit 6;
;;
* ) printf "%b" "Doing nothing, exiting.."
exit 7;
;;
esac
fi
## Handle parameters (and change if root)
if [[ $EUID -ne 0 ]]; then # if not root
profile=$(readlink /home/"$USER"/.nix-profile)
else
if [ -d /nix/var/nix/profiles/system ]; then # maybe this or the other
profile="/nix/var/nix/profiles/system"
elif [ -d /nix/var/nix/profiles/default ]; then
profile="/nix/var/nix/profiles/default"
else
echo "Cant find profile for root. Exiting"
exit 8
fi
fi
if (( $# < 1 )); then
printf "Keeping default: %d generations OR %d days, whichever is more\n" "$keepGensDef" "$keepDaysDef"
elif [[ $# -le 2 ]]; then
printf "\nError: Not enough arguments.\n\n" >&2
usage
exit 1
elif (( $# > 4)); then
printf "\nError: Too many arguments.\n\n" >&2
usage
exit 2
else
if [ "$1" -lt 1 ]; then
printf "using Gen numbers less than 1 not recommended. Setting to min=1\n"
read -r -p "is that ok? (y/n): " answer
printf "%s" "$answer"
case "$answer" in
[yY1] )
printf "ok, continuing..\n"
;;
[nN0] )
printf "ok, doing nothing, exiting..\n"
exit 6;
;;
* )
printf "%b" "Doing nothing, exiting.."
exit 7;
;;
esac
fi
if [ "$2" -lt 0 ]; then
printf "using negative days number not recommended. Setting to min=0\n"
read -r -p "is that ok? (y/n): " answer
case "$answer" in
[yY1] )
printf "ok, continuing..\n"
;;
[nN0] )
printf "ok, doing nothing, exiting..\n"
exit 6;
;;
* )
printf "%b" "Doing nothing, exiting.."
exit 7;
;;
esac
fi
keepGens=$1; keepDays=$2;
(( keepGens < 1 )) && keepGens=1
(( keepDays < 0 )) && keepDays=0
if [[ $EUID -ne 0 ]]; then
if [[ $3 == "user" ]] || [[ $3 == "default" ]]; then
profile=$(readlink /home/"$USER"/.nix-profile)
elif [[ $3 == "home-manager" ]]; then
# home-manager defaults to $XDG_STATE_HOME; otherwise, use
# `home-manager generations` and `nix-store --query --roots
# /nix/store/...` to figure out what reference is keeping the old
# generations alive.
profile="''${XDG_STATE_HOME:-$HOME/.local/state}/nix/profiles/home-manager"
elif [[ $3 == "channels" ]]; then
profile="/nix/var/nix/profiles/per-user/$USER/channels"
else
printf "\nError: Do not understand your third argument. Should be one of: (user / home-manager/ channels)\n\n"
usage
exit 3
fi fi
if [ "$1" = "--help" ]; then
usage
exit 2;
fi
printf "Dont recognise your option exiting..\n\n"
usage
exit 3;
elif [ $# -eq 0 ]; then # print the defaults
printf "The current defaults are:\n Keep-Gens=%d Keep-Days=%d \n\n" "$keepGensDef" "$keepDaysDef"
read -r -p "Keep these defaults? (y/n):" answer
case "$answer" in
[yY1] )
printf "Using defaults..\n"
;;
[nN0] ) printf "ok, doing nothing, exiting..\n"
exit 6;
;;
* ) printf "%b" "Doing nothing, exiting.."
exit 7;
;;
esac
fi
## Handle parameters (and change if root)
if [[ $EUID -ne 0 ]]; then # if not root
profile=$(readlink /home/"$USER"/.nix-profile)
else else
if [[ $3 == "system" ]]; then if [ -d /nix/var/nix/profiles/system ]; then # maybe this or the other
profile="/nix/var/nix/profiles/system" profile="/nix/var/nix/profiles/system"
elif [[ $3 == "user" ]] || [[ $3 == "default" ]]; then elif [ -d /nix/var/nix/profiles/default ]; then
profile="/nix/var/nix/profiles/default" profile="/nix/var/nix/profiles/default"
else else
printf "\nError: Do not understand your third argument. Should be one of: (user / system)\n\n" echo "Cant find profile for root. Exiting"
usage exit 8
exit 3
fi fi
fi fi
printf "OK! \t Keep Gens = %s \t Keep Days = %s \n\n" "$keepGens" "$keepDays" if (( $# < 1 )); then
printf "Keeping default: %d generations OR %d days, whichever is more\n" "$keepGensDef" "$keepDaysDef"
elif [[ $# -le 2 ]]; then
printf "\nError: Not enough arguments.\n\n" >&2
usage
exit 1
elif (( $# > 4)); then
printf "\nError: Too many arguments.\n\n" >&2
usage
exit 2
else
if [ "$1" -lt 1 ]; then
printf "using Gen numbers less than 1 not recommended. Setting to min=1\n"
read -r -p "is that ok? (y/n): " answer
printf "%s" "$answer"
case "$answer" in
[yY1] )
printf "ok, continuing..\n"
;;
[nN0] )
printf "ok, doing nothing, exiting..\n"
exit 6;
;;
* )
printf "%b" "Doing nothing, exiting.."
exit 7;
;;
esac
fi
if [ "$2" -lt 0 ]; then
printf "using negative days number not recommended. Setting to min=0\n"
read -r -p "is that ok? (y/n): " answer
case "$answer" in
[yY1] )
printf "ok, continuing..\n"
;;
[nN0] )
printf "ok, doing nothing, exiting..\n"
exit 6;
;;
* )
printf "%b" "Doing nothing, exiting.."
exit 7;
;;
esac
fi
keepGens=$1; keepDays=$2;
(( keepGens < 1 )) && keepGens=1
(( keepDays < 0 )) && keepDays=0
if [[ $EUID -ne 0 ]]; then
if [[ $3 == "user" ]] || [[ $3 == "default" ]]; then
profile=$(readlink /home/"$USER"/.nix-profile)
elif [[ $3 == "home-manager" ]]; then
# home-manager defaults to $XDG_STATE_HOME; otherwise, use
# `home-manager generations` and `nix-store --query --roots
# /nix/store/...` to figure out what reference is keeping the old
# generations alive.
profile="''${XDG_STATE_HOME:-$HOME/.local/state}/nix/profiles/home-manager"
elif [[ $3 == "channels" ]]; then
profile="/nix/var/nix/profiles/per-user/$USER/channels"
else
printf "\nError: Do not understand your third argument. Should be one of: (user / home-manager/ channels)\n\n"
usage
exit 3
fi
else
if [[ $3 == "system" ]]; then
profile="/nix/var/nix/profiles/system"
elif [[ $3 == "user" ]] || [[ $3 == "default" ]]; then
profile="/nix/var/nix/profiles/default"
else
printf "\nError: Do not understand your third argument. Should be one of: (user / system)\n\n"
usage
exit 3
fi
fi
printf "OK! \t Keep Gens = %s \t Keep Days = %s \n\n" "$keepGens" "$keepDays"
fi
printf "Operating on profile: %s \t \n\n" "$profile"
## Runs at the end, to decide whether to delete profiles that match chosen parameters.
choose () {
local default="$1"
local prompt="$2"
local answer
read -r -p "$prompt" answer
[ -z "$answer" ] && answer="$default"
case "$answer" in
[yY1] ) #printf "answered yes!\n"
nix-env --delete-generations -p "$profile" "''${!gens[@]}"
exit 0
;;
[nN0] ) printf "Ok doing nothing exiting..\n"
exit 6;
;;
* ) printf "%b" "Unexpected answer '$answer'!" >&2
exit 7;
;;
esac
} # end of function choose
# printf "profile = %s \n\n" "$profile"
## Query nix-env for generations list
#IFS=$'\n' nixGens=( $(nix-env --list-generations -p "$profile" | sed 's:^\s*::; s:\s*$::' | tr '\t' ' ' | tr -s ' ') )
# gave errors replaced by:
mapfile -t nixGens < <(
nix-env --list-generations -p "$profile" |
sed 's:^\s*::; s:\s*$::' |
tr '\t' ' ' |
tr -s ' '
)
timeNow=$(date +%s)
## Get info on oldest generation
IFS=' ' read -r -a oldestGenArr <<< "''${nixGens[0]}"
oldestGen=''${oldestGenArr[0]}
oldestDate=''${oldestGenArr[1]}
printf "%-30s %s\n" "oldest generation:" "$oldestGen"
#oldestDate=''${nixGens[0]:3:19}
printf "%-30s %s\n" "oldest generation created:" "$oldestDate"
oldestTime=$(date -d "$oldestDate" +%s)
oldestElapsedSecs=$((timeNow-oldestTime))
oldestElapsedMins=$((oldestElapsedSecs/60))
oldestElapsedHours=$((oldestElapsedMins/60))
oldestElapsedDays=$((oldestElapsedHours/24))
printf "%-30s %s\n" "minutes before now:" "$oldestElapsedMins"
printf "%-30s %s\n" "hours before now:" "$oldestElapsedHours"
printf "%-30s %s\n\n" "days before now:" "$oldestElapsedDays"
## Get info on current generation
for i in "''${nixGens[@]}"; do
IFS=' ' read -r -a iGenArr <<< "$i"
genNumber=''${iGenArr[0]}
genDate=''${iGenArr[1]}
if [[ "$i" =~ current ]]; then
currentGen=$genNumber
printf "%-30s %s\n" "current generation:" "$currentGen"
currentDate=$genDate
printf "%-30s %s\n" "current generation created:" "$currentDate"
currentTime=$(date -d "$currentDate" +%s)
currentElapsedSecs=$((timeNow-currentTime))
currentElapsedMins=$((currentElapsedSecs/60))
currentElapsedHours=$((currentElapsedMins/60))
currentElapsedDays=$((currentElapsedHours/24))
printf "%-30s %s\n" "minutes before now:" "$currentElapsedMins"
printf "%-30s %s\n" "hours before now:" "$currentElapsedHours"
printf "%-30s %s\n\n" "days before now:" "$currentElapsedDays"
fi fi
done
## Compare oldest and current generations printf "Operating on profile: %s \t \n\n" "$profile"
timeBetweenOldestAndCurrent=$((currentTime-oldestTime))
elapsedDays=$((timeBetweenOldestAndCurrent/60/60/24))
generationsDiff=$((currentGen-oldestGen))
## Figure out what we should do, based on generations and options ## Runs at the end, to decide whether to delete profiles that match chosen parameters.
if [[ elapsedDays -le keepDays ]]; then choose () {
printf "All generations are no more than %s days older than current generation. \nOldest gen days difference from current gen: %s \n\n\tNothing to do!\n" "$keepDays" "$elapsedDays" local default="$1"
exit 4; local prompt="$2"
elif [[ generationsDiff -lt keepGens ]]; then local answer
printf "Oldest generation (%d) is only %d generations behind current (%d). \n\n\t Nothing to do!\n" "$oldestGen" "$generationsDiff" "$currentGen"
exit 5; read -r -p "$prompt" answer
else [ -z "$answer" ] && answer="$default"
printf "\tSomething to do...\n"
declare -a gens case "$answer" in
[yY1] ) #printf "answered yes!\n"
nix-env --delete-generations -p "$profile" "''${!gens[@]}"
exit 0
;;
[nN0] ) printf "Ok doing nothing exiting..\n"
exit 6;
;;
* ) printf "%b" "Unexpected answer '$answer'!" >&2
exit 7;
;;
esac
} # end of function choose
# printf "profile = %s \n\n" "$profile"
## Query nix-env for generations list
#IFS=$'\n' nixGens=( $(nix-env --list-generations -p "$profile" | sed 's:^\s*::; s:\s*$::' | tr '\t' ' ' | tr -s ' ') )
# gave errors replaced by:
mapfile -t nixGens < <(
nix-env --list-generations -p "$profile" |
sed 's:^\s*::; s:\s*$::' |
tr '\t' ' ' |
tr -s ' '
)
timeNow=$(date +%s)
## Get info on oldest generation
IFS=' ' read -r -a oldestGenArr <<< "''${nixGens[0]}"
oldestGen=''${oldestGenArr[0]}
oldestDate=''${oldestGenArr[1]}
printf "%-30s %s\n" "oldest generation:" "$oldestGen"
#oldestDate=''${nixGens[0]:3:19}
printf "%-30s %s\n" "oldest generation created:" "$oldestDate"
oldestTime=$(date -d "$oldestDate" +%s)
oldestElapsedSecs=$((timeNow-oldestTime))
oldestElapsedMins=$((oldestElapsedSecs/60))
oldestElapsedHours=$((oldestElapsedMins/60))
oldestElapsedDays=$((oldestElapsedHours/24))
printf "%-30s %s\n" "minutes before now:" "$oldestElapsedMins"
printf "%-30s %s\n" "hours before now:" "$oldestElapsedHours"
printf "%-30s %s\n\n" "days before now:" "$oldestElapsedDays"
## Get info on current generation
for i in "''${nixGens[@]}"; do for i in "''${nixGens[@]}"; do
IFS=' ' read -r -a iGenArr <<< "$i" IFS=' ' read -r -a iGenArr <<< "$i"
genNumber=''${iGenArr[0]} genNumber=''${iGenArr[0]}
genDiff=$((currentGen-genNumber))
genDate=''${iGenArr[1]} genDate=''${iGenArr[1]}
genTime=$(date -d "$genDate" +%s) if [[ "$i" =~ current ]]; then
elapsedSecs=$((timeNow-genTime)) currentGen=$genNumber
genDaysOld=$((elapsedSecs/60/60/24)) printf "%-30s %s\n" "current generation:" "$currentGen"
if [[ genDaysOld -gt keepDays ]] && [[ genDiff -ge keepGens ]]; then currentDate=$genDate
gens["$genNumber"]="$genDate, $genDaysOld day(s) old" printf "%-30s %s\n" "current generation created:" "$currentDate"
currentTime=$(date -d "$currentDate" +%s)
currentElapsedSecs=$((timeNow-currentTime))
currentElapsedMins=$((currentElapsedSecs/60))
currentElapsedHours=$((currentElapsedMins/60))
currentElapsedDays=$((currentElapsedHours/24))
printf "%-30s %s\n" "minutes before now:" "$currentElapsedMins"
printf "%-30s %s\n" "hours before now:" "$currentElapsedHours"
printf "%-30s %s\n\n" "days before now:" "$currentElapsedDays"
fi fi
done done
printf "\nFound the following generation(s) to delete:\n"
for K in "''${!gens[@]}"; do ## Compare oldest and current generations
printf "generation %d \t ''${gens[$K]}\n" "$K" timeBetweenOldestAndCurrent=$((currentTime-oldestTime))
done elapsedDays=$((timeBetweenOldestAndCurrent/60/60/24))
printf "\n" generationsDiff=$((currentGen-oldestGen))
choose "y" "Do you want to delete these? [Y/n]: "
fi ## Figure out what we should do, based on generations and options
if [[ elapsedDays -le keepDays ]]; then
printf "All generations are no more than %s days older than current generation. \nOldest gen days difference from current gen: %s \n\n\tNothing to do!\n" "$keepDays" "$elapsedDays"
exit 4;
elif [[ generationsDiff -lt keepGens ]]; then
printf "Oldest generation (%d) is only %d generations behind current (%d). \n\n\t Nothing to do!\n" "$oldestGen" "$generationsDiff" "$currentGen"
exit 5;
else
printf "\tSomething to do...\n"
declare -a gens
for i in "''${nixGens[@]}"; do
IFS=' ' read -r -a iGenArr <<< "$i"
genNumber=''${iGenArr[0]}
genDiff=$((currentGen-genNumber))
genDate=''${iGenArr[1]}
genTime=$(date -d "$genDate" +%s)
elapsedSecs=$((timeNow-genTime))
genDaysOld=$((elapsedSecs/60/60/24))
if [[ genDaysOld -gt keepDays ]] && [[ genDiff -ge keepGens ]]; then
gens["$genNumber"]="$genDate, $genDaysOld day(s) old"
fi
done
printf "\nFound the following generation(s) to delete:\n"
for K in "''${!gens[@]}"; do
printf "generation %d \t ''${gens[$K]}\n" "$K"
done
printf "\n"
choose "y" "Do you want to delete these? [Y/n]: "
fi
''; '';
} }