Compare commits

..
3 Commits
Author SHA1 Message Date
Henrik Bakken 56087cff6e nvim updates 2026-10-06 23:14:36 +02:00
Henrik Bakken e1f3e35f9a zsh added krew (k8s tool) to path 2026-10-06 23:07:02 +02:00
Henrik Bakken 7ba1342f8a nvim updates 2026-10-06 23:07:02 +02:00
51 changed files with 903 additions and 1122 deletions
+1
View File
@@ -1,4 +1,5 @@
[general]
enable-osc8=true
log-file=~/aerc.log
[ui]
+12 -4
View File
@@ -108,7 +108,11 @@ ctrl_n_shortcuts = true
## with ^ or end with $, they'll match anywhere in the command.
## For details on the supported regular expression syntax, see
## https://docs.rs/regex/latest/regex/#syntax
history_filter = [ "^exit$", "^ .*", "_secret=" ]
history_filter = [
"^exit$",
"^ .*",
"_secret="
]
## prevent commands run with cwd matching any of these regexes from being written
## to history. Note that these regular expressions are unanchored, i.e. if they don't
@@ -203,10 +207,14 @@ keymap_mode = "auto"
# ]
## Set commands that should be totally stripped and ignored from stats
# common_prefix = [ "sudo" ]
# common_prefix = ["sudo"]
## Set commands that will be completely ignored from stats
# ignored_commands = [ "cd", "ls", "vi" ]
# ignored_commands = [
# "cd",
# "ls",
# "vi"
# ]
[keys]
# Defaults to true. If disabled, using the up/down key won't exit the TUI when scrolled past the first/last entry.
@@ -273,4 +281,4 @@ records = true
# filters = [ "global", "host", "session", "workspace", "directory" ]
[ui]
columns = [ "datetime", "duration", "host", "command" ]
columns = ["datetime", "duration", "host", "command"]
+2 -2
View File
@@ -5,7 +5,7 @@
color_theme = "Default"
#* If the theme set background should be shown, set to False if you want terminal background transparency.
theme_background = false
theme_background = true
#* Sets if 24-bit truecolor should be used, will convert 24-bit colors to 256 color (6x6x6 color cube) if false.
truecolor = true
@@ -27,7 +27,7 @@ presets = "cpu:1:default,proc:0:default cpu:0:default,mem:0:default,net:0:defaul
#* Set to True to enable "h,j,k,l,g,G" keys for directional control in lists.
#* Conflicting keys for h:"help" and k:"kill" is accessible while holding shift.
vim_keys = true
vim_keys = false
#* Disable all mouse events.
disable_mouse = false
+144
View File
@@ -0,0 +1,144 @@
# Whether to enable mouse or not.
mouse = true
# The program to open when the `keys.message_input.editor` keymap is pressed. Set the value to `"default"` to use `$EDITOR`.
editor = "default"
# "default" (unknown), "online", "dnd", "idle", "invisible", "offline"
status = "default"
# Whether to parse and render markdown in messages or not.
markdown = true
hide_blocked_users = true
show_attachment_links = true
# Use autocomplete_limit = 0 to disable autocompleting mentions
# Note: tab completion will still work, but it won't show any list.
autocomplete_limit = 20
# The number of messages to fetch when a text-based channel is selected from guilds tree. The minimum and maximum value is 0 and 100, respectively.
messages_limit = 50
[timestamps]
enabled = true
# https://pkg.go.dev/time#Layout
format = "01-02 15:04:05 (Z07:00)"
[notifications]
enabled = true
# The duration of the sound. Set the value to `0` to use default duration. This is only supported on Unix and Windows.
duration = 0
[notifications.sound]
enabled = true
only_on_ping = true
# Global shortcuts
# Esc: Reset message selection or close the channel selection popup.
[keys]
focus_guilds_tree = "Ctrl+G"
focus_messages_list = "Ctrl+T"
focus_message_input = "Ctrl+Space"
# Cycle focus between the widgets.
focus_previous = "Ctrl+H"
focus_next = "Ctrl+L"
# Hide/show the guilds tree.
toggle_guilds_tree = "Ctrl+B"
quit = "Ctrl+C"
# Log out and remove the authentication token from keyring.
# Requires re-login upon restart.
logout = "Ctrl+D"
# Only while focusing on the guilds tree
[keys.guilds_tree]
select_previous = "Rune[k]"
select_next = "Rune[j]"
select_first = "Rune[g]"
select_last = "Rune[G]"
# Select the currently highlighted text-based channel or expand a guild or channel.
select_current = "Enter"
yank_id = "Rune[i]"
collapse_parent_node = "Rune[-]"
move_to_parent_node = "Rune[p]"
# Only while focusing on sent messages
[keys.messages_list]
select_previous = "Rune[k]"
select_next = "Rune[j]"
select_first = "Rune[g]"
select_last = "Rune[G]"
# Select the message reference (reply) of the selected channel.
select_reply = "Rune[s]"
# Reply to the selected message.
reply = "Rune[r]"
# Reply (with mention) to the selected message.
reply_mention = "Rune[R]"
cancel = "Esc"
edit = "Rune[e]"
delete = "Rune[D]"
delete_confirm = "Rune[d]"
# Open the selected message's attachments or hyperlinks in the message
# using the default browser application.
open = "Rune[o]"
# Yank (copy) the selected message's content/url/id.
yank_content = "Rune[y]"
yank_url = "Rune[u]"
yank_id = "Rune[i]"
# Only while typing a message
# Alt+Enter: Insert a new line to the current text.
[keys.message_input]
# paste from clipboard (supports both text and images)
paste = "Ctrl+V"
send = "Enter"
# Remove existing text or cancel reply.
cancel = "Esc"
# Complete usernames when mentioning
tab_complete = "Tab"
open_editor = "Ctrl+E"
open_file_picker = "Ctrl+\\"
[keys.mentions_list]
up = "Ctrl+P"
down = "Ctrl+N"
# style = { foreground = "", background = "", attributes = "" or [""] }
[theme.title]
alignment = "left" # `"left"`, `"center"`, or `"right"`.
normal_style = { attributes = "dim" }
active_style = { foreground = "green", attributes = "bold" }
[theme.border]
enabled = true
padding = [0, 0, 1, 1] # [top, bottom, left, right]
normal_style = { attributes = "dim" }
active_style = { foreground = "green", attributes = "bold" }
# `"hidden"`, `"plain"`, `"round"`, `"thick"`, or `"double"`.
normal_set = "round"
active_set = "round"
[theme.guilds_tree]
auto_expand_folders = true
# Give tree-like shape
graphics = true
graphics_color = "default"
[theme.messages_list]
reply_indicator = ">"
forwarded_indicator = "<"
mention_style = { foreground = "blue" }
emoji_style = { foreground = "green" }
url_style = { foreground = "blue" }
attachment_style = { foreground = "yellow" }
[theme.mentions_list]
# Note: width and height are capped to the avaliable space
# Minimum width
# 0 = make the list as wide as possible
min_width = 20
# Maximum height
# 0 = make the list as tall as needed
max_height = 0
+13 -11
View File
@@ -1,6 +1,6 @@
# output=<not set>
font=JetBrainsMono-Regular:size=14
dpi-aware=auto
dpi-aware=no
# use-bold=no
prompt="❯ "
# placeholder=
@@ -9,7 +9,7 @@ icon-theme=Qogir-dark
# fields=filename,name,generic
# password-character=*
# filter-desktop=no
match-mode=fzf
# match-mode=fzf
# sort-result=yes
# match-counter=no
# delayed-filter-ms=300
@@ -43,15 +43,17 @@ exit-on-keyboard-focus-loss=no
# match-workers=<number of logical CPUs>
[colors]
background=0a0a0aff
text=ffffffff
prompt=00e5ffff
input=ffffffff
match=00e5ffff
selection-match=00e5ffff
selection=333333ff
selection-text=ffffffff
border=00e5ffff
background=08052bdd
text=e3e3eaff
prompt=ff7f7fff
# placeholder=ffd966ff
input=ff7f7fff
match=FFE57Fff
selection-match=FFE57Fff
selection=44475add
selection-text=FFFFFFff
# counter=93a1a1ff
border=7f3fbf55
[border]
# width=1
+6 -7
View File
@@ -1,17 +1,16 @@
[Settings]
gtk-theme-name=Arc-Dark
gtk-icon-theme-name=Qogir-Dark
gtk-icon-theme-name=Qogir-dark
gtk-font-name=Noto Sans 10
gtk-cursor-theme-name=Qogir-Dark
gtk-cursor-theme-size=20
gtk-cursor-theme-name=Qogir-dark
gtk-cursor-theme-size=0
gtk-toolbar-style=GTK_TOOLBAR_BOTH_HORIZ
gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR
gtk-button-images=0
gtk-menu-images=0
gtk-enable-event-sounds=0
gtk-enable-input-feedback-sounds=0
gtk-enable-event-sounds=1
gtk-enable-input-feedback-sounds=1
gtk-xft-antialias=1
gtk-xft-hinting=1
gtk-xft-hintstyle=hintslight
gtk-xft-hintstyle=hintmedium
gtk-xft-rgba=rgb
gtk-application-prefer-dark-theme=1
+2 -2
View File
@@ -1,5 +1,5 @@
[main]
gtk-theme-name=Adwaita-dark
gtk-theme=Arc-Dark
time-format=%H:%M
start-hidden=1
modules=powerbar-module
@@ -13,7 +13,7 @@ under-clock=true
show-labels=true
linked-buttons=true
reboot-command=systemctl reboot
poweroff-command=systemctl poweroff
poweroff-command=systemctl -i poweroff
suspend-command=systemctl suspend
userswitch-command=
logout-command=swaymsg exit
+16 -18
View File
@@ -1,45 +1,43 @@
* {
border: none;
text-shadow: 1px 1px 3px rgba(0, 0, 0, 0.9);
border-radius: 0px;
text-shadow: 1px 1px 3px rgba(0, 0, 0, 0.8)
}
window {
background-image: url("EndeavourOS_Astronaut_SpaceWalk.png");
background-size: cover;
background-repeat: no-repeat;
background-position: center;
background-color: #0a0a0a;
background-color: black;
}
#clock-label {
font-family: JetBrainsMono;
font-size: 64px;
color: #00e5ff;
font-size: 64.0px;
}
#unlock-button {
background-color: rgba(10, 10, 10, 0.8);
border: 2px solid #333333;
background: none;
background-color: rgba(127, 63, 191, 0.4);
border: 2px solid rgba(127, 63, 191, 0.5);
padding: 4px;
color: #ffffff;
}
#unlock-button:hover {
border-color: #00e5ff;
background-color: #000000;
background-color: rgba(127, 63, 191, 0.9);
}
#input-field {
background-color: rgba(0, 0, 0, 0.8);
border: 2px solid #00e5ff;
border-radius: 10px;
background-color: rgba(127, 127, 255, 0.1);
border: 2px solid rgba(127, 63, 191, 0.5);
padding-top: 5px;
padding-bottom: 5px;
color: #ffffff;
}
#powerbar-box button {
background-color: rgba(10, 10, 10, 0.8);
border: 2px solid #333333;
padding: 6px;
background: none;
background-color: rgba(127, 63, 191, 0.4);
border: 2px solid rgba(127, 63, 191, 0.5);
border-radius: 10px;
padding: 4px;
}
#powerbar-box button:hover {
border-color: #00e5ff;
color: #00e5ff;
background-color: rgba(127, 63, 191, 0.9);
}
#input-label {
font-size: 0px;
+53
View File
@@ -0,0 +1,53 @@
theme = "catppuccin_mocha"
[editor]
bufferline = "multiple"
true-color = true
line-number = "relative"
rulers = [100]
insert-final-newline = false
cursorline = true
[editor.cursor-shape]
insert = "bar"
normal = "block"
select = "underline"
[editor.file-picker]
git-ignore = false
[editor.indent-guides]
character = "│"
render = true
[editor.lsp]
auto-signature-help = false
display-messages = true
[editor.soft-wrap]
enable = false
# wrap-at-text-width = true
wrap-indicator = "↩ "
[editor.statusline]
left = ["mode", "spinner", "version-control", "file-name", "read-only-indicator", "file-modification-indicator"]
right = ["diagnostics", "selections", "register", "position", "position-percentage", "file-encoding", "file-line-ending"]
[editor.whitespace.characters]
space = " "
nbsp = "⍽" # Non breaking space
tab = "→"
newline = "⏎"
tabpad = "·"
[editor.whitespace.render]
space = "all"
tab = "all"
newline = "none"
[keys.normal]
X = ["extend_line_up", "extend_to_line_bounds"]
[keys.select]
X = ["extend_line_up", "extend_to_line_bounds"]
+42
View File
@@ -0,0 +1,42 @@
[[language]]
name = "go"
auto-format = true
formatter = { command = "goimports" }
[[language]]
name = "markdown"
#language-servers = [ "marksman", "ltex-ls", "mpls" ]
language-servers = [ "marksman", "ltex-ls" ]
rulers = [120]
[[language]]
name = "html"
formatter = { command = 'prettier', args = ["--parser", "html"] }
[[language]]
name = "json"
formatter = { command = 'prettier', args = ["--parser", "json"] }
[[language]]
name = "css"
formatter = { command = 'prettier', args = ["--parser", "css"] }
[[language]]
name = "javascript"
formatter = { command = 'prettier', args = ["--parser", "typescript"] }
auto-format = true
# markdown previewer https://github.com/mhersson/mpls
[language-server.mpls]
command = "mpls"
# args = ["--no-auto","--port","8989","--browser","explorer.exe"]
args = ["--browser","explorer.exe"]
[[language]]
name = "hledger-rules"
scope = "source.hledger-rules"
file-types = ["toml", { glob = "*.rules"} ]
#[language-server.ltex-ls.config]
#ltex.disabledRules = { "en-US" = ["PROFANITY"], "en-GB" = ["PROFANITY"] }
#ltex.dictionary = { "en-US" = ["builtin"], "en-GB" = ["builtin"] }
+27
View File
@@ -0,0 +1,27 @@
font=UbuntuMono 12.5
background-color=#404552
text-color=#e5e9f0
width=315
height=200
padding=10
margin=10
progress-color=over #eceff480
icon-path=/usr/share/icons/Arc-X-D
max-icon-size=70
layer=overlay
anchor=bottom-center
border-size=2
border-radius=15
border-color=#5294e2
default-timeout=0
ignore-timeout=1
[urgency=normal]
border-color=#d08770
[urgency=high]
border-color=#bf616a
default-timeout=0
+182
View File
@@ -0,0 +1,182 @@
$env.SYSTEMD_EDITOR = "/usr/bin/nvim"
$env.EDITOR = "/usr/bin/nvim"
$env.VISUAL = "/usr/bin/nvim"
$env.path ++= ["~/.local/bin"]
$env.config = {
buffer_editor: "/usr/bin/nvim"
completions: {
external: {
enable: true
max_results: 100
completer: {|spans|
let carapace_completer = {|spans: list<string>|
carapace $spans.0 nushell ...$spans
| from json
| if ($in | default [] | where value =~ '^-.*ERR$' | is-empty) { $in } else { null }
}
match $spans.0 {
_ => $carapace_completer
} | do $in $spans
}
}
}
cursor_shape: {
vi_insert: line
vi_normal: block
}
edit_mode: 'vi'
history: {
file_format: sqlite
isolation: true
}
hooks: {
env_change: {
PWD: [
{
__zoxide_hook: true,
code: {|_, dir| zoxide add -- $dir}
}
]
}
}
keybindings: [
{
name: fuzzy_history_fzf
modifier: control
keycode: char_r
mode: [emacs, vi_normal, vi_insert]
event: {
send: ExecuteHostCommand
cmd: "commandline edit --insert (
history
# | where exit_status == 0
| get command
| reverse
| uniq
| str join (char -i 0)
| fzf
--preview '{}'
--preview-window 'bottom:3:wrap'
--scheme history
--read0
--layout reverse
--bind alt-up:preview-up,alt-down:preview-down
--height 70%
--query (commandline)
| decode utf-8
| str trim
)"
}
}
{
name: fuzzy_history_fzf
modifier: none
keycode: char_/
mode: [ vi_normal ]
event: { send: menu name: fuzzy_history_fzf }
}
{
name: clear_everything
modifier: control
keycode: char_b
mode: [ emacs, vi_insert, vi_normal ]
event: [
{ send: clearscreen }
{ send: clearscrollback }
]
}
{
name: move_right_or_take_history_hint
modifier: control
keycode: char_f
mode: [ emacs, vi_insert, vi_normal ]
event: {
until: [
{ send: historyhintcomplete }
{ send: menuright }
{ send: right }
]
}
}
{
name: delete_one_word_backward
modifier: alt
keycode: backspace
mode: vi_insert
event: {edit: backspaceword}
}
]
show_banner: false
}
# from: https://github.com/nushell/nushell/issues/8166
def monitor [
--duration (-d): duration = 1sec
...args
] {
let args = $args | into string
let cmd = $args | str join ' '
loop {
let last_run = (date now)
let till = $last_run + $duration
let out = nu --config $nu.config-path --env-config $nu.env-path --commands $cmd | complete
if $out.exit_code == 0 {
clear
print $"Running every ($duration) on '(hostname)': `($cmd)`"
print $out.stdout
print $"Last run: ($last_run)"
sleep ($till - (date now))
} else {
print $out.stdout $out.stderr
break
}
}
}
# Jump to a directory using only keywords.
def --env --wrapped z [...rest: string@zoxide_completer] {
let path = match $rest {
[] => {'~'},
[ '-' ] => {'-'},
[ $arg ] if ($arg | path type) == 'dir' => {$arg}
_ => {
zoxide query --exclude $env.PWD -- ...$rest | str trim -r -c "\n"
}
}
cd $path
}
# Jump to a directory using interactive search.
def --env --wrapped zi [...rest:string] {
cd $'(zoxide query --interactive -- ...$rest | str trim -r -c "\n")'
}
def zoxide_completer [context: string] {
let parts = $context | split row " " | skip 1
{
options: {
sort: false
completion_algorithm: prefix
positional: false
case_sensitive: false
}
completions: (zoxide query --list --exclude $env.PWD -- ...$parts | lines)
}
}
# yazi helper
def --env y [...args] {
let tmp = (mktemp -t "yazi-cwd.XXXXXX")
yazi ...$args --cwd-file $tmp
let cwd = (open $tmp)
if $cwd != "" and $cwd != $env.PWD {
cd $cwd
}
rm -fp $tmp
}
source ~/.oh-my-posh.nu
-2
View File
@@ -1,2 +0,0 @@
vim.opt_local.number = true
vim.opt_local.relativenumber = true
-11
View File
@@ -1,11 +0,0 @@
-- Indentation & Layout
vim.opt_local.colorcolumn = "100"
vim.opt_local.textwidth = 100
vim.opt_local.tabstop = 4
vim.opt_local.shiftwidth = 4
vim.opt_local.softtabstop = 4
vim.opt_local.expandtab = true
-- Formatting Behavior
vim.opt_local.formatoptions:remove("t") -- Don't autowrap while typing
vim.opt_local.formatoptions:append("j") -- Remove comment markers when joining lines
-11
View File
@@ -1,11 +0,0 @@
-- Indentation & Layout
vim.opt_local.colorcolumn = "120"
vim.opt_local.textwidth = 120
vim.opt_local.tabstop = 4
vim.opt_local.shiftwidth = 4
vim.opt_local.softtabstop = 4
vim.opt_local.expandtab = true
-- Formatting Behavior
vim.opt_local.formatoptions:remove("t") -- Don't autowrap while typing
vim.opt_local.formatoptions:append("j") -- Remove comment markers when joining lines
-21
View File
@@ -1,21 +0,0 @@
local bufname = vim.api.nvim_buf_get_name(0)
local filename_arg = bufname ~= "" and (" --stdin-filepath " .. vim.fn.shellescape(bufname)) or ""
-- Indentation & Layout
vim.opt_local.colorcolumn = ""
vim.opt_local.wrap = true
vim.opt_local.textwidth = 80
vim.opt_local.tabstop = 2
vim.opt_local.shiftwidth = 2
vim.opt_local.softtabstop = 2
vim.opt_local.expandtab = true
-- Formatting Behavior: wrap text, keep comment/quote headers, parse lists
vim.opt_local.formatoptions:append("tqn")
-- gq Formatter: Prettier handles links/parentheses cleanly; par as fallback
if vim.fn.executable("prettier") == 1 then
vim.bo.formatprg = "prettier --parser markdown" .. filename_arg
elseif vim.fn.executable("par") == 1 then
vim.bo.formatprg = "par -w80req"
end
-11
View File
@@ -1,11 +0,0 @@
-- Indentation & Layout
vim.opt_local.colorcolumn = "100"
vim.opt_local.textwidth = 100
vim.opt_local.tabstop = 4
vim.opt_local.shiftwidth = 4
vim.opt_local.softtabstop = 4
vim.opt_local.expandtab = true
-- Formatting Behavior
vim.opt_local.formatoptions:remove("t") -- Don't autowrap while typing
vim.opt_local.formatoptions:append("j") -- Remove comment markers when joining lines
+2
View File
@@ -0,0 +1,2 @@
vim.o.number = true
vim.o.relativenumber = true
+4
View File
@@ -0,0 +1,4 @@
vim.o.colorcolumn = "100"
vim.opt.tabstop = 4
vim.opt.shiftwidth = 4
vim.opt.softtabstop = 4
+4
View File
@@ -0,0 +1,4 @@
vim.o.colorcolumn = "120"
vim.opt.tabstop = 4
vim.opt.shiftwidth = 4
vim.opt.softtabstop = 4
+5
View File
@@ -0,0 +1,5 @@
vim.o.colorcolumn = ""
vim.o.wrap = true
vim.opt.tabstop = 2
vim.opt.shiftwidth = 2
vim.opt.softtabstop = 2
+5
View File
@@ -0,0 +1,5 @@
vim.o.colorcolumn = "100"
vim.opt.tabstop = 4
vim.opt.shiftwidth = 4
vim.opt.softtabstop = 4
vim.g.no_python_maps = 1
+19 -21
View File
@@ -83,7 +83,7 @@ vim.opt.spelllang = { "en" }
-- Splits
vim.opt.splitbelow = true
vim.opt.splitkeep = "cursor"
vim.opt.splitkeep = "screen"
vim.opt.splitright = true
-- Terminal & Status Column
@@ -118,7 +118,6 @@ vim.api.nvim_create_autocmd("FileType", {
-- MAPS
-- ----------------------------------------
vim.g.no_python_maps = 1
local map = vim.keymap.set
-- better esc
@@ -833,7 +832,10 @@ local function makespec_diffview()
"DiffviewRefresh",
"DiffviewFileHistory",
},
keys = {},
keys = {
{ "<leader>gd", "<cmd>DiffviewOpen<cr>", desc = "DiffView Tab" },
{ "<leader>gh", "<cmd>DiffviewFileHistory<cr>", desc = "File History Tab" },
},
}
end
local function makespec_fugitive()
@@ -881,7 +883,6 @@ local function makespec_gitsigns()
vim.cmd.normal({ "]c", bang = true })
else
gs.nav_hunk("next")
vim.schedule(gs.preview_hunk_inline)
end
end
local function prev_hunk()
@@ -889,14 +890,14 @@ local function makespec_gitsigns()
vim.cmd.normal({ "[c", bang = true })
else
gs.nav_hunk("prev")
vim.schedule(gs.preview_hunk_inline)
end
end
local function bmap(mode, l, r, desc) vim.keymap.set(mode, l, r, { buffer = bufnr, desc = desc }) end
-- Navigation
bmap("n", "<M-,>", prev_hunk, "Prev Hunk")
bmap("n", "<M-.>", next_hunk, "Next Hunk")
bmap("n", "<M-,>", next_hunk, "Next Hunk")
bmap("n", "<M-.>", prev_hunk, "Prev Hunk")
bmap("n", "[h", prev_hunk, "Prev Hunk")
bmap("n", "]h", next_hunk, "Next Hunk")
@@ -907,8 +908,6 @@ local function makespec_gitsigns()
-- Hunk
bmap("n", "<leader>gi", gs.preview_hunk_inline, "Preview Hunk Inline")
bmap("n", "<leader>gp", gs.preview_hunk, "Preview Hunk")
bmap("n", "<leader>gd", gs.diffthis, "Diff This (Index)")
bmap("n", "<leader>gD", function() gs.diffthis("~") end, "Diff This (HEAD~1)")
bmap("n", "<leader>gq", gs.setqflist, "File Hunks to QuickFix")
bmap("n", "<leader>gQ", function() gs.setqflist("all") end, "All Hunks to QuickFix")
bmap("n", "<leader>gx", gs.reset_hunk, "Reset Hunk")
@@ -926,7 +925,7 @@ local function makespec_gitsigns()
bmap("n", "<leader>gtb", gs.toggle_current_line_blame, "Toggle Line Blame")
bmap("n", "<leader>gtd", gs.toggle_deleted, "Toggle Deleted")
-- Text Object (e.g., 'dih' to delete hunk)
-- Text object, e.g. for dih to delete hunk
bmap({ "o", "x" }, "ih", ":<C-U>Gitsigns select_hunk<CR>", "Select Hunk")
end
@@ -934,6 +933,11 @@ local function makespec_gitsigns()
"lewis6991/gitsigns.nvim",
event = { "BufReadPre", "BufNewFile" },
opts = {
signcolumn = true,
numhl = false,
linehl = false,
word_diff = false,
signs_staged_enable = false,
on_attach = on_gitsigns_attach,
},
}
@@ -1096,8 +1100,8 @@ local function makespec_snacks()
-- search
{ "<F1>", function() Snacks.picker.help() end, desc = "Help Pages" },
{ "<F9>", function() Snacks.picker.colorschemes() end, desc = "Colorschemes" },
{ "<M-/>", function() Snacks.picker.git_grep({ ignorecase = false }) end, desc = "Grep Git Files" },
{ "<leader>sg", function() Snacks.picker.git_grep({ ignorecase = false }) end, desc = "Grep Git Files" },
{ "<M-/>", function() Snacks.picker.git_grep({ ignorecase = true }) end, desc = "Grep Git Files" },
{ "<leader>sg", function() Snacks.picker.git_grep({ ignorecase = true }) end, desc = "Grep Git Files" },
{ "<leader>sa", function() Snacks.picker.grep({ untracked = true }) end, desc = "Grep Files" },
{ "<leader>*", function() Snacks.picker.grep_word() end, desc = "Visual selection or word", mode = { "n", "x" }, },
{ "<leader>/", function() Snacks.picker.search_history() end, desc = "Search History" },
@@ -1150,6 +1154,7 @@ local function makespecs_mini()
"echasnovski/mini.basics",
opts = { options = { basic = true, extra_ui = true }, mappings = { move_with_alt = true } },
},
{ "echasnovski/mini.pairs", version = false, opts = {} },
{
"echasnovski/mini.icons",
opts = {},
@@ -1244,15 +1249,8 @@ end
local function makespec_smartsplits()
return {
"smart-splits-nvim/smart-splits.nvim",
"mrjones2014/smart-splits.nvim",
lazy = false,
opts = {
mux = { backend = "smart-splits-backend-tmux" },
move = { at_edge = "wrap" },
},
dependencies = {
{ "smart-splits-nvim/backend-tmux", main = "smart-splits-backend-tmux" },
},
-- stylua: ignore
keys = {
{ "<M-h>", function() require("smart-splits").move_cursor_left() end, desc = "Go to Left Window" },
@@ -1754,4 +1752,4 @@ require("lazy").setup({
checker = { enabled = true },
rocks = { enabled = false },
})
vim.cmd("colorscheme gruvbox-material")
vim.cmd("colorscheme sonokai")
+18 -23
View File
@@ -1,43 +1,38 @@
window {
background-color: rgba(10, 10, 10, 0.95);
color: #ffffff;
border-radius: 0px;
border-right: 2px solid #00e5ff;
background-color: rgba (38, 18, 57, 0.9);
color: #eceff4;
border-radius: 30px
}
/* search entry */
entry {
box-shadow: none;
border: 1px solid #00e5ff;
background-color: #000000;
color: #00e5ff;
padding: 5px;
box-shadow: 0 0 6px 5px #2e3440;
background-color: rgba (0, 0, 0, 0.5)
}
button,
image {
background-color: transparent;
background: none;
border: 1px solid transparent;
margin: 5px;
button, image {
background-color: #3b4252;
background: none;
border: none;
margin: 10px
}
button:hover {
background-color: #111111;
border: 1px solid #00e5ff;
box-shadow: none;
background-color: rgba (127, 63, 191, .4);
box-shadow: 0 0 6px 5px #190C26
}
/* in case you wanted to give category buttons a different look */
#category-button {
margin: 0;
margin: 0 0px 0 0px
}
#pinned-box {
padding-bottom: 5px;
border-bottom: 2px solid #333333;
padding-bottom: 1px;
border-bottom: 1px solid gray
}
#files-box {
padding: 5px;
border: 1px solid #333333;
padding: 1px;
border: 1px solid gray
}
+28 -43
View File
@@ -1,5 +1,4 @@
from typing import TYPE_CHECKING
import os
if TYPE_CHECKING:
from qutebrowser.config.config import ConfigContainer
@@ -7,6 +6,7 @@ if TYPE_CHECKING:
c: "ConfigContainer" = c # type: ignore # noqa: F821
config: "ConfigAPI" = config # type: ignore # noqa: F821
from typing import TYPE_CHECKING
config.load_autoconfig(True)
config.bind("<", "tab-move -")
@@ -47,6 +47,7 @@ config.bind("tj", "back -t", mode="normal")
config.bind("wj", "back -w", mode="normal")
config.bind("tk", "forward -t", mode="normal")
config.bind("wk", "forward -w", mode="normal")
config.bind("ø", "cmd-set-text :")
config.bind("m", 'cmd-set-text :quickmark-add {url:pretty} "', mode="normal")
config.bind("D", "tab-close")
config.bind(",m", "hint links spawn -d mpv {hint-url}", mode="normal")
@@ -72,7 +73,7 @@ c.completion.open_categories = [
c.content.register_protocol_handler = False
c.content.blocking.enabled = True
c.content.fullscreen.window = True
c.content.blocking.method = "auto"
c.content.blocking.method = "adblock"
c.content.blocking.adblock.lists = [
"https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/filters.txt",
"https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/badware.txt",
@@ -85,9 +86,7 @@ c.content.blocking.adblock.lists = [
]
c.content.javascript.log_message.excludes = {
"userscript:_qute_js": ["*TrustedHTML*"],
"userscript:_qute_stylesheet": [
"*Refused to apply inline style because it violates the following Content Security Policy directive: *"
],
"userscript:_qute_stylesheet": ["*Refused to apply inline style because it violates the following Content Security Policy directive: *"]
}
c.completion.web_history.max_items = 10000
c.completion.height = "100%"
@@ -149,21 +148,7 @@ c.input.insert_mode.plugins = True
c.messages.timeout = 5000
c.qt.force_platform = "wayland"
c.qt.highdpi = True
qt_args = [
"disable-features=WebAuth", # makes BankID work
]
# Disable GPU by default (for AI training), unless QUTE_ENABLE_GPU is set
if os.environ.get("QUTE_ENABLE_GPU") != "1":
qt_args.extend(
[
"disable-gpu", # Stops using the GPU for rendering
"disable-gpu-compositing", # Forces CPU compositing
"disable-accelerated-2d-canvas", # Offloads canvas drawing to CPU
"disable-accelerated-video-decode", # Prevents VRAM usage for videos
]
)
c.qt.args = qt_args
c.qt.args = ["disable-features=WebAuth"] # makes BankID work
c.scrolling.bar = "always"
c.scrolling.smooth = False
c.session.lazy_restore = False
@@ -197,16 +182,16 @@ c.tabs.undo_stack_size = 1000
c.tabs.width = "15%"
c.url.start_pages = "https://www.google.com/search?hl=en&source=hp"
c.url.default_page = "https://www.google.com/search?hl=en&source=hp"
c.url.searchengines = {
"DEFAULT": "https://www.google.com/search?hl=en&source=hp&q={}",
"aw": "https://wiki.archlinux.org/?search={}",
"ap": "https://www.archlinux.org/packages/?q={}",
"gh": "https://github.com/search?q={}&type=repositories",
"ip": "https://iplocation.io/ip/{}",
"sh": "https://explainshell.com/explain?cmd={}",
"wi": "https://en.wikipedia.org/w/index.php?search={}",
"yt": "https://yewtu.be/search?q={}",
}
c.url.searchengines = dict(
DEFAULT="https://www.google.com/search?hl=en&source=hp&q={}",
aw="https://wiki.archlinux.org/?search={}",
ap="https://www.archlinux.org/packages/?q={}",
gh="https://github.com/search?q={}&type=repositories",
ip="https://iplocation.io/ip/{}",
sh="https://explainshell.com/explain?cmd={}",
wi="https://en.wikipedia.org/w/index.php?search={}",
yt="https://yewtu.be/search?q={}",
)
c.zoom.default = "100%"
# FONTS
@@ -219,20 +204,20 @@ c.fonts.web.family.fixed = "IBM Plex Mono"
c.fonts.web.family.standard = c.fonts.web.family.sans_serif
# COLORS
base00 = "#0A0A0A"
base01 = "#111111"
base02 = "#333333"
base00 = "#181818"
base01 = "#282828"
base02 = "#383838"
base03 = "#585858"
base04 = "#b8b8b8"
base05 = "#FFFFFF"
base05 = "#d8d8d8"
base06 = "#e8e8e8"
base07 = "#f8f8f8"
base08 = "#FF0033"
base08 = "#ab4642"
base09 = "#dc9656"
base0A = "#FFE57F"
base0B = "#00E5FF"
base0A = "#f7ca88"
base0B = "#a1b56c"
base0C = "#86c1b9"
base0D = "#00E5FF"
base0D = "#7cafc2"
base0E = "#ba8baf"
base0F = "#a16946"
c.colors.webpage.preferred_color_scheme = "light"
@@ -266,9 +251,9 @@ c.colors.downloads.start.bg = base0D
c.colors.downloads.stop.fg = base00
c.colors.downloads.stop.bg = base0C
c.colors.downloads.error.fg = base08
c.colors.hints.bg = base00
c.colors.hints.fg = base0B
c.colors.hints.match.fg = base08
c.colors.hints.fg = base00
c.colors.hints.bg = base0A
c.colors.hints.match.fg = base05
c.colors.keyhint.fg = base05
c.colors.keyhint.suffix.fg = base05
c.colors.keyhint.bg = base00
@@ -326,9 +311,9 @@ c.colors.tabs.pinned.selected.even.fg = base05
c.colors.tabs.pinned.selected.odd.bg = base02
c.colors.tabs.pinned.selected.odd.fg = base05
c.colors.tabs.selected.odd.fg = base05
c.colors.tabs.selected.odd.bg = base02
c.colors.tabs.selected.even.fg = base05
c.colors.tabs.selected.odd.bg = base0B
c.colors.tabs.selected.even.bg = base0B
c.colors.tabs.selected.even.bg = base02
# overrides
c.colors.hints.fg = base05
+13 -23
View File
@@ -5,29 +5,19 @@ should_launch_new_window 1
should_launch_new_instance 1
startup_commands toggle_visual_scroll;toggle_custom_color
# Document Colors (Deep Black bg, Pure White text)
custom_background_color #0A0A0A
custom_text_color #FFFFFF
custom_color_mode_empty_background_color #000000
page_separator_color #333333
# UI & Status Bar (Electric Cyan & Black)
ui_background_color #111111
ui_text_color #FFFFFF
ui_selected_background_color #333333
ui_selected_text_color #00E5FF
status_bar_color #00E5FF
status_bar_text_color #000000
# Highlights (Cyan for links, Crimson for search)
search_highlight_color #FF0033
unselected_search_highlight_color #880011
link_highlight_color #00E5FF
synctex_highlight_color #00E5FF
# Visual Mark (You autostart this, make it subtle but sharp)
visual_mark_color #333333
# - dracula: https://github.com/dracula/sioyek
# - catppuccin: https://github.com/catppuccin/sioyek
# - gruvbox: https://mil.ad/blog/2022/gruvbox-for-sioyek.html
new_macro _theme_solaris setconfig_custom_text_color(#b58900);setconfig_custom_background_color(#586e75)
new_macro _theme_normal setconfig_custom_text_color(#000000);setconfig_custom_background_color(#ffffff)
new_macro _theme_dark setconfig_custom_text_color(#ffffff);setconfig_custom_background_color(#000000)
new_macro _theme_softlight setconfig_custom_text_color(#434c5e);setconfig_custom_background_color(#faf4ed)
new_macro _theme_macchiato setconfig_custom_text_color(#cad3f5);setconfig_custom_background_color(#24273a)
new_macro _theme_frappe setconfig_custom_text_color(#c6d0f5);setconfig_custom_background_color(#303446)
new_macro _theme_moccha setconfig_custom_text_color(#cdd6f4);setconfig_custom_background_color(#1e1e2e)
new_macro _theme_latte setconfig_custom_text_color(#4c4f69);setconfig_custom_background_color(#eff1f5)
new_macro _theme_gruvbox setconfig_custom_text_color(#fbf1c7);setconfig_custom_background_color(#282828)
new_macro _theme_dracula setconfig_custom_text_color(0.97255 0.97255 0.94902);setconfig_custom_background_color(0.15686 0.16471 0.21176)
# page separation
page_separator_color #1d2021
+6 -14
View File
@@ -1,5 +1,5 @@
add_newline = true
right_format = """$cmd_duration\n"""
right_format = """$cmd_duration"""
[line_break]
disabled = false
@@ -8,25 +8,17 @@ disabled = false
disabled = false
[cmd_duration]
disabled = true
min_time = 1000
format = 'underwent [$duration](bold yellow)'
show_milliseconds = true
[directory]
truncation_length = 5
truncate_to_repo = false
truncation_symbol = "…/"
truncation_symbol = '…/'
repo_root_style = "red"
before_repo_root_style = "cyan"
repo_root_format = """\
[$before_root_path]\
($before_repo_root_style)\
[$repo_root]\
($repo_root_style)\
[$path]\
($style)\
[$read_only]\
($read_only_style)\
\
"""
repo_root_format = '[$before_root_path]($before_repo_root_style)[$repo_root]($repo_root_style)[$path]($style)[$read_only]($read_only_style) '
[git_status]
disabled = true
+45 -44
View File
@@ -10,34 +10,29 @@ mouse_warping none
# Set inner/outer gaps
smart_gaps on
gaps inner 4
gaps inner 2
gaps outer 0
# Hide titlebar on windows:
default_border pixel 2
smart_borders on
default_border pixel 1
# Default Font
font pango:Noto Sans Regular 10
# Cursor
seat seat0 xcursor_theme Adwaita 0
# Thin borders:
smart_borders on
# Title format for windows
set $focus #00E5FF
set $unfocused #333333
set $urgent #FF0033
set $bg #0A0A0A
set $text_dark #000000
set $text_dim #888888
for_window [shell="xdg_shell"] title_format "%title (%app_id)"
for_window [shell="x_wayland"] title_format "%class - %title"
# class border bground text indicator child_border
client.focused $focus $focus $text_dark $focus $focus
client.focused_inactive $unfocused $unfocused $text_dim $unfocused $unfocused
client.unfocused $unfocused $unfocused $text_dim $unfocused $unfocused
client.urgent $urgent $urgent #FFFFFF $urgent $urgent
client.placeholder #000000 #000000 #FFFFFF #000000 #000000
client.background $bg
# class border bground text indicator child_border
client.focused #556064 #F9CE5C #000000 #CB4B16 #FDF6E3
client.focused_inactive #CB4B16 #2F3D44 #1ABC9C #454948 #454948
client.unfocused #556064 #2F3D44 #1ABC9C #454948 #454948
client.urgent #CB4B16 #FDF6E3 #1ABC9C #268BD2 #268BD2
client.placeholder #000000 #0C0C0C #ffffff #000000 #000000
client.background #2B2C2B
# Status Bar:
bar {
@@ -72,7 +67,7 @@ set $powermenu ~/.config/sway/scripts/power_menu.sh
# ------------------------------------------
# Launch the terminal
bindsym $mod+Return exec $term
bindsym $mod+Shift+Return exec foot bash
bindsym Mod4+Shift+Return exec foot bash
# Kill focused window
bindsym $mod+Shift+q kill
# Lock screen
@@ -185,8 +180,8 @@ bindsym --whole-window --border {
# media keys
bindsym {
# Volume
XF86AudioRaiseVolume exec pamixer --unmute -i 2
XF86AudioLowerVolume exec pamixer --unmute -d 2
XF86AudioRaiseVolume exec pamixer -ui 2
XF86AudioLowerVolume exec pamixer -ud 2
XF86AudioMute exec pamixer --toggle-mute
Pause exec pamixer -ui 2
Print exec pamixer -ud 2
@@ -254,15 +249,13 @@ bindsym {
# Launch the browser
$mod+i exec qutebrowser
$mod+Shift+i exec env QUTE_ENABLE_GPU=1 qutebrowser
# Launch the file explorer
$mod+o exec pcmanfm
# Notifications
$mod+n exec swaync-client --hide-latest
$mod+Shift+n exec swaync-client --close-latest
$mod+m exec swaync-client -t -sw
# Dismiss message
$mod+n exec makoctl dismiss
$mod+Shift+n exec makoctl dismiss -a
}
# config tools
@@ -277,7 +270,7 @@ mode "$mode_monitor" {
bindsym Return mode "default"
bindsym Escape mode "default"
}
bindsym $mod+Shift+m mode "$mode_monitor"
bindsym $mod+m mode "$mode_monitor"
# ------------------------------------------
# AUTOSTART
@@ -285,9 +278,6 @@ bindsym $mod+Shift+m mode "$mode_monitor"
# Auth with polkit-gnome
exec /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1
# Keyring
exec gnome-keyring-daemon --start --components=secrets
# Import environment variables for user systemd service manager
exec systemctl --user import-environment DISPLAY WAYLAND_DISPLAY SWAYSOCK XDG_CURRENT_DESKTOP
@@ -295,9 +285,20 @@ exec systemctl --user import-environment DISPLAY WAYLAND_DISPLAY SWAYSOCK XDG_CU
exec hash dbus-update-activation-environment 2>/dev/null && \
dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY SWAYSOCK XDG_CURRENT_DESKTOP
# Idle configuration
exec swayidle -w \
timeout 1200 'pgrep -x gtklock || gtklock -d' \
timeout 2400 'swaymsg "output * power off"' resume 'swaymsg "output * power on"' \
before-sleep 'pgrep -x gtklock || gtklock -d' \
after-resume 'swaymsg reload' \
idlehint 240
# Start foot server
exec systemctl --user enable --now foot-server.service
exec {
# Start foot server
exec systemctl --user enable --now foot-server.service
# Desktop notifications
exec mako
# Set wallpaper
~/.azotebg
@@ -313,21 +314,19 @@ exec {
# night-time color shift
wlsunset -l 59.91:10.76
# persist clipboard after close
wl-clip-persist --clipboard regular --all-mime-type-regex '(?i)^(?!image/x-inkscape-svg).+'
}
exec_always {
pkill -x swayidle; exec swayidle -w \
timeout 1200 'gtklock -d' \
timeout 2400 'swaymsg "output * dpms off"' \
resume 'swaymsg "output * dpms on"' \
before-sleep 'gtklock -d' \
lock 'gtklock -d'
# nwg-drawer
nwg-drawer -r -c 7 -is 90 -mb 10 -ml 50 -mr 50 -mt 10
# persist clipboard after close
pkill -x wl-clip-persist
wl-clip-persist --clipboard regular --all-mime-type-regex '(?i)^(?!image/x-inkscape-svg).+'
# enable noisetorch
noisetorch -u
noisetorch -i
}
# ------------------------------------------
@@ -357,8 +356,9 @@ for_window [app_id="org.mozilla.Thunderbird" title="^((?!Mozilla Thunderbird).)*
# steam
# https://github.com/ValveSoftware/steam-for-linux/issues/1040
for_window [app_id="(?i)^steam$"] floating enable
for_window [app_id="(?i)^steam$" title="^Steam$"] floating disable
for_window [app_id="^steam$"] floating enable
for_window [app_id="^Steam$"] floating enable
for_window [app_id="^steam$" title="^Steam$"] floating disable
# Inhibit idle
for_window [app_id="firefox"] inhibit_idle fullscreen
@@ -387,3 +387,4 @@ input type:mouse {
accel_profile "flat"
pointer_accel 0.5
}
+2 -1
View File
@@ -1,4 +1,6 @@
#!/bin/sh
# usage: import-gsettings
config="${XDG_CONFIG_HOME:-$HOME/.config}/gtk-3.0/settings.ini"
if [ ! -f "$config" ]; then exit 1; fi
@@ -11,4 +13,3 @@ gsettings set "$gnome_schema" gtk-theme "$gtk_theme"
gsettings set "$gnome_schema" icon-theme "$icon_theme"
gsettings set "$gnome_schema" cursor-theme "$cursor_theme"
gsettings set "$gnome_schema" font-name "$font_name"
gsettings set "$gnome_schema" color-scheme 'prefer-dark'
+22 -29
View File
@@ -1,7 +1,6 @@
#!/bin/bash
SELECTION="$(printf "󰌾 Lock\n󰤄 Suspend\n󰍃 Log out\n Reboot\n Reboot to UEFI\n󰐥 Shutdown" | fuzzel --dmenu -a top-right -l 6 -w 18 -p "Select an option: ")"
[[ -z "$SELECTION" ]] && exit 0
confirm_action() {
local action="$1"
@@ -10,32 +9,26 @@ confirm_action() {
}
case $SELECTION in
*"󰌾 Lock"*)
gtklock
;;
*"󰤄 Suspend"*)
if confirm_action "Suspend"; then
systemctl suspend-then-hibernate
fi
;;
*"󰍃 Log out"*)
if confirm_action "Log out"; then
swaymsg exit
fi
;;
*" Reboot"*)
if confirm_action "Reboot"; then
systemctl reboot
fi
;;
*" Reboot to UEFI"*)
if confirm_action "Reboot to UEFI"; then
systemctl reboot --firmware-setup
fi
;;
*"󰐥 Shutdown"*)
if confirm_action "Shutdown"; then
systemctl poweroff
fi
;;
*"󰌾 Lock"*)
gtklock;;
*"󰤄 Suspend"*)
if confirm_action "Suspend"; then
systemctl suspend-then-hibernate
fi;;
*"󰍃 Log out"*)
if confirm_action "Log out"; then
swaymsg exit
fi;;
*" Reboot"*)
if confirm_action "Reboot"; then
systemctl reboot
fi;;
*" Reboot to UEFI"*)
if confirm_action "Reboot to UEFI"; then
systemctl reboot --firmware-setup
fi;;
*"󰐥 Shutdown"*)
if confirm_action "Shutdown"; then
systemctl poweroff
fi;;
esac
-62
View File
@@ -1,62 +0,0 @@
{
"positionX": "right",
"positionY": "top",
"layer": "overlay",
"control-center-layer": "top",
"layer-shell": true,
"cssPriority": "application",
"control-center-margin-top": 8,
"control-center-margin-bottom": 8,
"control-center-margin-right": 8,
"control-center-margin-left": 8,
"notification-2d-margin": true,
"notification-window-width": 400,
"keyboard-shortcuts": true,
"image-visibility": "when-available",
"transition-length": 200,
"hide-on-clear": false,
"hide-on-action": true,
"script-fail-notify": true,
"widgets": [
"title",
"dnd",
"mpris",
"volume",
"backlight",
"buttons-grid",
"notifications"
],
"widget-config": {
"title": {
"text": "Notifications",
"clear-all-button": true,
"button-text": "Clear All"
},
"dnd": {
"text": "Do Not Disturb"
},
"mpris": {
"image-size": 96,
"image-radius": 8
},
"volume": {
"label": "Volume",
"show-percentage": true
},
"backlight": {
"label": "Brightness"
},
"buttons-grid": {
"actions": [
{
"label": "WiFi",
"command": "nm-connection-editor"
},
{
"label": "Bluetooth",
"command": "blueman-manager"
}
]
}
}
}
-63
View File
@@ -1,63 +0,0 @@
@define-color bg rgba(10, 10, 10, 0.85);
@define-color border #333333;
@define-color text #FFFFFF;
@define-color focus #00E5FF;
@define-color urgent #FF0033;
* {
font-family: "Noto Sans", sans-serif;
border-radius: 0px; /* Sharp corners */
background-clip: padding-box;
}
.control-center {
background: @bg;
border-left: 2px solid @border;
color: @text;
}
.floating-notifications .notification {
background: @bg;
border: 2px solid @focus; /* Instantly clear it's a new notification */
box-shadow: none;
margin: 4px;
}
button:hover {
background: @border;
border: 1px solid @focus;
}
.widget-title {
color: @focus;
font-size: 1.2rem;
font-weight: bold;
padding: 10px;
border-bottom: 1px solid @border;
}
.close-button {
background: transparent;
border: none;
color: @text;
}
.close-button:hover {
background: @urgent;
}
.widget-dnd,
.widget-mpris,
.widget-volume,
.widget-backlight,
.widget-buttons-grid {
background: transparent;
border: 1px solid @border;
margin: 8px;
padding: 8px;
}
.notification-row:focus,
.notification-row:hover {
background: #111111;
border-left: 2px solid @focus;
}
-2
View File
@@ -69,8 +69,6 @@ bind generic um status-merge
bind generic - stage-update-line
bind generic \ stage-split-chunk
bind generic Y @sh -c "echo -n %(commit) | wl-copy"
bind generic c none
bind generic cc !git commit
bind generic ca !?@git commit --amend --no-edit
+38 -29
View File
@@ -14,8 +14,9 @@ set -g focus-events on
# Advertise tmux correctly to programs running inside it.
set -g default-terminal "tmux-256color"
set -as terminal-features ',*:RGB'
set -as terminal-features ',*:clipboard'
# Tell tmux which features the outer Foot client supports.
set -as terminal-features ',foot*:RGB,clipboard,focus,title'
# Allow image passthrough
set -gq allow-passthrough on
@@ -60,6 +61,11 @@ set -g set-titles on
######################
### KEYBINDS ###
######################
# Config that is very close to a i3 window manager's keybinding.
# Set new prefix
# Note : you can press super key by set M.
# (tested with tty only)
set -g prefix M-a
# First remove *all* keybindings
@@ -80,15 +86,17 @@ bind-key -n End send-keys "\033[F"
# Copy mode
bind c copy-mode
# clipboard control
bind p paste-buffer
bind -T copy-mode-vi v send-keys -X begin-selection
bind -T copy-mode-vi y send-keys -X copy-selection
bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "wl-copy"
bind -T copy-mode-vi Enter send-keys -X copy-selection-and-cancel
bind -T copy-mode-vi V send-keys -X select-line
bind -T copy-mode-vi Escape send-keys -X clear-selection
bind -T copy-mode-vi q send-keys -X cancel
bind -T copy-mode-vi Y send-keys -X copy-end-of-line
bind -T copy-mode-vi r send-keys -X rectangle-toggle
bind -T copy-mode-vi Escape send-keys -X cancel
bind -T copy-mode-vi q send-keys -X clear-selection
bind -T copy-mode MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "wl-copy"
bind -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "wl-copy"
# Rename window
bind , command-prompt "rename-window %%"
@@ -139,17 +147,16 @@ bind w choose-tree
# Change current pane to next window
bind ` break-pane
# Change current pane to specific window (join if exists, break if it doesn't)
bind 1 if-shell 'tmux join-pane -t :1 -h' '' 'break-pane -t :1'
bind 2 if-shell 'tmux join-pane -t :2 -h' '' 'break-pane -t :2'
bind 3 if-shell 'tmux join-pane -t :3 -h' '' 'break-pane -t :3'
bind 4 if-shell 'tmux join-pane -t :4 -h' '' 'break-pane -t :4'
bind 5 if-shell 'tmux join-pane -t :5 -h' '' 'break-pane -t :5'
bind 6 if-shell 'tmux join-pane -t :6 -h' '' 'break-pane -t :6'
bind 7 if-shell 'tmux join-pane -t :7 -h' '' 'break-pane -t :7'
bind 8 if-shell 'tmux join-pane -t :8 -h' '' 'break-pane -t :8'
bind 9 if-shell 'tmux join-pane -t :9 -h' '' 'break-pane -t :9'
bind 0 if-shell 'tmux join-pane -t :10 -h' '' 'break-pane -t :10'
bind 1 if 'tmux join-pane -t :1 -h' '' 'new-window -d -t :1; join-pane -t :1'
bind 2 if 'tmux join-pane -t :2 -h' '' 'new-window -d -t :2; join-pane -t :2'
bind 3 if 'tmux join-pane -t :3 -h' '' 'new-window -d -t :3; join-pane -t :3'
bind 4 if 'tmux join-pane -t :4 -h' '' 'new-window -d -t :4; join-pane -t :4'
bind 5 if 'tmux join-pane -t :5 -h' '' 'new-window -d -t :5; join-pane -t :5'
bind 6 if 'tmux join-pane -t :6 -h' '' 'new-window -d -t :6; join-pane -t :6'
bind 7 if 'tmux join-pane -t :7 -h' '' 'new-window -d -t :7; join-pane -t :7'
bind 8 if 'tmux join-pane -t :8 -h' '' 'new-window -d -t :8; join-pane -t :8'
bind 9 if 'tmux join-pane -t :9 -h' '' 'new-window -d -t :9; join-pane -t :9'
bind 0 if 'tmux join-pane -t :10 -h' '' 'new-window -d -t :10; join-pane -t :10 -h'
# move windows
bind m command-prompt -p "move window to:" "move-window -t '%%'"
@@ -189,26 +196,28 @@ bind b send-keys -R \; clear-history \; send-keys Enter
# various plugins
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'
set -g @plugin 'tmux-plugins/tmux-yank'
######################
### PANE CONTROL ###
######################
set -g @plugin 'smart-splits-nvim/backend-tmux'
set -g @plugin 'mrjones2014/smart-splits.nvim'
set -g @smart-splits_at_edge 'wrap'
set -g @smart-splits_resize_step_size '3'
# Optional configurations with their default values if omitted:
set -g @smart-splits_move_left_key 'M-h'
set -g @smart-splits_move_down_key 'M-j'
set -g @smart-splits_move_up_key 'M-k'
set -g @smart-splits_move_right_key 'M-l'
set -g @smart-splits_no_wrap '' # to disable wrapping. (any value disables wrapping)
set -g @smart-splits_resize_left_key 'C-h'
set -g @smart-splits_resize_down_key 'C-j'
set -g @smart-splits_resize_up_key 'C-k'
set -g @smart-splits_resize_right_key 'C-l'
set -g @smart-splits_move_left_key 'M-h' # key-mapping for navigation.
set -g @smart-splits_move_down_key 'M-j' # --"--
set -g @smart-splits_move_up_key 'M-k' # --"--
set -g @smart-splits_move_right_key 'M-l' # --"--
set -g @smart-splits_resize_left_key 'C-h' # key-mapping for resizing.
set -g @smart-splits_resize_down_key 'C-j' # --"--
set -g @smart-splits_resize_up_key 'C-k' # --"--
set -g @smart-splits_resize_right_key 'C-l' # --"--
set -g @smart-splits_resize_step_size '3' # change the step-size for resizing.
+10 -29
View File
@@ -60,7 +60,7 @@
"format-ok": "Systemd ✓",
"system": true, // Monitor failed systemwide units.
"user": true, // Ignore failed user units.
"on-click": "swaymsg exec 'footclient --app-id floating_shell --window-size-chars 250x45 systemctl-tui'"
"on-click": "swaymsg exec 'footclient --app-id floating_shell --window-size-chars 120x45 isd'"
},
// Configuration - modules-right
@@ -82,19 +82,20 @@
"warning": 70,
"critical": 90,
},
"on-click": "footclient --app-id floating_shell --window-size-chars 250x150 -e btop"
"on-click": "footclient --app-id floating_shell --window-size-chars 120x45 -e btop"
},
"temperature": {
"critical-threshold": 80,
"format": " {temperatureC}°C",
"on-click": "swaymsg exec 'footclient --app-id floating_shell --window-size-chars 120x100 -e watch sensors'"
"custom/cputemp": {
"exec": "sensors | grep 'CPU:' | awk '{print substr($2,2); }'",
"format": " {}",
"on-click": "swaymsg exec 'footclient --app-id floating_shell --window-size-chars 80x45 watch sensors'",
"interval": 1
},
"memory": {
"interval": 5,
"format": "{:>3}%",
"on-click": "footclient --app-id floating_shell --window-size-chars 250x150 -e btop",
"on-click": "footclient --app-id floating_shell --window-size-chars 100x100 -e btop",
"states": {
"warning": 70,
"critical": 90
@@ -106,7 +107,7 @@
"interval": 30,
"format": " / {specific_free:0.0f} of {specific_total:0.0f} GB free",
"unit": "GB",
"on-click": "swaymsg exec 'footclient --app-id floating_shell --window-size-chars 250x45 gdu -d'"
"on-click": "swaymsg exec 'footclient --app-id floating_shell --window-size-chars 80x45 ncdu -x /'"
},
"backlight": {
@@ -132,6 +133,7 @@
},
"on-click": "pavucontrol",
"tooltip-format": "{icon}  {volume}% {format_source}",
"on-click": "swaymsg exec 'footclient --app-id floating_shell --window-size-chars 120x12 pulsemixer'",
"on-click-middle": "pactl set-sink-mute @DEFAULT_SINK@ toggle",
"on-scroll-up": "pactl set-sink-volume @DEFAULT_SINK@ +5%",
"on-scroll-down": "pactl set-sink-volume @DEFAULT_SINK@ -5%"
@@ -149,27 +151,6 @@
"format-icons": ["", "", "", "", ""]
},
"custom/notification": {
"tooltip": true,
"format": "<span size='16pt'>{icon}</span>",
"format-icons": {
"notification": "󱅫",
"none": "󰂜",
"dnd-notification": "󰂠",
"dnd-none": "󰪓",
"inhibited-notification": "󰂛",
"inhibited-none": "󰪑",
"dnd-inhibited-notification": "󰂛",
"dnd-inhibited-none": "󰪑"
},
"return-type": "json",
"exec-if": "which swaync-client",
"exec": "swaync-client -swb",
"on-click": "swaync-client -t -sw",
"on-click-right": "swaync-client -d -sw",
"escape": true
},
"clock": {
"format": "󰅐 {:%H:%M}",
"format-alt": "󰅐 {:%OI:%M %p}",
+93 -75
View File
@@ -1,50 +1,60 @@
/* =============================================================================
*
* Waybar configuration
*
* Configuration reference: https://github.com/Alexays/Waybar/wiki/Configuration
*
* =========================================================================== */
/* -----------------------------------------------------------------------------
* Keyframes & Colors
* Keyframes
* -------------------------------------------------------------------------- */
@define-color highlight #00E5FF;
@define-color base1 #0A0A0A;
@define-color text #FFFFFF;
@define-color urgent #FF0033;
@define-color dim #333333;
@define-color highlight #685878 ;
@define-color base1 #19191e ;
@keyframes blink-warning {
70% {
color: @text;
}
to {
color: @text;
background-color: orange;
}
70% {
color: white;
}
to {
color: white;
background-color: orange;
}
}
@keyframes blink-critical {
70% {
color: @text;
}
to {
color: @text;
background-color: @urgent;
}
70% {
color: white;
}
to {
color: white;
background-color: red;
}
}
/* -----------------------------------------------------------------------------
* Base styles
* -------------------------------------------------------------------------- */
/* Reset all styles */
* {
border: none;
border-radius: 0;
min-height: 0;
margin: 1px;
padding: 0;
border: none;
border-radius: 0;
min-height: 0;
margin: 1px;
padding: 0;
}
/* The whole bar */
#waybar {
background: transparent;
color: @text;
background-color: @base1;
font-family: JetBrainsMono;
font-size: 13px;
border-bottom: 2px solid @dim;
background: transparent;
color: #e3e3ea;
background-color: @base1;
font-family: JetBrainsMono;
font-size: 13px;
}
/* Every modules */
@@ -59,72 +69,80 @@
#battery,
#clock,
#tray {
padding: 0.5rem 0.6rem;
margin: 1px 0px;
padding:0.5rem 0.6rem;
margin: 1px 0px;
}
/* -----------------------------------------------------------------------------
* Module styles
* -------------------------------------------------------------------------- */
#custom-launcher {
margin-left:15px;
margin-right:10px;
}
#workspaces {
font-size:13px;
}
#workspaces button {
border-radius: 0px;
color: @text;
padding: 1px 6px;
margin-right: 2px;
margin-left: 2px;
border-bottom: 2px solid transparent;
border-radius: 5px;
color: #eceff4;
padding: 1px 6px;
margin-right: 2px;
margin-left: 2px;
}
#workspaces button.focused {
border-bottom: 2px solid @highlight;
color: @highlight;
border: 1px solid #d8dee9;
}
#workspaces button.urgent {
border-color: @urgent;
color: @urgent;
border-color: #c9545d;
color: #c9545d;
}
#mode {
background: @highlight;
color: #000000;
font-weight: bold;
margin-left: 5px;
padding: 7px;
background: @highlight;
border-bottom: 3px transparent;
color:white;
margin-left: 5px;
padding: 7px;
}
#window {
font-weight: bold;
font-weight: bold;
}
#network.disconnected {
color: orange;
color: orange;
}
#cpu.warning {
color: orange;
color: orange;
}
#cpu.critical {
color: red;
color: red;
}
#memory {
animation-timing-function: linear;
animation-iteration-count: infinite;
animation-direction: alternate;
animation-timing-function: linear;
animation-iteration-count: infinite;
animation-direction: alternate;
}
#memory.warning {
color: orange;
}
color: orange;
}
#memory.critical {
color: red;
animation-name: blink-critical;
animation-duration: 2s;
padding-left: 5px;
padding-right: 5px;
color: red;
animation-name: blink-critical;
animation-duration: 2s;
padding-left:5px;
padding-right:5px;
}
#backlight.icon {
@@ -134,35 +152,35 @@
}
#pulseaudio.muted {
color: @highlight;
color: @highlight;
}
#battery {
animation-timing-function: linear;
animation-iteration-count: infinite;
animation-direction: alternate;
animation-timing-function: linear;
animation-iteration-count: infinite;
animation-direction: alternate;
}
#battery.warning {
color: orange;
color: orange;
}
#battery.critical {
color: red;
color: red;
}
#battery.warning.discharging {
animation-name: blink-warning;
animation-duration: 3s;
animation-name: blink-warning;
animation-duration: 3s;
}
#battery.critical.discharging {
animation-name: blink-critical;
animation-duration: 2s;
animation-name: blink-critical;
animation-duration: 2s;
}
#custom-power {
margin-left: 15px;
margin-right: 15px;
font-size: 15px;
margin-left:15px;
margin-right:15px;
font-size:15px;
}
+1
View File
@@ -1,4 +1,5 @@
[screencast]
chooser_type = dmenu
chooser_cmd = fuzzel --dmenu
output_name=DP-1
max_fps=30
+11 -39
View File
@@ -1,56 +1,28 @@
[[mgr.prepend_keymap]]
on = "E"
run = "shell 'exiftool %s | less' --block --confirm"
desc = "View file metadata with Exiftool"
[[mgr.prepend_keymap]]
on = "q"
run = "close"
on = "q"
run = "close"
desc = "Close tab"
[[mgr.prepend_keymap]]
on = "l"
run = "plugin smart-enter"
on = "l"
run = "plugin smart-enter"
desc = "Enter the child directory, or open the file"
[[mgr.prepend_keymap]]
on = [ "c", "m" ]
run = "plugin chmod"
on = [ "c", "m" ]
run = "plugin chmod"
desc = "Chmod on selected files"
[[mgr.prepend_keymap]]
on = "F"
run = "plugin smart-filter"
on = "F"
run = "plugin smart-filter"
desc = "Smart filter"
[[mgr.prepend_keymap]]
on = "M"
on = "M"
run = "plugin mount"
[[mgr.prepend_keymap]]
on = "T"
run = "plugin toggle-pane max-preview"
on = "T"
run = "plugin toggle-pane max-preview"
desc = "Maximize or restore the preview pane"
[[mgr.prepend_keymap]]
on = "C"
run = "plugin ouch"
desc = "Compress with ouch"
[[mgr.prepend_keymap]]
on = [ "c", "a" ]
run = 'shell --block -- catai -T %s | nvim -R -c "set bt=nofile ft=xml" -'
desc = "catai: Dump selected files/folders into Neovim"
[[mgr.prepend_keymap]]
on = [ "c", "x" ]
run = """\
shell --block -- zsh -c \"args=(); for p in \\\"\\$@\\\"; do args+=(-x \\\"\\$p\\\"); done; catai -T \
\\\"\\${args[@]}\\\" | nvim -R -c \\\"set bt=nofile ft=xml\\\" -\" -- %s\
"""
desc = "catai: Dump current dir EXCEPT selected items"
[[mgr.prepend_keymap]]
on = [ "c", "d" ]
run = 'shell --block -- catai -T -d | nvim -R -c "set bt=nofile ft=xml" -'
desc = "catai: Dump git dirty files into Neovim"
+4 -99
View File
@@ -12,93 +12,14 @@ max_height = 1500
[open]
prepend_rules = [
# Directories
{ mime = "inode/directory", use = [ "thunar", "pcmanfm", "open" ] },
# Text & Code
{ url = "*.csv", use = "text" },
{ url = "*.md", use = [ "glow", "nvim", "bat", "open" ] },
{ url = "*.json", use = [ "jq", "nvim", "bat", "open" ] },
{ mime = "text/*", use = [ "nvim", "bat", "open" ] },
{ mime = "inode/x-empty", use = [ "nvim", "open" ] },
# PDF & Documents
{ mime = "application/pdf", use = [ "zathura", "sioyek", "okular", "xournalpp", "chrome", "firefox", "open" ] },
{ mime = "application/vnd.openxmlformats-officedocument.*", use = [ "libreoffice", "calligra", "open" ] },
{ mime = "application/vnd.oasis.opendocument.*", use = [ "libreoffice", "calligra", "open" ] },
# Images
{ mime = "image/heic", use = [ "swappy", "krita", "open" ] },
{ mime = "image/*", use = [ "qimgv", "swappy", "krita", "open" ] },
# Video & Audio
{ mime = "video/*", use = [ "mpv", "vlc", "open" ] },
{ mime = "audio/*", use = [ "quodlibet", "mpv", "vlc", "open" ] },
# Archives
{ mime = "application/zip", use = [ "ouch", "file-roller", "open" ] },
{ mime = "application/x-tar", use = [ "ouch", "file-roller", "open" ] },
{ mime = "application/gzip", use = [ "ouch", "file-roller", "open" ] },
{ mime = "application/x-bzip*", use = [ "ouch", "file-roller", "open" ] },
{ mime = "application/x-7z-compressed", use = [ "ouch", "file-roller", "open" ] },
{ mime = "application/x-rar", use = [ "ouch", "file-roller", "open" ] },
# Web pages
{ mime = "text/html", use = [ "qutebrowser", "firefox", "chrome", "w3m", "open" ] },
# JSON files
# Certificates
{ url = "*.{crt,pem,cer,der}", use = [ "cert", "nvim", "bat", "open" ] },
# Catch-all for any file (allows Exiftool on everything as a fallback)
{ url = "*", use = [ "exiftool", "open" ] },
]
[opener]
# --- Text / Code (Blocking Terminal Apps) ---
text = [
{ run = "bat %s", block = true, desc = "bat" },
{ run = "nvim %s", block = true, desc = "nvim" },
{ run = "bat $@", block = true, desc = "bat" },
{ run = "nvim $@", block = true, desc = "nvim" },
]
nvim = [ { run = "nvim %s", block = true, desc = "Neovim" } ]
bat = [ { run = "bat %s", block = true, desc = "Bat" } ]
glow = [ { run = "glow --pager %s", block = true, desc = "Glow" } ]
jq = [ { run = "jq -C . %s | less -R", block = true, desc = "jq viewer" } ]
cert = [ { run = "openssl x509 -text -noout -in %s | less", block = true, desc = "View Cert (openssl)" } ]
# --- PDFs (Orphaned GUI Apps) ---
zathura = [ { run = "zathura %s", orphan = true, desc = "Zathura" } ]
sioyek = [ { run = "sioyek %s", orphan = true, desc = "Sioyek" } ]
okular = [ { run = "okular %s", orphan = true, desc = "Okular" } ]
xournalpp = [ { run = "xournalpp %s", orphan = true, desc = "Xournal++" } ]
# --- Browsers (Orphaned GUI Apps) ---
chrome = [ { run = "google-chrome-stable %s", orphan = true, desc = "Chrome" } ]
firefox = [ { run = "firefox %s", orphan = true, desc = "Firefox" } ]
qutebrowser = [ { run = "qutebrowser %s", orphan = true, desc = "Qutebrowser" } ]
w3m = [ { run = "w3m %s", orphan = true, desc = "w3m" } ]
# --- Media: Video / Audio (Orphaned GUI Apps) ---
mpv = [ { run = "mpv %s", orphan = true, desc = "MPV" } ]
vlc = [ { run = "vlc %s", orphan = true, desc = "VLC" } ]
quodlibet = [ { run = "quodlibet %s", orphan = true, desc = "quod libet" } ]
# --- Images (Orphaned GUI Apps) ---
qimgv = [ { run = "qimgv %s", orphan = true, desc = "qimgv" } ]
swappy = [ { run = "swappy -f %s", orphan = true, desc = "swappy" } ]
krita = [ { run = "krita %s", orphan = true, desc = "krita" } ]
# --- Office Documents (Orphaned GUI Apps) ---
libreoffice = [ { run = "libreoffice %s", orphan = true, desc = "LibreOffice" } ]
calligra = [ { run = "calligrawords %s", orphan = true, desc = "Calligra" } ]
# --- Archives ---
ouch = [ { run = "ouch d -y %s", desc = "Extract here with ouch" } ]
file-roller = [ { run = "file-roller %s", orphan = true, desc = "File Roller" } ]
# --- Directories (Orphaned GUI Apps) ---
thunar = [ { run = "thunar %s", orphan = true, desc = "Thunar" } ]
pcmanfm = [ { run = "pcmanfm %s", orphan = true, desc = "PCManFM" } ]
[input]
cursor_blink = true
@@ -117,14 +38,6 @@ group = "git"
url = "*/"
run = "git"
[[plugin.prepend_previewers]]
mime = "application/{*zip,tar,bzip2,7z*,rar,xz,zstd,java-archive}"
run = "ouch"
[[plugin.prepend_previewers]]
url = "*/"
run = "eza-preview"
[[plugin.prepend_previewers]]
url = "*.tar*"
run = 'piper --format=url -- tar tf "$1"'
@@ -138,16 +51,8 @@ url = "*.md"
run = 'piper -- CLICOLOR_FORCE=1 glow -w=$w -s=dark "$1"'
[[plugin.prepend_previewers]]
url = "*.parquet"
run = "parquet-preview"
[[plugin.prepend_previewers]]
url = "*.parq"
run = "parquet-preview"
[[plugin.prepend_previewers]]
url = "*.pq"
run = "parquet-preview"
url = "*/"
run = 'piper -- eza -TL=3 --color=always --icons=always --group-directories-first --no-quotes "$1"'
[[plugin.prepend_spotters]]
url = "*"
+8 -11
View File
@@ -13,17 +13,14 @@ export SAVEHIST=200000
alias ls='ls --color=auto -Ah'
alias ..='cd ..'
alias ...='cd ../..'
catai() {
if [[ " $* " == *" -i "* || " $* " == *" -y "* ]]; then
local cmd
cmd="$(command catai --print-cmd "$@")" && [[ -n "$cmd" ]] && print -z "$cmd"
else
command catai "$@"
fi
catai () {
rg -l --hidden --glob '!.git/*' --sort path '^' -- "$@" | while IFS= read -r f; do
printf "\n── %s ──\n" "$f"
echo '```'
cat "$f"
echo '```'
done
}
alias cataid='catai -d'
alias cataiy='catai -y'
alias sioyek="QT_QPA_PLATFORM=xcb sioyek"
# --- basic keybinds ---
bindkey '^[[Z' reverse-menu-complete # shift-tab
@@ -47,7 +44,7 @@ autoload -Uz compinit
compinit -d "~/.config/zsh/zcompdump"
zstyle ':completion:*' menu select
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Za-z}' 'r:|[._-]=** r:|=**'
zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
zstyle ':completion:*' list-colors ''
if command -v kubectl >/dev/null 2>&1; then
source <(kubectl completion zsh)
fi
+25 -15
View File
@@ -1,7 +1,7 @@
[core]
filemode = false
pager = delta
autocrlf = input
pager = delta --diff-so-fancy
autorcrlf = true
editor = nvim
[user]
name = Henrik Bakken
@@ -13,10 +13,8 @@
required = true
[interactive]
diffFilter = delta --color-only
[merge]
conflictstyle = zdiff3
; [merge]
; conflictstyle = diff3
[delta]
navigate = true
light = false
@@ -31,14 +29,16 @@
plus-non-emph-style = bold green
plus-emph-style = bold reverse green
[delta "interactive"]
keep-plus-minus-markers = false
[delta "decorations"]
keep-plus-minus-markers = false[delta "decorations"]
commit-decoration-style = bold yellow box ul
file-style = bold yellow ul
file-decoration-style = none
hunk-header-decoration-style = cyan box ul
[init]
defaultBranch = main
# better defaults
# https://blog.gitbutler.com/how-git-core-devs-configure-git/
[column]
ui = auto
[branch]
@@ -57,8 +57,6 @@
prune = true
pruneTags = true
all = true
[pull]
rebase = true
[help]
autocorrect = prompt
[rebase]
@@ -66,12 +64,24 @@
autoStash = true
updateRefs = true
[rerere]
enabled = true
autoupdate = true
# Improved colors for the highlighted bits
# https://github.com/so-fancy/diff-so-fancy
[color]
ui = true
[color "diff-highlight"]
oldNormal = red bold
oldHighlight = red bold 52
newNormal = green bold
newHighlight = green bold 22
[color "diff"]
meta = 11
frag = magenta bold
func = 146 bold
commit = yellow bold
old = red bold
new = green bold
whitespace = red reverse
[safe]
directory = /tmp
directory = /tmp
[credential]
helper = /usr/lib/git-core/git-credential-libsecret
helper = store
-352
View File
@@ -1,352 +0,0 @@
#!/usr/bin/env python3.14
"""
catai: Collect project tree & files in XML tags for LLM context.
Requires Python >= 3.14 (PEP 649/749 deferred annotations, PEP 695 type statements).
"""
import argparse
import os
import shlex
import shutil
import subprocess
import sys
import tempfile
from collections.abc import Iterable, Sequence
from dataclasses import dataclass
from pathlib import Path
type GlobList = list[str]
type PathList = list[str]
DEFAULT_IGNORES: tuple[str, ...] = (
"!.git/*",
"!.env*",
"!*lock*",
"!*.lock",
"!*.min.*",
)
EXAMPLES = """
Examples:
catai # Dump entire current repo
catai src/ # Dump everything inside src/
catai src -x legacy # Everything in src/ except src/legacy/
catai src -x '*.test.ts' -x dist # Exclude multiple patterns
catai src '!legacy' '!*.spec.js' # Exclude using '!' shorthand
catai -T src/main.rs # Single file without <project_tree>
catai -i src -x vendor # Pick files in fzf
catai -y # Pick files/folders in Yazi
catai -d # Only git-modified & untracked files
"""
@dataclass(slots=True, frozen=True)
class Config:
paths: PathList
rg_globs: GlobList
dirty: bool
no_tree: bool
interactive: bool
yazi: bool
print_cmd: bool
def expand_exclude(pattern: str) -> GlobList:
"""Expand a user exclusion pattern into ripgrep glob flags."""
clean = pattern.lstrip("!").rstrip("/")
if not clean:
return []
# Normalize absolute paths or leading './' so ripgrep globs match properly
try:
p = Path(clean)
if p.is_absolute():
clean = str(p.relative_to(Path.cwd()))
elif clean.startswith("./"):
clean = clean[2:]
except ValueError:
pass
return [
f"--glob=!{clean}",
f"--glob=!{clean}/**",
f"--glob=!**/{clean}",
f"--glob=!**/{clean}/**",
]
def parse_args(argv: Sequence[str] | None = None) -> Config:
parser = argparse.ArgumentParser(
prog="catai",
description="Collect project tree and files in XML tags for LLM context.",
epilog=EXAMPLES,
formatter_class=argparse.RawDescriptionHelpFormatter,
)
parser.add_argument(
"targets",
nargs="*",
help="Files, directories, or '!exclude' globs",
)
parser.add_argument(
"-x",
"--exclude",
action="append",
default=[],
metavar="PATTERN",
help="Exclude folder or file glob (repeatable)",
)
parser.add_argument(
"-d",
"--dirty",
action="store_true",
help="Only git modified & untracked files",
)
parser.add_argument(
"-T",
"--no-tree",
action="store_true",
help="Skip <project_tree> header",
)
parser.add_argument(
"-i",
"--interactive",
action="store_true",
help="Interactive fzf file picker",
)
parser.add_argument(
"-y",
"--yazi",
action="store_true",
help="Interactive Yazi file/folder chooser",
)
parser.add_argument(
"--print-cmd",
action="store_true",
help="Print selected command instead of executing (used by zsh print -z)",
)
ns = parser.parse_args(argv)
rg_globs: GlobList = [f"--glob={g}" for g in DEFAULT_IGNORES]
for ex in ns.exclude:
rg_globs.extend(expand_exclude(ex))
paths: PathList = []
for target in ns.targets:
match target:
case s if s.startswith("!"):
rg_globs.extend(expand_exclude(s[1:]))
case s:
paths.append(s)
return Config(
paths=paths,
rg_globs=rg_globs,
dirty=ns.dirty,
no_tree=ns.no_tree,
interactive=ns.interactive,
yazi=ns.yazi,
print_cmd=ns.print_cmd,
)
def run_lines(cmd: Sequence[str]) -> list[str]:
"""Run a command and return non-empty stdout lines."""
res = subprocess.run(cmd, capture_output=True, text=True, check=False)
return [line for line in res.stdout.splitlines() if line]
def render_tree(file_paths: Iterable[str]) -> str:
"""Pure-Python directory tree renderer (no external 'tree' binary required)."""
type TreeDict = dict[str, TreeDict]
root: TreeDict = {}
for raw_path in sorted(file_paths):
parts = Path(raw_path).parts
curr = root
for part in parts:
if part in (".", ""):
continue
curr = curr.setdefault(part, {})
lines: list[str] = ["."]
def walk(node: TreeDict, prefix: str = "") -> None:
items = list(node.items())
for idx, (name, children) in enumerate(items):
is_last = idx == len(items) - 1
connector = "└── " if is_last else "├── "
lines.append(f"{prefix}{connector}{name}")
if children:
extension = " " if is_last else "│ "
walk(children, prefix + extension)
walk(root)
return "\n".join(lines)
def pick_with_fzf(cfg: Config) -> PathList:
rg_cmd = [
"rg",
"--files",
"--hidden",
"--sort",
"path",
*cfg.rg_globs,
"--",
*cfg.paths,
]
all_files = run_lines(rg_cmd)
if not all_files:
return []
preview = "bat --color=always {} 2>/dev/null || cat {}"
proc = subprocess.run(
["fzf", "-m", "--preview", preview],
input="\n".join(all_files),
stdout=subprocess.PIPE,
text=True,
check=False,
)
return [line for line in proc.stdout.splitlines() if line]
def pick_with_yazi(cfg: Config) -> PathList:
with tempfile.NamedTemporaryFile(prefix="yazi-chooser.", delete=False) as tmp:
tmp_path = Path(tmp.name)
try:
subprocess.run(["yazi", f"--chooser-file={tmp_path}", *cfg.paths], check=False)
if not tmp_path.exists() or tmp_path.stat().st_size == 0:
return []
raw_picked = [
line for line in tmp_path.read_text(encoding="utf-8").splitlines() if line
]
cwd = Path.cwd()
rel_picked: PathList = []
for p in raw_picked:
path_obj = Path(p)
try:
rel_picked.append(str(path_obj.relative_to(cwd)))
except ValueError:
rel_picked.append(str(path_obj))
return rel_picked
finally:
tmp_path.unlink(missing_ok=True)
def collect_files(cfg: Config, target_paths: PathList) -> tuple[PathList, PathList]:
"""Return (tree_files, matched_non_empty_text_files)."""
cwd = Path.cwd().resolve()
rel_targets: PathList = []
for p in target_paths:
resolved = Path(p).resolve()
try:
rel = str(resolved.relative_to(cwd))
rel_targets.append("." if rel == "" else rel)
except ValueError:
rel_targets.append(os.path.relpath(resolved, cwd))
if cfg.dirty:
dirty_cmd = [
"git",
"ls-files",
"-m",
"-o",
"--exclude-standard",
"--",
*rel_targets,
]
candidates = run_lines(dirty_cmd)
if not candidates:
return [], []
else:
candidates = rel_targets
# Non-empty, non-binary files via ripgrep '^'
rg_content_cmd = [
"rg",
"-l",
"--hidden",
"--sort",
"path",
*cfg.rg_globs,
"^",
"--",
*candidates,
]
matched_files = run_lines(rg_content_cmd)
# Single-file edge case: `rg -l '^' single_file.txt` prints the filename,
# Ensure it is always included if non-empty
if cfg.no_tree or not matched_files:
return [], matched_files
rg_tree_cmd = [
"rg",
"--files",
"--hidden",
"--sort",
"path",
*cfg.rg_globs,
"--",
*rel_targets,
]
tree_files = run_lines(rg_tree_cmd)
return tree_files, matched_files
def dump_output(tree_files: PathList, files: PathList, show_tree: bool) -> None:
out = sys.stdout
if show_tree and tree_files:
out.write("<project_tree>\n")
out.write(render_tree(tree_files))
out.write("\n</project_tree>\n\n")
for filepath in files:
path = Path(filepath)
out.write(f'<file path="{filepath}">\n')
out.flush()
try:
with path.open("rb") as f:
shutil.copyfileobj(f, sys.stdout.buffer)
# Ensure trailing newline before closing tag
if path.stat().st_size > 0:
with path.open("rb") as f:
f.seek(-1, os.SEEK_END)
if f.read(1) != b"\n":
out.write("\n")
except OSError as exc:
sys.stderr.write(f"Error reading {filepath}: {exc}\n")
out.write("</file>\n\n")
def main() -> int:
cfg = parse_args()
# Handle interactive pickers (-i / -y)
if cfg.interactive or cfg.yazi:
picked = pick_with_yazi(cfg) if cfg.yazi else pick_with_fzf(cfg)
if not picked:
return 1
if cfg.print_cmd:
print(f"catai {shlex.join(picked)}")
return 0
tree_files, files = collect_files(cfg, picked)
else:
tree_files, files = collect_files(cfg, cfg.paths)
if not files:
msg = (
"No dirty or untracked files found."
if cfg.dirty
else "No matching text files found."
)
sys.stderr.write(f"{msg}\n")
return 1
dump_output(tree_files, files, show_tree=not cfg.no_tree)
return 0
if __name__ == "__main__":
raise SystemExit(main())
@@ -15,18 +15,18 @@
"interval": 30,
"format": " /mnt/hdd1 {specific_free:0.0f} of {specific_total:0.0f} GB free",
"unit": "GB",
"on-click": "swaymsg exec 'footclient --app-id floating_shell --window-size-chars 150x45 gdu -d'"
"on-click": "swaymsg exec 'footclient --app-id floating_shell --window-size-chars 80x45 ncdu -x /mnt/hdd1/'"
},
"custom/nvidia": {
"exec": "nvidia-smi --query-gpu=utilization.gpu,memory.used,temperature.gpu --format=csv,nounits,noheader | sed 's/\\([0-9]\\+\\), \\([0-9]\\+\\), \\([0-9]\\+\\)/\\1% \\2MB \\3°C/g'",
"format": "󰓅 {}",
"on-click": "swaymsg exec 'footclient --app-id floating_shell --window-size-chars 150x45 watch nvidia-smi'",
"on-click": "swaymsg exec 'footclient --app-id floating_shell --window-size-chars 120x45 nvtop'",
"interval": 1
},
"modules-right": [
"idle_inhibitor",
"cpu",
"temperature",
"custom/cputemp",
"memory",
"custom/nvidia",
"disk#root",
@@ -36,7 +36,6 @@
"battery",
"clock",
"tray",
"custom/notification",
"custom/power",
"custom/power"
]
}
+14 -16
View File
@@ -1,20 +1,18 @@
# input
# input type:tablet_tool map_to_region 2560 0 2560 1440
# Monitor definition
set $main_monitor "BNQ BenQ RD280UG EM95T00073087"
# output
output DP-1 mode 3840x2560
output DP-1 scale 1.25
# Output configuration
output $main_monitor mode 3840x2560@119.991Hz scale 1.25
# Workspace assignments
workspace 1 output $main_monitor
workspace 2 output $main_monitor
workspace 3 output $main_monitor
workspace 4 output $main_monitor
workspace 5 output $main_monitor
workspace 6 output $main_monitor
workspace 7 output $main_monitor
workspace 8 output $main_monitor
workspace 9 output $main_monitor
workspace 10 output $main_monitor
# switch to workspace
workspace 1 output DP-1
workspace 2 output DP-1
workspace 3 output DP-1
workspace 4 output DP-1
workspace 5 output DP-1
workspace 6 output DP-1
workspace 7 output DP-1
workspace 8 output DP-1
workspace 9 output DP-1
workspace 10 output DP-1
@@ -15,18 +15,18 @@
"interval": 30,
"format": " /mnt/hdd1 {specific_free:0.0f} of {specific_total:0.0f} GB free",
"unit": "GB",
"on-click": "swaymsg exec 'footclient --app-id floating_shell --window-size-chars 150x45 gdu -d'"
"on-click": "swaymsg exec 'footclient --app-id floating_shell --window-size-chars 80x45 ncdu -x /mnt/hdd1/'"
},
"custom/nvidia": {
"exec": "nvidia-smi --query-gpu=utilization.gpu,memory.used,temperature.gpu --format=csv,nounits,noheader | sed 's/\\([0-9]\\+\\), \\([0-9]\\+\\), \\([0-9]\\+\\)/\\1% \\2MB \\3°C/g'",
"format": "󰓅 {}",
"on-click": "swaymsg exec 'footclient --app-id floating_shell --window-size-chars 150x45 watch nvidia-smi'",
"on-click": "swaymsg exec 'footclient --app-id floating_shell --window-size-chars 120x45 nvtop'",
"interval": 1
},
"modules-right": [
"idle_inhibitor",
"cpu",
"temperature",
"custom/cputemp",
"memory",
"custom/nvidia",
"disk#root",
@@ -36,7 +36,6 @@
"battery",
"clock",
"tray",
"custom/notification",
"custom/power",
"custom/power"
]
}
+1 -1
View File
@@ -1,2 +1,2 @@
output * resolution 5120x1440
output DP-1 resolution 5120x1440
exec "regreet; swaymsg exit"
+2 -3
View File
@@ -12,7 +12,7 @@
"modules-right": [
"idle_inhibitor",
"cpu",
"temperature",
"custom/cputemp",
"memory",
"disk#root",
"backlight",
@@ -20,7 +20,6 @@
"battery",
"clock",
"tray",
"custom/notification",
"custom/power",
"custom/power"
]
}
+1 -1
View File
@@ -1,2 +1,2 @@
output * resolution 2736x1824 scale 1.6
output eDP-1 resolution 2736x1824 scale 1.6
exec "regreet; swaymsg exit"
@@ -12,7 +12,7 @@
"modules-right": [
"idle_inhibitor",
"cpu",
"temperature",
"custom/cputemp",
"memory",
"disk#root",
"backlight",
@@ -20,7 +20,6 @@
"battery",
"clock",
"tray",
"custom/notification",
"custom/power",
"custom/power"
]
}
+1 -1
View File
@@ -1,2 +1,2 @@
output * resolution 2496x1664 scale 1.6
output eDP-1 resolution 2496x1664 scale 1.6
exec "regreet; swaymsg exit"
+10 -12
View File
@@ -52,12 +52,13 @@ installmap = dict(
tmux=("tmux", "urlscan"),
editors=(
"neovim",
"helix",
"ripgrep",
"npm", # required for nvim plugins
"go", # required for vim-hexokinase build
"tree-sitter-cli", # required for nvim treesitter
),
utils=("uv", "gdu", "unzip", "jq", "bluetui"),
utils=("uv", "ncdu", "unzip", "jq", "bluetui"),
gittools=(
"tig",
"diff-so-fancy",
@@ -66,8 +67,6 @@ installmap = dict(
"git-lfs",
"lazygit",
"bat",
"gnome-keyring", # for git credentials
"seahorse", # keyring ui
),
readers=(
"sioyek",
@@ -91,18 +90,19 @@ installmap = dict(
# photos
"qimgv",
"kimageformats5", # heif support
"digikam",
# music
"quodlibet",
"gst-plugins-good", # required deb
# audio
"pamixer",
"noisetorch",
),
filebrowsers=(
"yazi",
"ranger",
"pcmanfm",
"thunar",
"ouch",
"gparted",
"sshfs",
"file-roller",
@@ -120,7 +120,7 @@ installmap = dict(
"python-tldextract",
"bitwarden-cli", # for qutebrowser autofill
),
chat=("discord", "gurk"),
chat=("discordo-git", "gurk"),
emailcalrss=(
"khard", # contacts
"khal", # calendar
@@ -136,7 +136,8 @@ installmap = dict(
"htop", # hardware
"btop", # hardware
"nvtop", # gpu
"systemctl-tui", # systemd
"lazyjournal", # journald
"isd", # systemd
"bandwhich", # network
"sysstat",
),
@@ -280,7 +281,6 @@ def install_zsh(overwrite: bool, reinstall: bool) -> None:
run("chsh -s /usr/bin/zsh".split())
helper_maybe_copy(CFG_SRC, CFG_TGT, "starship.toml", overwrite, symlink=True)
helper_maybe_copy(HOME_SRC, HOME_TGT, ".zshenv", overwrite, symlink=True)
helper_maybe_copy(HOME_SRC, HOME_TGT, ".local/bin/catai", overwrite, symlink=True)
def install_tmux(overwrite: bool, reinstall: bool) -> None:
@@ -299,6 +299,7 @@ def install_tmux(overwrite: bool, reinstall: bool) -> None:
def install_editors(overwrite: bool, reinstall: bool) -> None:
helper_install(*installmap["editors"], reinstall=reinstall)
helper_clone_foldercontents(CFG_SRC, CFG_TGT, "nvim", overwrite)
helper_clone_foldercontents(CFG_SRC, CFG_TGT, "helix", overwrite)
def install_gittools(overwrite: bool, reinstall: bool) -> None:
@@ -330,9 +331,7 @@ def install_filebrowsers(overwrite: bool, reinstall: bool) -> None:
"yazi-rs/plugins:smart-enter",
"yazi-rs/plugins:smart-filter",
"yazi-rs/plugins:toggle-pane",
"ahkohd/eza-preview",
"boydaihungst/file-extra-metadata",
"ya pkg add ndtoan96/ouch",
]:
run(f"ya pkg add {plugin}".split())
tgt = ".local/share/applications/userapp-file-roller.desktop"
@@ -348,6 +347,7 @@ def install_netbrowsers(overwrite: bool, reinstall: bool) -> None:
def install_chat(overwrite: bool, reinstall: bool) -> None:
helper_install(*installmap["chat"], reinstall=reinstall)
helper_clone_foldercontents(CFG_SRC, CFG_TGT, "discordo", overwrite)
helper_clone_foldercontents(CFG_SRC, CFG_TGT, "gurk", overwrite)
@@ -399,7 +399,7 @@ def install_sway(overwrite: bool, reinstall: bool) -> None:
"waybar",
"gtklock",
"gtk-3.0",
"swaync",
"mako",
"fuzzel",
"nwg-drawer",
"xdg-desktop-portal-wlr",
@@ -409,8 +409,6 @@ def install_sway(overwrite: bool, reinstall: bool) -> None:
helper_clone_foldercontents(CFG_SRC, CFG_TGT, sub, overwrite)
helper_maybe_copy(CFG_SRC, CFG_TGT, "xdg-terminals.list", overwrite, symlink=True)
helper_maybe_copy(CFG_SRC, CFG_TGT, "mimeapps.list", overwrite, symlink=True)
# swaync configs
helper_clone_foldercontents(CFG_SRC, CFG_TGT, "swaync", overwrite)
# custom sway configs
helper_clone_foldercontents(CUSTOM_SRC / "CONFIG", CFG_TGT, "sway", overwrite)
# custom waybar configs