From bf1a1a9ee27a504cd648d3b5253abb120972c9d7 Mon Sep 17 00:00:00 2001 From: thomasabishop Date: Sun, 6 Apr 2025 15:37:42 +0100 Subject: [PATCH] various updates --- backups/cron/home/daily.sh | 24 +++---- backups/cron/home/hourly.sh | 25 ++++---- backups/cron/home/monthly.sh | 24 +++---- backups/cron/home/weekly.sh | 25 ++++---- backups/cron/root/daily.sh | 18 ------ backups/cron/root/hourly.sh | 18 ------ backups/cron/root/monthly.sh | 18 ------ backups/cron/root/weekly.sh | 20 ------ backups/rsnapshot.conf | 24 +++++-- gruvbox-95/sounds/consolewarning.mp3 | Bin 0 -> 19233 bytes gruvbox-95/sounds/success.mp3 | Bin 0 -> 18465 bytes kitty/kitty.conf | 9 ++- nvim/lazy-lock.json | 5 +- nvim/lua/config/colourscheme.lua | 24 +++---- nvim/lua/config/keybindings.lua | 6 ++ nvim/lua/config/lazy.lua | 2 +- nvim/lua/config/options.lua | 8 ++- nvim/lua/plugins/gruvbox-material.lua | 8 --- nvim/lua/plugins/gruvbox.lua | 46 ++++++++++++++ nvim/lua/plugins/illuminate.lua | 3 - nvim/lua/plugins/lazygit.lua | 20 ++++-- nvim/lua/plugins/neotree.lua | 10 +++ nvim/lua/plugins/vim-wakatime.lua | 1 - scripts/convert_img_grvubox.sh | 86 ++++++++++++++++++++++++++ scripts/dummy_error_script.sh | 12 ++++ scripts/monitor_mullvad.sh | 33 ++++++++++ scripts/slack_notifier.sh | 82 ++++++++++++++++++++++++ sounds/star-trek-computer-error.mp3 | Bin 0 -> 15393 bytes sounds/star-trek-computer-success.mp3 | Bin 0 -> 12321 bytes tmux/tmux.conf | 18 +++--- zsh/thomas.zsh-theme | 23 ++++++- zsh/zshrc | 7 +++ 32 files changed, 426 insertions(+), 173 deletions(-) delete mode 100755 backups/cron/root/daily.sh delete mode 100755 backups/cron/root/hourly.sh delete mode 100755 backups/cron/root/monthly.sh delete mode 100755 backups/cron/root/weekly.sh create mode 100644 gruvbox-95/sounds/consolewarning.mp3 create mode 100644 gruvbox-95/sounds/success.mp3 delete mode 100644 nvim/lua/plugins/gruvbox-material.lua create mode 100644 nvim/lua/plugins/gruvbox.lua delete mode 100644 nvim/lua/plugins/illuminate.lua delete mode 100644 nvim/lua/plugins/vim-wakatime.lua create mode 100755 scripts/convert_img_grvubox.sh create mode 100755 scripts/dummy_error_script.sh create mode 100755 scripts/monitor_mullvad.sh create mode 100644 scripts/slack_notifier.sh create mode 100644 sounds/star-trek-computer-error.mp3 create mode 100644 sounds/star-trek-computer-success.mp3 diff --git a/backups/cron/home/daily.sh b/backups/cron/home/daily.sh index 6f62c3b..169a802 100755 --- a/backups/cron/home/daily.sh +++ b/backups/cron/home/daily.sh @@ -1,19 +1,19 @@ - #!/bin/bash +#!/bin/bash USER=thomas export XDG_RUNTIME_DIR=/run/user/1000 source /home/thomas/.env -if mountpoint -q /media/backups-home; then - # sudo /usr/bin/rsnapshot daily - sudo /usr/bin/rsnapshot -c /etc/rsnapshot.conf daily - if [ $? -eq 0 ]; then - /home/thomas/repos/slack-notifier/src/index.js 'backups' 'βœ…πŸ  Daily `/home` backup completed successfully.' - else - /home/thomas/repos/slack-notifier/src/index.js 'backups' 'β›”πŸ  Daily `/home` backup failed.' - fi -else - echo "Backup drive not mounted" - /home/thomas/repos/slack-notifier/src/index.js 'backups' 'πŸ’ΎπŸ  Error: `/home` backup drive not mounted.' +if mountpoint -q /media/samsung-T3; then + # sudo /usr/bin/rsnapshot daily + sudo /usr/bin/rsnapshot -c /etc/rsnapshot.conf daily + if [ $? -eq 0 ]; then + /home/thomas/repos/slack-notifier/src/index.js 'backups' 'βœ…πŸ  Daily `/home` backup completed successfully.' + else + /home/thomas/repos/slack-notifier/src/index.js 'backups' 'β›”πŸ  Daily `/home` backup failed.' || exit $? + fi +else + echo "Backup drive not mounted" + /home/thomas/repos/slack-notifier/src/index.js 'backups' 'πŸ’ΎπŸ  Error: `/home` backup drive not mounted.' fi diff --git a/backups/cron/home/hourly.sh b/backups/cron/home/hourly.sh index cb55bf6..67f435b 100755 --- a/backups/cron/home/hourly.sh +++ b/backups/cron/home/hourly.sh @@ -1,19 +1,18 @@ -#!/bin/bash +#!/bin/bash +THIS_FILE=${0} +SLACK_NOTIFIER="/home/thomas/dotfiles/scripts/slack_notifier.sh" USER=thomas export XDG_RUNTIME_DIR=/run/user/1000 - source /home/thomas/.env -if mountpoint -q /media/backups-home; then - sudo /usr/bin/rsnapshot -c /etc/rsnapshot.conf hourly - # sudo /usr/bin/rsnapshot hourly - if [ $? -eq 0 ]; then - /home/thomas/repos/slack-notifier/src/index.js 'backups' 'βœ…πŸ  Hourly `/home` backup completed successfully' - else - /home/thomas/repos/slack-notifier/src/index.js 'backups' 'β›”πŸ  Hourly `/home` backup failed.' - fi -else - echo "Backup drive not mounted" - /home/thomas/repos/slack-notifier/src/index.js 'backups' 'πŸ’ΎπŸ  Error: `/home` backup drive not mounted.' +if mountpoint -q /media/samsung-T3; then + SNAPSHOT=$(sudo /usr/bin/rsnapshot -c /etc/rsnapshot.conf hourly 2>&1 1>/dev/null) + if [ $? -ne 0 ]; then + $SLACK_NOTIFIER "backups" "ERROR Hourly /home backup failed" "$SNAPSHOT" + else + $SLACK_NOTIFIER "backups" "SUCCESS Hourly /home backup completed." + fi +else + $SLACK_NOTIFIER "backups" "ERROR Hourly /home backup failed: disk not mounted." fi diff --git a/backups/cron/home/monthly.sh b/backups/cron/home/monthly.sh index 5b687d0..8be091c 100755 --- a/backups/cron/home/monthly.sh +++ b/backups/cron/home/monthly.sh @@ -1,19 +1,19 @@ -#!/bin/bash +#!/bin/bash USER=thomas export XDG_RUNTIME_DIR=/run/user/1000 source /home/thomas/.env -if mountpoint -q /media/backups-home; then - sudo /usr/bin/rsnapshot -c /etc/rsnapshot.conf monthly - # sudo /usr/bin/rsnapshot monthly - if [ $? -eq 0 ]; then - /home/thomas/repos/slack-notifier/src/index.js 'backups' 'βœ…πŸ  Monthly `/home` backup completed successfully.' - else - /home/thomas/repos/slack-notifier/src/index.js 'backups' 'β›”πŸ  Monthly `/home` backup failed.' - fi -else - echo "Backup drive not mounted" - /home/thomas/repos/slack-notifier/src/index.js 'backups' 'πŸ’ΎπŸ  Error: `/home` backup drive not mounted.' +if mountpoint -q /media/samsung-T3; then + sudo /usr/bin/rsnapshot -c /etc/rsnapshot.conf monthly + # sudo /usr/bin/rsnapshot monthly + if [ $? -eq 0 ]; then + /home/thomas/repos/slack-notifier/src/index.js 'backups' 'βœ…πŸ  Monthly `/home` backup completed successfully.' + else + /home/thomas/repos/slack-notifier/src/index.js 'backups' 'β›”πŸ  Weekly `/home` backup failed.' || exit $? + fi +else + echo "Backup drive not mounted" + /home/thomas/repos/slack-notifier/src/index.js 'backups' 'πŸ’ΎπŸ  Error: `/home` backup drive not mounted.' fi diff --git a/backups/cron/home/weekly.sh b/backups/cron/home/weekly.sh index 8ceb681..acbfc69 100755 --- a/backups/cron/home/weekly.sh +++ b/backups/cron/home/weekly.sh @@ -1,20 +1,19 @@ -#!/bin/bash +#!/bin/bash USER=thomas export XDG_RUNTIME_DIR=/run/user/1000 - source /home/thomas/.env -if mountpoint -q /media/backups-home; then - sudo /usr/bin/rsnapshot -c /etc/rsnapshot.conf weekly - # sudo /usr/bin/rsnapshot weekly - if [ $? -eq 0 ]; then - /home/thomas/repos/slack-notifier/src/index.js 'backups' 'βœ…πŸ  Weekly `/home` backup completed successfully.' - else - /home/thomas/repos/slack-notifier/src/index.js 'backups' 'β›”πŸ  Weekly `/home` backup failed.' - fi -else - echo "Backup drive not mounted" - /home/thomas/repos/slack-notifier/src/index.js 'backups' 'πŸ’ΎπŸ  Error: `/home` backup drive not mounted.' +if mountpoint -q /media/samsung-T3; then + sudo /usr/bin/rsnapshot -c /etc/rsnapshot.conf weekly + # sudo /usr/bin/rsnapshot weekly + if [ $? -eq 0 ]; then + /home/thomas/repos/slack-notifier/src/index.js 'backups' 'βœ…πŸ  Weekly `/home` backup completed successfully.' + else + /home/thomas/repos/slack-notifier/src/index.js 'backups' 'β›”πŸ  Weekly `/home` backup failed.' || exit $? + fi +else + echo "Backup drive not mounted" + /home/thomas/repos/slack-notifier/src/index.js 'backups' 'πŸ’ΎπŸ  Error: `/home` backup drive not mounted.' fi diff --git a/backups/cron/root/daily.sh b/backups/cron/root/daily.sh deleted file mode 100755 index 2f21e9d..0000000 --- a/backups/cron/root/daily.sh +++ /dev/null @@ -1,18 +0,0 @@ - #!/bin/bash - -USER=thomas -export XDG_RUNTIME_DIR=/run/user/1000 - -source /home/thomas/.env - -if mountpoint -q /media/backups-home; then - sudo /usr/bin/rsnapshot -c /etc/rsnapshot_root.conf daily - if [ $? -eq 0 ]; then - /home/thomas/repos/slack-notifier/src/index.js 'backups' 'βœ…πŸ«š Daily `/` backup completed successfully.' - else - /home/thomas/repos/slack-notifier/src/index.js 'backups' 'β›”πŸ«š Daily `/` backup failed.' - fi -else - echo "Backup drive not mounted" - /home/thomas/repos/slack-notifier/src/index.js 'backups' 'πŸ’ΎπŸ«š Error: `/` backup drive not mounted.' -fi diff --git a/backups/cron/root/hourly.sh b/backups/cron/root/hourly.sh deleted file mode 100755 index 6e5a0bc..0000000 --- a/backups/cron/root/hourly.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -USER=thomas -export XDG_RUNTIME_DIR=/run/user/1000 - -source /home/thomas/.env - -if mountpoint -q /media/backups-home; then - sudo /usr/bin/rsnapshot -c /etc/rsnapshot_root.conf hourly - if [ $? -eq 0 ]; then - /home/thomas/repos/slack-notifier/src/index.js 'backups' 'βœ…πŸ«š Hourly `/` backup completed successfully' - else - /home/thomas/repos/slack-notifier/src/index.js 'backups' 'β›”πŸ«š Hourly `/` backup failed.' - fi -else - echo "Backup drive not mounted" - /home/thomas/repos/slack-notifier/src/index.js 'backups' 'πŸ’ΎπŸ«š Error: `/` backup drive not mounted.' -fi diff --git a/backups/cron/root/monthly.sh b/backups/cron/root/monthly.sh deleted file mode 100755 index 46e2e14..0000000 --- a/backups/cron/root/monthly.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -USER=thomas -export XDG_RUNTIME_DIR=/run/user/1000 - -source /home/thomas/.env - -if mountpoint -q /media/backups-home; then - sudo /usr/bin/rsnapshot -c /etc/rsnapshot_root.conf monthly - if [ $? -eq 0 ]; then - /home/thomas/repos/slack-notifier/src/index.js 'backups' 'βœ…πŸ«š Monthly `/` backup completed successfully.' - else - /home/thomas/repos/slack-notifier/src/index.js 'backups' 'β›”πŸ«š Monthly `/` backup failed.' - fi -else - echo "Backup drive not mounted" - /home/thomas/repos/slack-notifier/src/index.js 'backups' 'πŸ’ΎπŸ«š Error: `/` backup drive not mounted.' -fi diff --git a/backups/cron/root/weekly.sh b/backups/cron/root/weekly.sh deleted file mode 100755 index a4ba73d..0000000 --- a/backups/cron/root/weekly.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash - -USER=thomas -export XDG_RUNTIME_DIR=/run/user/1000 - - -source /home/thomas/.env - -if mountpoint -q /media/backups-home; then - - sudo /usr/bin/rsnapshot -c /etc/rsnapshot_root.conf monthly - if [ $? -eq 0 ]; then - /home/thomas/repos/slack-notifier/src/index.js 'backups' 'βœ…πŸ«š Weekly `/` backup completed successfully.' - else - /home/thomas/repos/slack-notifier/src/index.js 'backups' 'β›”πŸ«š Weekly `/` backup failed.' - fi -else - echo "Backup drive not mounted" - /home/thomas/repos/slack-notifier/src/index.js 'backups' 'πŸ’ΎπŸ«š Error: `/` backup drive not mounted.' -fi diff --git a/backups/rsnapshot.conf b/backups/rsnapshot.conf index 1750315..a50b989 100644 --- a/backups/rsnapshot.conf +++ b/backups/rsnapshot.conf @@ -21,7 +21,7 @@ config_version 1.2 # All snapshots will be stored under this root directory. # -snapshot_root /media/backups-home +snapshot_root /media/samsung-T3 # If no_create_root is enabled, rsnapshot will not automatically create the # snapshot_root directory. This is particularly useful if you are backing @@ -164,7 +164,24 @@ lockfile /var/run/rsnapshot.pid #include ??? #include ??? #exclude ??? -#exclude ??? +exclude node_modules +exclude .npm +exclude .mozilla +exclude .config/chromium +exclude .config/google-chrome +exclude .local/share/Trash +exclude .thumbnails +exclude .android +exclude .docker +exclude tmp +exclude .vscode +exclude .electron +exclude .cargo +exclude .yarn +exclude .Trash +exclude .Trash-* +exclude .local/share/Trash +exclude lost+found # The include_file and exclude_file parameters, if enabled, simply get # passed directly to rsync. Please look up the --include-from and @@ -226,8 +243,7 @@ lockfile /var/run/rsnapshot.pid ############################### # LOCALHOST -backup /home/ home/ -exclude "/lost+found/" +backup /home/ home #backup /etc/ etc/ #backup /usr/local/ usr/local/ diff --git a/gruvbox-95/sounds/consolewarning.mp3 b/gruvbox-95/sounds/consolewarning.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..9ef236b2411c6721a9619ed43f3338d7e42372c7 GIT binary patch literal 19233 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 literal 0 HcmV?d00001 diff --git a/kitty/kitty.conf b/kitty/kitty.conf index ebc7388..d008ba8 100644 --- a/kitty/kitty.conf +++ b/kitty/kitty.conf @@ -3,9 +3,10 @@ include ./theme.conf # font_family PragmataPro Mono Liga # bold_font PragmataPro Mono Liga Bold # italic_font PragmataPro Mono Liga Italic -# bold_italic_font PragmataPro Mono Liga Bold Italic +# bold_italic_font PragmataPro Mono Liga Bold Italic -font_family JetBrainsMonoNL Nerd Font + +font_family JetBrainsMono bold_font auto italic_font auto bold_italic_font auto @@ -21,6 +22,10 @@ bold_italic_font auto # italic_font TerminusTTF-Italic # bold_italic_font TerminusTTF-Bold-Italic +# font_family TerminusTTF +# bold_font TerminusTTF-Bold +# italic_font TerminusTTF-Italic + font_size 10 diff --git a/nvim/lazy-lock.json b/nvim/lazy-lock.json index 221fb97..6611ece 100644 --- a/nvim/lazy-lock.json +++ b/nvim/lazy-lock.json @@ -1,9 +1,11 @@ { "LuaSnip": { "branch": "master", "commit": "03c8e67eb7293c404845b3982db895d59c0d1538" }, + "bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" }, "cmp-buffer": { "branch": "main", "commit": "3022dbc9166796b644a841a02de8dd1cc1d311fa" }, "cmp-nvim-lsp": { "branch": "main", "commit": "39e2eda76828d88b773cc27a3f61d2ad782c922d" }, "cmp-path": { "branch": "main", "commit": "91ff86cd9c29299a64f968ebb45846c485725f23" }, "conform.nvim": { "branch": "master", "commit": "023f795dbcf32d4351b6a9ed2e613d471b5bb812" }, + "diffview.nvim": { "branch": "main", "commit": "4516612fe98ff56ae0415a259ff6361a89419b0a" }, "friendly-snippets": { "branch": "main", "commit": "de8fce94985873666bd9712ea3e49ee17aadb1ed" }, "git-blame.nvim": { "branch": "master", "commit": "2883a7460f611c2705b23f12d58d398d5ce6ec00" }, "gitsigns.nvim": { "branch": "main", "commit": "ac5aba6dce8c06ea22bea2c9016f51a2dbf90dc7" }, @@ -21,6 +23,7 @@ "mason.nvim": { "branch": "main", "commit": "e2f7f9044ec30067bc11800a9e266664b88cda22" }, "neo-tree.nvim": { "branch": "v3.x", "commit": "a77af2e764c5ed4038d27d1c463fa49cd4794e07" }, "neodev.nvim": { "branch": "main", "commit": "46aa467dca16cf3dfe27098042402066d2ae242d" }, + "neogit": { "branch": "master", "commit": "6d1bd94f7fca92a50a892f494920696b5defa8c8" }, "nui.nvim": { "branch": "main", "commit": "b58e2bfda5cea347c9d58b7f11cf3012c7b3953f" }, "nvim-autopairs": { "branch": "master", "commit": "ee297f215e95a60b01fde33275cc3c820eddeebe" }, "nvim-cmp": { "branch": "main", "commit": "f17d9b4394027ff4442b298398dfcaab97e40c4f" }, @@ -39,8 +42,6 @@ "vim-commentary": { "branch": "master", "commit": "64a654ef4a20db1727938338310209b6a63f60c9" }, "vim-css-color": { "branch": "master", "commit": "950e80352b325ff26d3b0faf95b29e301c200f7d" }, "vim-fugitive": { "branch": "master", "commit": "d4877e54cef67f5af4f950935b1ade19ed6b7370" }, - "vim-illuminate": { "branch": "master", "commit": "5eeb7951fc630682c322e88a9bbdae5c224ff0aa" }, "vim-smoothie": { "branch": "master", "commit": "df1e324e9f3395c630c1c523d0555a01d2eb1b7e" }, - "vim-wakatime": { "branch": "master", "commit": "cf51327a9e08935569614d1cb24e779ee9f45519" }, "zk-nvim": { "branch": "main", "commit": "aa9b346f2b0ab0c822bef917ee7f607d5c99f7bc" } } diff --git a/nvim/lua/config/colourscheme.lua b/nvim/lua/config/colourscheme.lua index dde12b7..7d9362b 100644 --- a/nvim/lua/config/colourscheme.lua +++ b/nvim/lua/config/colourscheme.lua @@ -1,15 +1,15 @@ -local global = vim.g +-- local global = vim.g -global.gruvbox_material_background = "medium" -global.gruvbox_material_enable_bold = 0 -global.gruvbox_material_enable_italic = 1 +-- global.gruvbox_material_background = "medium" +-- global.gruvbox_material_enable_bold = 0 +-- global.gruvbox_material_enable_italic = 0 -local function update_highlight_group(group, tbl) - local old_hl = vim.api.nvim_get_hl_by_name(group, true) - local new_hl = vim.tbl_extend("force", old_hl, tbl) - vim.api.nvim_set_hl(0, group, new_hl) -end +-- local function update_highlight_group(group, tbl) +-- local old_hl = vim.api.nvim_get_hl_by_name(group, true) +-- local new_hl = vim.tbl_extend("force", old_hl, tbl) +-- vim.api.nvim_set_hl(0, group, new_hl) +-- end -update_highlight_group("Function", { bold = false }) -update_highlight_group("Comment", { italic = true }) -update_highlight_group("String", { italic = false }) +-- update_highlight_group("Function", { bold = false }) +-- update_highlight_group("Comment", { italic = false }) +-- update_highlight_group("String", { italic = false }) diff --git a/nvim/lua/config/keybindings.lua b/nvim/lua/config/keybindings.lua index 83cfc22..dea6ae0 100644 --- a/nvim/lua/config/keybindings.lua +++ b/nvim/lua/config/keybindings.lua @@ -23,3 +23,9 @@ keymap.set("n", "lh", function() local config = vim.diagnostic.config() vim.diagnostic.config({ virtual_text = not config.virtual_text }) end) + +-- Toggle spellcheck +keymap.set("n", "sp", function() + vim.opt.spell = not vim.opt.spell:get() + vim.opt.spelllang = "en_gb" +end, { desc = "Toggle spell check" }) diff --git a/nvim/lua/config/lazy.lua b/nvim/lua/config/lazy.lua index 449e053..e847a1b 100644 --- a/nvim/lua/config/lazy.lua +++ b/nvim/lua/config/lazy.lua @@ -27,7 +27,7 @@ require("lazy").setup({ }, -- Configure any other settings here. See the documentation for more details. -- colorscheme that will be used when installing plugins. - install = { colorscheme = { "gruvbox" } }, + --install = { colorscheme = { "gruvbox-material" } }, -- automatically check for plugin updates checker = { enabled = false }, }) diff --git a/nvim/lua/config/options.lua b/nvim/lua/config/options.lua index 224b157..0d7e1c2 100644 --- a/nvim/lua/config/options.lua +++ b/nvim/lua/config/options.lua @@ -2,7 +2,7 @@ local global = vim.g local opt = vim.opt local diagnostic = vim.diagnostic -vim.api.nvim_set_hl(0, "@keyword.function.python", { italic = true }) +--vim.api.nvim_set_hl(0, "@keyword.function.python", { italic = true }) global.mapleader = ";" global.maplocalleader = "\\" global.lazyvim_picker = "telescope" @@ -33,8 +33,14 @@ opt.formatoptions = "cro" opt.backspace = "indent,eol,start" opt.conceallevel = 0 opt.spelllang = "en_gb" +opt.number = true +opt.relativenumber = true vim.opt.spell = false +-- vim.g.gruvbox_material_enable_bold = 1 +-- vim.g.gruvbox_material_enable_italic = 0 +--vim.g.gruvbox_italic = false + diagnostic.config({ virtual_text = false, }) diff --git a/nvim/lua/plugins/gruvbox-material.lua b/nvim/lua/plugins/gruvbox-material.lua deleted file mode 100644 index 39d95a1..0000000 --- a/nvim/lua/plugins/gruvbox-material.lua +++ /dev/null @@ -1,8 +0,0 @@ -return { - "sainnhe/gruvbox-material", - lazy = false, - priority = 1000, - config = function() - vim.cmd.colorscheme("gruvbox-material") - end, -} diff --git a/nvim/lua/plugins/gruvbox.lua b/nvim/lua/plugins/gruvbox.lua new file mode 100644 index 0000000..3bf0fdd --- /dev/null +++ b/nvim/lua/plugins/gruvbox.lua @@ -0,0 +1,46 @@ +return { + "sainnhe/gruvbox-material", + lazy = false, + priority = 1000, + config = function() + -- Optionally configure and load the colorscheme + -- directly inside the plugin declaration. + + -- vim.g.gruvbox_material_disable_italic_comment = true + vim.g.gruvbox_material_enable_bold = false + vim.g.gruvbox_material_enable_italic = false + vim.cmd.colorscheme("gruvbox-material") + end, +} + +-- return { +-- "https://github.com/ellisonleao/gruvbox.nvim", +-- lazy = false, +-- priority = 1000, +-- config = function() +-- require("gruvbox").setup({ +-- invert_tabline = true, +-- invert_selection = true, +-- terminal_colors = true, -- add neovim terminal colors +-- undercurl = true, +-- underline = true, +-- bold = true, +-- italic = { +-- comments = true, +-- emphasis = false, +-- strings = true, +-- operators = true, +-- folds = false, +-- }, +-- }) +-- vim.cmd.colorscheme("gruvbox") +-- end, +-- } + +-- return { +-- "f4z3r/gruvbox-material.nvim", +-- name = "gruvbox-material", +-- lazy = false, +-- priority = 1000, +-- opts = {}, +-- } diff --git a/nvim/lua/plugins/illuminate.lua b/nvim/lua/plugins/illuminate.lua deleted file mode 100644 index c32928d..0000000 --- a/nvim/lua/plugins/illuminate.lua +++ /dev/null @@ -1,3 +0,0 @@ -return { - "RRethy/vim-illuminate", -} diff --git a/nvim/lua/plugins/lazygit.lua b/nvim/lua/plugins/lazygit.lua index c0c09f1..bd71419 100644 --- a/nvim/lua/plugins/lazygit.lua +++ b/nvim/lua/plugins/lazygit.lua @@ -1,7 +1,17 @@ -return { "kdheepak/lazygit.nvim", keys = { - { - "lg", - "LazyGit", +return { + "kdheepak/lazygit.nvim", + lazy = true, + cmd = { + "LazyGit", + "LazyGitConfig", + "LazyGitCurrentFile", + "LazyGitFilter", + "LazyGitFilterCurrentFile", + }, + -- dependencies = { + -- "nvim-lua/plenary.nvim", + -- }, + keys = { + { "lg", "LazyGit", desc = "LazyGit" }, }, } - } diff --git a/nvim/lua/plugins/neotree.lua b/nvim/lua/plugins/neotree.lua index 896f940..cd8f86a 100644 --- a/nvim/lua/plugins/neotree.lua +++ b/nvim/lua/plugins/neotree.lua @@ -10,4 +10,14 @@ return { keys = { { "fb", ":Neotree" }, }, + config = function() + require("neo-tree").setup({ + filesystem = { + filtered_items = { + visible = true, + hide_dotfiles = false, + }, + }, + }) + end, } diff --git a/nvim/lua/plugins/vim-wakatime.lua b/nvim/lua/plugins/vim-wakatime.lua deleted file mode 100644 index 0c9070e..0000000 --- a/nvim/lua/plugins/vim-wakatime.lua +++ /dev/null @@ -1 +0,0 @@ -return { "wakatime/vim-wakatime" } diff --git a/scripts/convert_img_grvubox.sh b/scripts/convert_img_grvubox.sh new file mode 100755 index 0000000..3ac044e --- /dev/null +++ b/scripts/convert_img_grvubox.sh @@ -0,0 +1,86 @@ +#!/bin/bash + +# Enable debug output +set -x + +# Expanded Gruvbox palette with more intermediate shades +colors=( + # Dark backgrounds + "#282828" # bg + "#32302f" # bg0 + "#3c3836" # bg1 + "#504945" # bg2 + "#665c54" # bg3 + "#7c6f64" # bg4 + + # Light colors + "#ebdbb2" # fg + "#d5c4a1" # fg2 + "#bdae93" # fg3 + "#a89984" # fg4 + + # Bright colors with variations + "#fb4934" # bright red + "#cc241d" # dark red + "#9d0006" # darker red + + "#b8bb26" # bright green + "#98971a" # dark green + "#79740e" # darker green + + "#fabd2f" # bright yellow + "#d79921" # dark yellow + "#b57614" # darker yellow + + "#83a598" # bright blue + "#458588" # dark blue + "#076678" # darker blue + + "#d3869b" # bright purple + "#b16286" # dark purple + "#8f3f71" # darker purple + + "#8ec07c" # bright aqua + "#689d6a" # dark aqua + "#427b58" # darker aqua + + "#fe8019" # bright orange + "#d65d0e" # dark orange + "#af3a03" # darker orange +) + +if [ -z "$1" ]; then + echo "Usage: $0 [output_image.png]" + exit 1 +fi + +input_file="$1" +output_file="${2:-${1%.*}_gruvbox.png}" + +echo "Processing $input_file..." + +# Create color palette file with all colors +palette_cmd="magick convert " +for color in "${colors[@]}"; do + palette_cmd+="xc:$color " +done +palette_cmd+="+append /tmp/palette.png" +eval $palette_cmd + +echo "Created palette..." + +# Process the image with refined parameters +magick convert "$input_file" \ + -colorspace RGB \ + -brightness-contrast 3x10 \ + -level 0%,100%,1.1 \ + -colors 128 \ + -dither None \ + -remap /tmp/palette.png \ + -define png:color-type=6 \ + "$output_file" + +echo "Conversion complete. Output saved to: $output_file" + +# Clean up +rm /tmp/palette.png diff --git a/scripts/dummy_error_script.sh b/scripts/dummy_error_script.sh new file mode 100755 index 0000000..3bcfe4e --- /dev/null +++ b/scripts/dummy_error_script.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +THIS_FILE=${0} +SLACK_NOTIFIER="/home/thomas/repos/utilities/slack_notifier.sh" +COMMAND=$(ls /nonexisting_dir 2>&1 1>/dev/null) +#COMMAND=$(ls . 2>&1 1>/dev/null) + +if ! $COMMAND; then + $SLACK_NOTIFIER "test" "error" "Something went wrong" "$COMMAND" "$THIS_FILE" +else + $SLACK_NOTIFIER "test" "success" "All good!" +fi diff --git a/scripts/monitor_mullvad.sh b/scripts/monitor_mullvad.sh new file mode 100755 index 0000000..58da07c --- /dev/null +++ b/scripts/monitor_mullvad.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +while true; do + # Check both Mullvad connection and internet connectivity + if ! mullvad status | grep -q "Connected"; then + echo "$(date '+%H:%M:%S') - Mullvad reports as disconnected. Reconnecting..." + mullvad disconnect + sleep 2 + mullvad connect + + # Wait a moment for connection to establish + sleep 2 + + # Verify and report the new connection status + if mullvad status | grep -q "Connected"; then + echo "$(date '+%H:%M:%S') - Successfully reconnected to Mullvad" + fi + elif ! ping -c 1 google.com &>/dev/null; then + echo "$(date '+%H:%M:%S') - Ping to google.com failed. Reconnecting..." + mullvad disconnect + sleep 2 + mullvad connect + + # Wait a moment for connection to establish + sleep 2 + + # Verify and report the new connection status + if mullvad status | grep -q "Connected" && ping -c 1 google.com &>/dev/null; then + echo "$(date '+%H:%M:%S') - Successfully reconnected to Mullvad with internet access" + fi + fi + sleep 1 +done diff --git a/scripts/slack_notifier.sh b/scripts/slack_notifier.sh new file mode 100644 index 0000000..6a8a919 --- /dev/null +++ b/scripts/slack_notifier.sh @@ -0,0 +1,82 @@ +#!/bin/bash + +# Check that this can be sourced by cron at actual runtime + +# Env vars: +# --- Webhook URLs for given channel, eg $SLACK_WEBHOOK_TEST, $SLACK_WEBHOOK_EOLAS +# --- sourced from `.env` file in Zsh path + +# Parameters: +# --- $1 = Slack channel, +# --- $2 = type 'error' | 'success' +# --- $3 = Message +# --- $4 = (Opt) Error details +# --- $5 = (Opt) Error source + +# Usage: +# --- ./slack_notifier.sh test 'SUCCESS: It worked' +# --- ./slack_notifier.sh test 'ERROR: Something went wrong' 'Error message' + +declare -A CHANNEL_TO_WEBHOOK +CHANNEL_TO_WEBHOOK["test"]=$SLACK_WEBHOOK_TEST +CHANNEL_TO_WEBHOOK["backups"]=$SLACK_WEBHOOK_BACKUPS +CHANNEL_TO_WEBHOOK["eolas"]=$SLACK_WEBHOOK_EOLAS +CHANNEL_TO_WEBHOOK["website"]=$SLACK_WEBHOOK_SYSTEMS_OBSCURE +CHANNEL_TO_WEBHOOK["time-tracking"]=$SLACK_WEBHOOK_TIME_TRACKING + +WEBHOOK=${CHANNEL_TO_WEBHOOK[$1]} + +ERROR_BLOCKS=$( + jq -n \ + --arg channel "$1" \ + --arg message "$3" \ + --arg details "$4" \ + --arg source "$5" \ + '{ + channel: $channel, + blocks: ([ + { + type: "section", + text: { + type: "plain_text", + text: "πŸ”΄" + $message + } + }, + { + type: "section", + text: { + type: "mrkdwn", + text: "```\n\($details)\n```" + } + }, + { + "type": "context", + "elements": [ + { + "type": "plain_text", + text: $source + } + ] + } + ]) + }' +) + +# Initialise sound playback +mpv --volume=0 --start=0 --length=0.1 /home/thomas/dotfiles/gruvbox-95/sounds/st-computer-on.mp3 +sleep 1 + +# Process notification +if [ "$2" != "error" ]; then + curl -X POST \ + -H 'Content-type: application/json' \ + --data '{"text":"🟒 '"$3"'"}' \ + "$WEBHOOK" + mpv --volume=100 /home/thomas/dotfiles/sounds/star-trek-computer-success.mp3 +else + curl -X POST \ + -H 'Content-type: application/json' \ + --json "$ERROR_BLOCKS" \ + "$WEBHOOK" + mpv --volume=100 /home/thomas/dotfiles/sounds/star-trek-computer-error.mp3 +fi diff --git a/sounds/star-trek-computer-error.mp3 b/sounds/star-trek-computer-error.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..92914cb8ef29f2e1027fb9cc26ff9c02f0bc6145 GIT binary patch literal 15393 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