diff --git a/.aliases.sh b/.aliases.sh index 5b077de..9f3e6bd 100644 --- a/.aliases.sh +++ b/.aliases.sh @@ -36,3 +36,10 @@ fi # ──────────────────────── zoxide (cd -> zoxide) ────────────────────── eval "$(zoxide init --cmd cd zsh)" + +# ──────────────────────────────── gitea ────────────────────────────── +PROG=tea _CLI_ZSH_AUTOCOMPLETE_HACK=1 source "/home/goodhumored/.config/tea/autocomplete.zsh" +if command -v tea > /dev/null; then + alias tprl="tea pr list" + alias tprl="tea pr list" +fi diff --git a/.config/Code/User/settings.json b/.config/Code/User/settings.json index f02d455..0192970 100644 --- a/.config/Code/User/settings.json +++ b/.config/Code/User/settings.json @@ -1,4 +1,5 @@ { "bitoAI.codeCompletion.enableAutoCompletion": false, - "bitoAI.codeCompletion.enableCommentToCode": true + "bitoAI.codeCompletion.enableCommentToCode": true, + "database-client.autoSync": true } \ No newline at end of file diff --git a/.config/dunst/dunstrc b/.config/dunst/dunstrc index c6ddd6f..5d6ba31 100644 --- a/.config/dunst/dunstrc +++ b/.config/dunst/dunstrc @@ -329,33 +329,6 @@ # where there are multiple screens with very different dpi values. per_monitor_dpi = false - -[urgency_low] - # IMPORTANT: colors have to be defined in quotation marks. - # Otherwise the "#" and following would be interpreted as a comment. - background = "#222222" - foreground = "#888888" - timeout = 10 - # Icon for notifications with low urgency, uncomment to enable - #default_icon = /path/to/icon - -[urgency_normal] - background = "#00000077" - foreground = "#ffffff" - timeout = 10 - override_pause_level = 30 - # Icon for notifications with normal urgency, uncomment to enable - #default_icon = /path/to/icon - -[urgency_critical] - background = "#900000" - foreground = "#ffffff" - frame_color = "#ff0000" - timeout = 0 - override_pause_level = 60 - # Icon for notifications with critical urgency, uncomment to enable - #default_icon = /path/to/icon - # Every section that isn't one of the above is interpreted as a rules to # override settings for certain messages. # @@ -484,10 +457,6 @@ # set_stack_tag = "volume" # -[notification_sound] - summary = "*" - script = ~/.config/dunst/play-notif-sound.sh - [pomodoro] appname = "notify-send" summary = "Timer *" @@ -495,16 +464,51 @@ urgency = normal script = ~/.config/dunst/play-pomodoro.sh +[pomodoro] + summary = "Timer *" + urgency = normal + script = ~/.config/dunst/play-pomodoro.sh + [low-battery] appname = "poweralertd" # summary = "Timer *" category = "power.low" script = ~/.config/dunst/play-low-battery-sound.sh +[proclickm] + summary = "ProClickM" + urgency = low + timeout = 1 + history_ignore = yes + [critical-battery] appname = "poweralertd" # summary = "Timer *" + urgency = critical category = "power.critical" script = ~/.config/dunst/play-low-battery-sound.sh +[low-urgency] + background = "#222222" + foreground = "#888888" + frame_color = "#888888" + +[medium-urgency] + msg_urgency = "normal" + background = "#00000077" + foreground = "#ffffff" + frame_color = "#ff4d00" + timeout = 10 + override_pause_level = 30 + script = ~/.config/dunst/play-notif-sound.sh + +[critical-urgency] + msg_urgency = "critical" + background = "#900000" + foreground = "#ffffff" + frame_color = "#ff0000" + timeout = 0 + override_pause_level = 60 + script = ~/.config/dunst/play-error-sound.sh + # vim: ft=cfg diff --git a/.config/dunst/play-error-sound.sh b/.config/dunst/play-error-sound.sh new file mode 100755 index 0000000..20ca73d --- /dev/null +++ b/.config/dunst/play-error-sound.sh @@ -0,0 +1 @@ +paplay ~/.config/dunst/sounds/error.mp3 diff --git a/.config/dunst/sounds/error.mp3 b/.config/dunst/sounds/error.mp3 new file mode 100644 index 0000000..937019b Binary files /dev/null and b/.config/dunst/sounds/error.mp3 differ diff --git a/.config/hypr/conf/keybindings.conf b/.config/hypr/conf/keybindings.conf index 0482b23..1734dac 100644 --- a/.config/hypr/conf/keybindings.conf +++ b/.config/hypr/conf/keybindings.conf @@ -11,11 +11,12 @@ $mainMod = SUPER # Sets "Windows" key as main modifier # apps bind = $mainMod, T, exec, $terminal # terminal -bind = $mainMod SHIFT, T, exec, ~/.config/hypr/scripts/show-crow.sh +bind = $mainMod SHIFT, T, exec, crow bind = $mainMod CTRL SHIFT, T, exec, ~/.config/hypr/scripts/translate-selection.sh bind = $mainMod, E, exec, $fileManager # file manager bind = $mainMod, A, exec, $toggle_menu_cmd # wofi bind = $mainMod CTRL ALT, V, exec, ~/.config/hypr/scripts/dnd-clipboard.sh +bind = $mainMod CTRL SHIFT ALT, H, exec, ~/.config/hypr/scripts/toggle_hdr.sh # ─────────────────────────── switch wallpaper ─────────────────────────── bind = $mainMod SHIFT CTRL ALT, R, exec, ~/.config/hypr/scripts/cycle-wp.sh @@ -29,7 +30,7 @@ bind = $mainMod, V, togglefloating, # toggle float bind = $mainMod, P, pseudo, # pseudo bind = $mainMod, DELETE, exit, # pseudo bind = $mainMod, R, togglesplit, # toggle split -bind = $mainMod CTRL, L, exec, hyprlock # lock screen +bind = $mainMod CTRL, L, exec, ~/.config/hypr/scripts/update-hyprlock-wp.sh && hyprctl switchxkblayout all 0 && hyprlock # lock screen # ─────────────────────────── move workspaces ───────────────────────── bind = CTRL ALT $mainMod SHIFT CTRL ALT, H, movecurrentworkspacetomonitor, l @@ -95,6 +96,11 @@ bind = SHIFT, Print, exec, grimblast copy screen --freeze --notify --cursor # ───────────────────────────────── OCR ─────────────────────────────── bind = $mainMod SHIFT, C, exec, wl-copy $(grimblast save area - | magick png:- pgm:- | gocr -) +# ───────────────────────────────── vpn ─────────────────────────────── +bind = $mainMod SHIFT CTRL ALT, V, exec, ~/.config/scripts/select-vpn.sh + +# ──────────────────────────────── pass ─────────────────────────────── +bind = $mainMod SHIFT CTRL ALT, p, exec, ~/.config/scripts/copy-pass.sh # ╭──────────────────────────────────────────────────────────╮ # │ mediakeys │ @@ -115,9 +121,26 @@ bindl=, XF86AudioPrev, exec, playerctl --player=$(cat ~/.config/chosen_player) p bindl= CTRL ALT SHIFT, H, exec, playerctl --player=$(cat ~/.config/chosen_player) previous bindl= CTRL ALT SHIFT, L, exec, playerctl --player=$(cat ~/.config/chosen_player) next bindl= CTRL ALT SHIFT, SPACE, exec, playerctl --player=$(cat ~/.config/chosen_player) play-pause +# ─────────────────── win + press roller = play-pause ───────────────── +bindl=$mainMod, XF86AudioMute, exec, playerctl --player=$(cat ~/.config/chosen_player) play-pause +# ────────────────────── win + roller = brightness ──────────────────── +bindle=$mainMod, XF86AudioRaiseVolume, exec, ~/.config/scripts/set_brightness.sh +10% +bindle=$mainMod, XF86AudioLowerVolume, exec, ~/.config/scripts/set_brightness.sh 10%- +# ────────────────────── win + alt + roller = monitor brightness ──────────────────── +bindle=$mainMod ALT, XF86AudioRaiseVolume, exec, ~/.config/scripts/set_brightness_other_monitors.sh +10 +bindle=$mainMod ALT, XF86AudioLowerVolume, exec, ~/.config/scripts/set_brightness_other_monitors.sh -10 +# ───────────── win + ctrl + alt + shift + roller = playback ───────────── +bindle=$mainMod ALT SHIFT CTRL, XF86AudioRaiseVolume, exec, playerctl --player=$(cat ~/.config/chosen_player) position 1+ +bindle=$mainMod ALT SHIFT CTRL, XF86AudioLowerVolume, exec, playerctl --player=$(cat ~/.config/chosen_player) position 1- +# ────────────────────── alt + roller = vert scroll ────────────────────── +bindle=ALT, XF86AudioLowerVolume, exec, xdotool click 4 +bindle=ALT, XF86AudioRaiseVolume, exec, xdotool click 5 +# ────────────────── alt + shift + roller = hor scroll ────────────────── +bindle=ALT SHIFT, XF86AudioLowerVolume, exec, xdotool click 6 +bindle=ALT SHIFT, XF86AudioRaiseVolume, exec, xdotool click 7 # ─────────────────────── select pulseaudio output ─────────────────────── -bind= CTRL ALT SHIFT, O, exec, ~/.config/hypr/scripts/wofi-pulse-output.sh +bind=CTRL ALT SHIFT, O, exec, ~/.config/hypr/scripts/wofi-pulse-output.sh # ─────────────────────── select playerctl player ───────────────────── bind= CTRL ALT SHIFT, P, exec, ~/.config/hypr/scripts/wofi-player.sh @@ -126,5 +149,9 @@ bind= CTRL ALT SHIFT, P, exec, ~/.config/hypr/scripts/wofi-player.sh bindm = $mainMod, mouse:272, movewindow bindm = $mainMod, mouse:273, resizewindow +# ─────────────────────────── LID MONITOR OFF ───────────────────────── +# При закрытии крышки (Lid Switch включён) +bindl = , switch:on:Lid Switch, exec, hyprctl keyword monitor "eDP-1, disable" - +# При открытии крышки (Lid Switch выключён) +bindl = , switch:off:Lid Switch, exec, hyprctl keyword monitor "eDP-1, preferred, auto, 1" diff --git a/.config/hypr/experimental_features.conf b/.config/hypr/experimental_features.conf new file mode 100644 index 0000000..592df2d --- /dev/null +++ b/.config/hypr/experimental_features.conf @@ -0,0 +1,4 @@ +experimental { + xx_color_management_v4 = false +} + diff --git a/.config/hypr/hyprland.conf b/.config/hypr/hyprland.conf index bb09f09..59fb1e7 100644 --- a/.config/hypr/hyprland.conf +++ b/.config/hypr/hyprland.conf @@ -21,6 +21,14 @@ $terminal = kitty $fileManager = $terminal tmux new-session -s tmp-file-manager 'yazi' $toggle_menu_cmd = pgrep wofi >/dev/null 2>&1 && killall wofi || wofi --show drun +# experimental features (HDR) +source = ./experimental_features.conf + +render { + cm_fs_passthrough = 1 + cm_enabled = true +} + # ╭──────────────────────────────────────────────────────────╮ # │ AUTOSTART │ # ╰──────────────────────────────────────────────────────────╯ @@ -158,9 +166,9 @@ source = ./conf/keybindings.conf # │ WINDOWRULES │ # ╰──────────────────────────────────────────────────────────╯ # ──────────────────────────────── copyq ────────────────────────────── -windowrule = size 300 400,^(copyq)$ -windowrule = float,com.github.hluk.copyq -windowrule = move onscreen cursor,com.github.hluk.copyq +windowrule = size 300 400,class:^(copyq)$ +windowrule = float,class:com.github.hluk.copyq +windowrule = move onscreen cursor,class:com.github.hluk.copyq # ────────────────────── Browser Picture in Picture ────────────────────── windowrulev2 = float, title:^(Picture-in-Picture)$ @@ -172,25 +180,25 @@ windowrulev2 = float, title:(Media viewer) windowrulev2 = fullscreen, title:^(Media viewer)$ # different floating modals -windowrule = maxsize 400 300, (blueman|io.crow_translate.CrowTranslate) -windowrule = float, (pavucontrol|blueman-manager|wofi|rofi|imv|io.crow_translate.CrowTranslate) -windowrule = pin, (pavucontrol|blueman-manager|wofi|rofi|io.crow_translate.CrowTranslate) -windowrule = stayfocused, (pavucontrol|blueman-manager|wofi|rofi|io.crow_translate.CrowTranslate) -windowrule = move onscreen cursor,(pavucontrol|blueman-manager|imv|io.crow_translate.CrowTranslate) +windowrule = maxsize 400 300, class:(blueman|org.kde.CrowTranslate) +windowrule = float, class:(pavucontrol|blueman-manager|wofi|Rofi|imv|org.kde.CrowTranslate) +windowrule = pin, class:(pavucontrol|blueman-manager|wofi|Rofi|org.kde.CrowTranslate) +windowrule = stayfocused, class:(pavucontrol|blueman-manager|wofi|Rofi|org.kde.CrowTranslate) +windowrule = move onscreen cursor,class:(pavucontrol|blueman-manager|imv|org.kde.CrowTranslate) -windowrule = center, (wofi) +windowrule = center, class:(wofi) windowrule = workspace 3, title:^(.*)(Telegram)(.*)$ windowrule = workspace 1, title:^(.*)(Firefox)(.*)$ windowrule = workspace special:music, title:(.*)((M|m)usic|(М|м)узыка)(.*) windowrule = float, title:(.*)((M|m)usic|(М|м)узыка)(.*) windowrule = size 1500 900, title:(.*)((M|m)usic|(М|м)узыка)(.*) # Example windowrule v2 -windowrulev2 = float,class:^(cursor-float)$ -windowrulev2 = move onscreen cursor,class:^(cursor-float)$ +windowrule = float,class:^(cursor-float)$ +windowrule = move onscreen cursor,class:^(cursor-float)$ -windowrulev2 = float,class:^(dmenu)$ -windowrulev2 = pin,class:^(dmenu)$ -windowrulev2 = stayfocused,class:^(dmenu)$ +windowrule = float,class:^(dmenu)$ +windowrule = pin,class:^(dmenu)$ +windowrule = stayfocused,class:^(dmenu)$ # windowrulev2 = move onscreen cursor,class:^(dmenu)$ # @@ -199,13 +207,12 @@ windowrule = tile, class:(.*)(MATLAB)(.*) windowrule = workspace 6, class:(.*)(MATLAB)(.*) windowrule = size 400 400, class:(.*)(MATLAB)(.*) -windowrule = tile, (.*)(Figure)(.*) -windowrule = workspace 6, (.*)(Figure)(.*) -windowrule = size 400 400, (.*)(Figure)(.*) +windowrule = tile, class:(.*)(Figure)(.*) +windowrule = workspace 6, class:(.*)(Figure)(.*) +windowrule = size 400 400, class:(.*)(Figure)(.*) -windowrulev2 = suppressevent maximize, class:.* # You'll probably like this. - +windowrule = suppressevent maximize, class:.* # You'll probably like this. workspace = special:music, opacity:0.5 workspace = opacity 0.5, onworkspace:name:special:music diff --git a/.config/hypr/hyprlock-bg.conf b/.config/hypr/hyprlock-bg.conf new file mode 100644 index 0000000..838a7a9 --- /dev/null +++ b/.config/hypr/hyprlock-bg.conf @@ -0,0 +1,9 @@ +background { + monitor = eDP-1 + path = /home/goodhumored/wallpapers/3.png +} +background { + monitor = DP-2 + path = /home/goodhumored/wallpapers/3.png +} + diff --git a/.config/hypr/hyprlock.conf b/.config/hypr/hyprlock.conf index 1ed284b..d0723a1 100644 --- a/.config/hypr/hyprlock.conf +++ b/.config/hypr/hyprlock.conf @@ -5,11 +5,8 @@ # |_| |_|\__, | .__/|_| |_|\___/ \___|_|\_\ # |___/|_| # - -background { - monitor = - path = $HOME/wallpapers/isaac_cathedral.jpg -} +# +source = ./hyprlock-bg.conf label { monitor = @@ -43,7 +40,7 @@ input-field { rounding = -1 # -1 means complete rounding (circle/oval) check_color = rgb(204, 136, 34) fail_color = rgb(204, 34, 34) # if authentication failed, changes outer_color and fail message color - fail_text = Неправильно, попробуй ещё раз! (попыток осталось: $ATTEMPTS) # can be set to empty + fail_text = Неправильно, попробуй ещё раз! (Попытка $ATTEMPTS из 3) # can be set to empty fail_transition = 300 # transition time in ms between normal outer_color and fail_color capslock_color = rgb(150, 34, 34) numlock_color = -1 diff --git a/.config/hypr/monitors.conf b/.config/hypr/monitors.conf index 2e5d9bc..7fba15d 100644 --- a/.config/hypr/monitors.conf +++ b/.config/hypr/monitors.conf @@ -21,4 +21,5 @@ monitor=desc:Iiyama North America PL3270Q 1155103721286,2560x1440@59.95,-640x-14 # Домашний монитор monitor=desc:BNQ BenQ G925HDA 29A01966019,prefered,auto,1.0 monitor=desc:HJW MACROSILICON 0x0002E842,prefered,320x-720,1.0 -monitor=desc:Huawei Technologies Co. Inc. ZQE-CBA 0xC080F622,3440x1440@99.98Hz,-760x-1440,1,bitdepth +monitor=desc:Huawei Technologies Co. Inc. ZQE-CBA 0xC080F622,3440x1440@100Hz,-760x-1440,1,bitdepth,10, cm, hdr +monitor=desc:Huawei Technologies Co. Inc. ZQE-CBA 0xC080F622,3440x1440@100Hz,-760x-1440,1,bitdepth,10 diff --git a/.config/hypr/scripts/scroll.py b/.config/hypr/scripts/scroll.py new file mode 100644 index 0000000..51f6510 --- /dev/null +++ b/.config/hypr/scripts/scroll.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python3 +from evdev import UInput, ecodes as e +import sys + +# Определяем возможности устройства +capabilities = { + e.EV_REL: [e.REL_WHEEL, e.REL_HWHEEL], # Список кодов для EV_REL + e.EV_SYN: [e.SYN_REPORT], # Список кодов для EV_SYN +} + +# Создаём виртуальное устройство +ui = UInput(capabilities, name="virtual-scroll-device") + +def scroll(direction, horizontal=False): + if horizontal: + ui.write(e.EV_REL, e.REL_HWHEEL, direction) + else: + ui.write(e.EV_REL, e.REL_WHEEL, direction) + ui.syn() + +# Обработка аргументов +if len(sys.argv) < 2: + print("Usage: scroll.py ") + sys.exit(1) + +cmd = sys.argv[1] +if cmd == "up": + scroll(1) +elif cmd == "down": + scroll(-1) +elif cmd == "left": + scroll(-1, horizontal=True) +elif cmd == "right": + scroll(1, horizontal=True) + +ui.close() diff --git a/.config/hypr/scripts/toggle_hdr.sh b/.config/hypr/scripts/toggle_hdr.sh new file mode 100755 index 0000000..82c8083 --- /dev/null +++ b/.config/hypr/scripts/toggle_hdr.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +# Path to the file storing the variables +SETTINGS_FILE="$HOME/.config/hypr/experimental_features.conf" + +# Read the current values from the file +HDR=$(grep -oP 'hdr\s*=\s*\K(true|false)' "$SETTINGS_FILE") +WIDE_COLOR=$(grep -oP 'wide_color_gamut\s*=\s*\K(true|false)' "$SETTINGS_FILE") +XX_COLOR=$(grep -oP 'xx_color_management_v4\s*=\s*\K(true|false)' "$SETTINGS_FILE") + +# Toggle the values +TOGGLE() { + if [ "$1" == "true" ]; then + echo "false" + else + echo "true" + fi +} + +NEW_HDR=$(TOGGLE "$HDR") +NEW_WIDE_COLOR=$(TOGGLE "$WIDE_COLOR") +NEW_XX_COLOR=$(TOGGLE "$XX_COLOR") + +# Update the file with the new values +sed -i "s/hdr\s*=\s*$HDR/hdr = $NEW_HDR/" "$SETTINGS_FILE" +sed -i "s/wide_color_gamut\s*=\s*$WIDE_COLOR/wide_color_gamut = $NEW_WIDE_COLOR/" "$SETTINGS_FILE" +sed -i "s/xx_color_management_v4\s*=\s*$XX_COLOR/xx_color_management_v4 = $NEW_XX_COLOR/" "$SETTINGS_FILE" + +# Optional: Notify the user of the new values +notify-send "Experimental Settings Toggled" "hdr = $NEW_HDR\nwide_color_gamut = $NEW_WIDE_COLOR\nxx_color_management_v4 = $NEW_XX_COLOR" diff --git a/.config/hypr/scripts/update-hyprlock-wp.sh b/.config/hypr/scripts/update-hyprlock-wp.sh new file mode 100755 index 0000000..7571ea8 --- /dev/null +++ b/.config/hypr/scripts/update-hyprlock-wp.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +# Get the wallpaper information from hyprctl +hyprctl_output=$(hyprctl hyprpaper listactive) + +echo "$hyprctl_output" + +# Read the lines into an array and reverse their order +mapfile -t lines <<< "$hyprctl_output" +reversed_lines=() +for ((i=${#lines[@]}-1; i>=0; i--)); do + reversed_lines+=("${lines[i]}") +done + +# Generate the config content +config_content="" +for line in "${reversed_lines[@]}"; do + # Split line into monitor and path parts + IFS='=' read -r monitor_part path_part <<< "$line" + + # Trim whitespace from both parts + monitor=$(echo "$monitor_part" | xargs) + path=$(echo "$path_part" | xargs) + + # Skip entries with empty monitor names + [[ -z "$monitor" ]] && continue + + # Append to the config content + config_content+="background { + monitor = $monitor + path = $path +} +" +done + +# Write to the configuration file +config_file="$HOME/.config/hypr/hyprlock-bg.conf" +echo "$config_content" > "$config_file" + +echo "Generated hyprlock background config at: $config_file" diff --git a/.config/nvim/lua/goodhumored/appearance/code/image.lua b/.config/nvim/lua/goodhumored/appearance/code/image.lua.disable similarity index 100% rename from .config/nvim/lua/goodhumored/appearance/code/image.lua rename to .config/nvim/lua/goodhumored/appearance/code/image.lua.disable diff --git a/.config/nvim/lua/goodhumored/comfort-features/folding-ufo.lua b/.config/nvim/lua/goodhumored/comfort-features/folding-ufo.lua new file mode 100644 index 0000000..8c4f577 --- /dev/null +++ b/.config/nvim/lua/goodhumored/comfort-features/folding-ufo.lua @@ -0,0 +1,56 @@ +return { + "kevinhwang91/nvim-ufo", + dependencies = { "kevinhwang91/promise-async" }, + config = function() + vim.o.foldcolumn = "1" -- '0' is not bad + vim.o.foldlevel = 99 -- Using ufo provider need a large value, feel free to decrease the value + vim.o.foldlevelstart = 99 + vim.o.foldenable = true + + -- Using ufo provider need remap `zR` and `zM`. If Neovim is 0.6.1, remap yourself + vim.keymap.set("n", "zR", require("ufo").openAllFolds) + vim.keymap.set("n", "zM", require("ufo").closeAllFolds) + + -- Option 1: coc.nvim as LSP client + -- use({ "neoclide/coc.nvim", branch = "master", run = "yarn install --frozen-lockfile" }) + -- require("ufo").setup() + -- + + -- Option 2: nvim lsp as LSP client + -- Tell the server the capability of foldingRange, + -- Neovim hasn't added foldingRange to default capabilities, users must add it manually + local capabilities = vim.lsp.protocol.make_client_capabilities() + capabilities.textDocument.foldingRange = { + dynamicRegistration = false, + lineFoldingOnly = true, + } + local language_servers = vim.lsp.get_clients() -- or list servers manually like {'gopls', 'clangd'} + for _, ls in ipairs(language_servers) do + require("lspconfig")[ls].setup({ + capabilities = capabilities, + -- you can add other fields for setting up lsp server in this table + }) + end + require("ufo").setup() + -- + + -- Option 3: treesitter as a main provider instead + -- (Note: the `nvim-treesitter` plugin is *not* needed.) + -- ufo uses the same query files for folding (queries//folds.scm) + -- performance and stability are better than `foldmethod=nvim_treesitter#foldexpr()` + -- require("ufo").setup({ + -- provider_selector = function(bufnr, filetype, buftype) + -- return { "treesitter", "indent" } + -- end, + -- }) + -- + + -- Option 4: disable all providers for all buffers + -- Not recommend, AFAIK, the ufo's providers are the best performance in Neovim + -- require("ufo").setup({ + -- provider_selector = function(bufnr, filetype, buftype) + -- return "" + -- end, + -- }) + end, +} diff --git a/.config/nvim/lua/goodhumored/common-bindings.lua b/.config/nvim/lua/goodhumored/common-bindings.lua index 79b08bd..b3b0b08 100644 --- a/.config/nvim/lua/goodhumored/common-bindings.lua +++ b/.config/nvim/lua/goodhumored/common-bindings.lua @@ -63,6 +63,9 @@ vim.keymap.set("n", "th", ":tabprev", { desc = "[T]ab left", noremap = true, vim.keymap.set("n", "tj", ":tabfirst", { desc = "[T]ab home", noremap = true, silent = true }) vim.keymap.set("n", "tk", ":tablast", { desc = "[T]ab end", noremap = true, silent = true }) +-- ───────────────────────── close other buffers ───────────────────────── +vim.keymap.set("n", "", ':%bdelete|edit #|normal `"', { noremap = true, silent = true }) + -- ╭─────────────────────────────────────────────────────────╮ -- │ Moving lines │ -- ╰─────────────────────────────────────────────────────────╯ diff --git a/.config/nvim/lua/goodhumored/core/dap/dap.lua b/.config/nvim/lua/goodhumored/core/dap/dap.lua index 83c4473..c07352f 100644 --- a/.config/nvim/lua/goodhumored/core/dap/dap.lua +++ b/.config/nvim/lua/goodhumored/core/dap/dap.lua @@ -113,6 +113,54 @@ return { protocol = "inspector", console = "integratedTerminal", }, + { + type = "pwa-node", + request = "launch", + name = "Launch NestJS App (Watch Mode with Pino)", + runtimeExecutable = "sh", + runtimeArgs = { + "-c", + "ts-node-dev --respawn --watch ${workspaceFolder}/src ${workspaceFolder}/src/main.ts | npx pino-pretty", + }, + envFile = "${workspaceFolder}/.env", + trace = true, + cwd = "${workspaceFolder}", + sourceMaps = true, + protocol = "inspector", + console = "integratedTerminal", + }, + { + type = "pwa-node", + request = "launch", + name = "Launch NestJS App (Watch Mode with Pino) no crash", + runtimeExecutable = "sh", + runtimeArgs = { + "-c", + "ts-node-dev --respawn --watch ${workspaceFolder}/src ${workspaceFolder}/src/main.ts | npx pino-pretty", + }, + envFile = "${workspaceFolder}/.env", + trace = true, + cwd = "${workspaceFolder}", + sourceMaps = true, + protocol = "inspector", + console = "integratedTerminal", + restart = true, + autoContinue = false, + outputCapture = "std", + }, + { + type = "pwa-node", + request = "attach", + name = "Attach to NestJS App (Watch Mode)", + port = 9229, -- Порт по умолчанию для --inspect + address = "localhost", + cwd = "${workspaceFolder}", + sourceMaps = true, + protocol = "inspector", + restart = true, -- Переподключение при рестарте процесса + trace = true, + console = "integratedTerminal", + }, { type = "pwa-node", request = "launch", diff --git a/.config/nvim/lua/goodhumored/editing/autocomplete.lua b/.config/nvim/lua/goodhumored/editing/autocomplete.lua index 6e4cf7f..aaa5373 100644 --- a/.config/nvim/lua/goodhumored/editing/autocomplete.lua +++ b/.config/nvim/lua/goodhumored/editing/autocomplete.lua @@ -66,6 +66,7 @@ return { -- Autocompletion -- This will auto-import if your LSP supports it. -- This will expand snippets if the LSP sent a snippet. [""] = cmp.mapping.confirm({ select = true }), + [""] = cmp.mapping.abort(), -- If you prefer more traditional completion keymaps, -- you can uncomment the following lines @@ -76,7 +77,7 @@ return { -- Autocompletion -- Manually trigger a completion from nvim-cmp. -- Generally you don't need this, because nvim-cmp will display -- completions whenever it has completion options available. - [""] = cmp.mapping.complete(), + [""] = cmp.mapping.complete(), -- Think of as moving to the right of your snippet expansion. -- So if you have a snippet that's like: diff --git a/.config/nvim/lua/goodhumored/editing/tables-(vim-table-mode).lua b/.config/nvim/lua/goodhumored/editing/tables-(vim-table-mode).lua new file mode 100644 index 0000000..b746d28 --- /dev/null +++ b/.config/nvim/lua/goodhumored/editing/tables-(vim-table-mode).lua @@ -0,0 +1,10 @@ +return { + "dhruvasagar/vim-table-mode", + config = function() + -- -- Set table_mode_corner_corner to '+' + -- vim.g.table_mode_corner_corner = "+" + -- + -- -- Set table_mode_header_fillchar to '=' + -- vim.g.table_mode_header_fillchar = "=" + end, +} diff --git a/.config/nvim/lua/goodhumored/languages/neorg/neorg.lua b/.config/nvim/lua/goodhumored/languages/neorg/neorg.lua index c3d5449..d9445c1 100644 --- a/.config/nvim/lua/goodhumored/languages/neorg/neorg.lua +++ b/.config/nvim/lua/goodhumored/languages/neorg/neorg.lua @@ -12,8 +12,8 @@ return { load = { ["core.defaults"] = {}, ["core.concealer"] = {}, - ["core.integrations.image"] = {}, - ["core.latex.renderer"] = {}, + -- ["core.integrations.image"] = {}, + -- ["core.latex.renderer"] = {}, ["core.export"] = { config = { -- Note that this table is optional and doesn't need to be provided -- Configuration here diff --git a/.config/nvim/lua/goodhumored/lazy.lua b/.config/nvim/lua/goodhumored/lazy.lua index 95fb260..2732d9a 100644 --- a/.config/nvim/lua/goodhumored/lazy.lua +++ b/.config/nvim/lua/goodhumored/lazy.lua @@ -16,6 +16,7 @@ local languagesPlugins = require("goodhumored.languages") require("lazy").setup({ { import = "goodhumored.appearance.code" }, { import = "goodhumored.appearance.theme" }, + { import = "goodhumored.snacks.snacks-nvim" }, { import = "goodhumored.appearance.ui" }, { import = "goodhumored.appearance.tint-unfocused" }, { import = "goodhumored.comfort-features" }, diff --git a/.config/nvim/lua/goodhumored/snacks/snacks-nvim.lua b/.config/nvim/lua/goodhumored/snacks/snacks-nvim.lua new file mode 100644 index 0000000..21be438 --- /dev/null +++ b/.config/nvim/lua/goodhumored/snacks/snacks-nvim.lua @@ -0,0 +1,175 @@ +return { + "folke/snacks.nvim", + priority = 1000, + lazy = false, + ---@type snacks.Config + opts = { + -- your configuration comes here + -- or leave it empty to use the default settings + -- refer to the configuration section below + bigfile = { enabled = true }, + bufdelete = { enabled = true }, + dashboard = { enabled = true }, + debug = { enabled = true }, + image = { + enabled = true, + formats = { + "png", + "jpg", + "jpeg", + "gif", + "bmp", + "webp", + "tiff", + "heic", + "avif", + "mp4", + "mov", + "avi", + "mkv", + "webm", + "pdf", + }, + force = false, -- try displaying the image, even if the terminal does not support it + doc = { + -- enable image viewer for documents + -- a treesitter parser must be available for the enabled languages. + enabled = true, + -- render the image inline in the buffer + -- if your env doesn't support unicode placeholders, this will be disabled + -- takes precedence over `opts.float` on supported terminals + inline = true, + -- render the image in a floating window + -- only used if `opts.inline` is disabled + float = true, + max_width = 80, + max_height = 40, + -- Set to `true`, to conceal the image text when rendering inline. + conceal = false, -- (experimental) + }, + img_dirs = { "img", "images", "assets", "static", "public", "media", "attachments" }, + -- window options applied to windows displaying image buffers + -- an image buffer is a buffer with `filetype=image` + wo = { + wrap = false, + number = false, + relativenumber = false, + cursorcolumn = false, + signcolumn = "no", + foldcolumn = "0", + list = false, + spell = false, + statuscolumn = "", + }, + cache = vim.fn.stdpath("cache") .. "/snacks/image", + debug = { + request = false, + convert = false, + placement = false, + }, + env = {}, + ---@class snacks.image.convert.Config + convert = { + notify = true, -- show a notification on error + ---@type snacks.image.args + mermaid = function() + local theme = vim.o.background == "light" and "neutral" or "dark" + return { "-i", "{src}", "-o", "{file}", "-b", "transparent", "-t", theme, "-s", "{scale}" } + end, + ---@type table + magick = { + default = { "{src}[0]", "-scale", "1920x1080>" }, -- default for raster images + vector = { "-density", 192, "{src}[0]" }, -- used by vector images like svg + math = { "-density", 192, "{src}[0]", "-trim" }, + pdf = { "-density", 192, "{src}[0]", "-background", "white", "-alpha", "remove", "-trim" }, + }, + }, + math = { + enabled = true, -- enable math expression rendering + -- in the templates below, `${header}` comes from any section in your document, + -- between a start/end header comment. Comment syntax is language-specific. + -- * start comment: `// snacks: header start` + -- * end comment: `// snacks: header end` + typst = { + tpl = [[ + #set page(width: auto, height: auto, margin: (x: 2pt, y: 2pt)) + #show math.equation.where(block: false): set text(top-edge: "bounds", bottom-edge: "bounds") + #set text(size: 12pt, fill: rgb("${color}")) + ${header} + ${content}]], + }, + latex = { + font_size = "Large", -- see https://www.sascha-frank.com/latex-font-size.html + -- for latex documents, the doc packages are included automatically, + -- but you can add more packages here. Useful for markdown documents. + packages = { "amsmath", "amssymb", "amsfonts", "amscd", "mathtools" }, + tpl = [[ + \documentclass[preview,border=2pt,varwidth,12pt]{standalone} + \usepackage{${packages}} + \begin{document} + ${header} + { \${font_size} \selectfont + \color[HTML]{${color}} + ${content}} + \end{document}]], + }, + }, + }, + explorer = { enabled = true }, + git = { enabled = true }, + indent = { enabled = true }, + -- input = { enabled = true }, + -- picker = { enabled = true }, + -- notifier = { enabled = true }, + -- quickfile = { enabled = true }, + -- scope = { enabled = true }, + scratch = { enabled = true }, -- https://github.com/folke/snacks.nvim/blob/main/docs/scratch.md + win = { enabled = true }, + terminal = { enabled = true }, -- https://github.com/folke/snacks.nvim/blob/main/docs/terminal.md + animate = { enabled = true }, + scroll = { + enabled = true, + animate = { + duration = { step = 5, total = 50 }, + easing = "linear", + }, + -- faster animation when repeating scroll after delay + animate_repeat = { + delay = 100, -- delay in ms before using the repeat animation + duration = { step = 1, total = 25 }, + easing = "linear", + }, + -- what buffers to animate + filter = function(buf) + return vim.g.snacks_scroll ~= false + and vim.b[buf].snacks_scroll ~= false + and vim.bo[buf].buftype ~= "terminal" + end, + }, + -- statuscolumn = { enabled = true }, + words = { enabled = true }, + }, + keys = { + { + "gb", + function() + require("snacks").git.blame_line() + end, + desc = "[G]it [B]lame", + }, + { + ".", + function() + require("snacks").scratch() + end, + desc = "Toggle Scratch Buffer", + }, + { + "S", + function() + require("snacks").scratch.select() + end, + desc = "Select Scratch Buffer", + }, + }, +} diff --git a/.config/nvim/luasnippets/ts.jsonc b/.config/nvim/luasnippets/ts.jsonc index 7533f7b..bb877df 100644 --- a/.config/nvim/luasnippets/ts.jsonc +++ b/.config/nvim/luasnippets/ts.jsonc @@ -67,17 +67,17 @@ ] }, "react prop": { - "scope": "typescript", + "scope": "typescriptreact", "prefix": "comp", "body": [ "import React from \"react\";", "", - "export default function ${1:name}({className}: {className?: string}) {", - " return (", - " <${2:div} className={`${className}`}>", - " $0", - " ", + "export default function ${1:name}({ className }: { className?: string }) {", + " return (", + " <${2:div} className={`\\${className}`}>", + " ", " )", + " ${0:{\/* asdf *\/}}", "}" ] }, diff --git a/.config/scripts/copy-pass.sh b/.config/scripts/copy-pass.sh new file mode 100755 index 0000000..597c428 --- /dev/null +++ b/.config/scripts/copy-pass.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +# Проверяем, установлена ли утилита pass +if ! command -v pass &> /dev/null; then + notify-send "Password Manager" "pass utility not found" + exit 1 +fi + +# Получаем список паролей (убираем расширение .gpg и путь до password-store) +password_list=$(find ~/.password-store/ -type f -name "*.gpg" | sed "s|$HOME/.password-store/||g" | sed 's/\.gpg$//') + +# Проверяем, есть ли пароли +if [ -z "$password_list" ]; then + notify-send "Password Manager" "No passwords found" + exit 1 +fi + +# Показываем меню rofi и получаем выбор пользователя +selected_pass=$(echo "$password_list" | rofi -dmenu -p "Select Password:") + +# Если пользователь что-то выбрал +if [ -n "$selected_pass" ]; then + # Получаем пароль и копируем его в буфер обмена + error_output=$(pass show -c "$selected_pass" 2>&1) + + # Проверяем статус выполнения + if [ $? -eq 0 ]; then + notify-send "Password Manager" "Password for $selected_pass copied to clipboard" + else + notify-send "Password Manager" "Failed to get password for $selected_pass: \n\n$error_output" -u critical + fi +fi diff --git a/.config/scripts/get_layout.sh b/.config/scripts/get_layout.sh index a651977..3c7d191 100755 --- a/.config/scripts/get_layout.sh +++ b/.config/scripts/get_layout.sh @@ -18,7 +18,7 @@ getFlagEmoji() { } # TODO: get keyboard name dynamically countryCode=$(hyprctl devices -j | - jq -r '.keyboards[] | select(.name == "at-translated-set-2-keyboard") | .active_keymap' | + jq -r '.keyboards[] | select(.main == true) | .active_keymap' | cut -c1-2 | tr 'a-z' 'A-Z') diff --git a/.config/scripts/select-vpn.sh b/.config/scripts/select-vpn.sh new file mode 100755 index 0000000..73ef2e7 --- /dev/null +++ b/.config/scripts/select-vpn.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +# Получаем список VPN соединений +vpn_list=$(nmcli -t -f NAME,TYPE connection show | grep vpn | cut -d':' -f1) + +# Проверяем, есть ли VPN соединения +if [ -z "$vpn_list" ]; then + notify-send "VPN" "No VPN connections found" + exit 1 +fi + +# Преобразуем список в формат, подходящий для rofi (каждая строка отдельно) +# vpn_options=$(echo "$vpn_list" | tr ' ' '\n') + +# Показываем меню rofi и получаем выбор пользователя +selected_vpn=$(echo "$vpn_list" | rofi -dmenu -p "Select VPN:") + +# Если пользователь что-то выбрал +if [ -n "$selected_vpn" ]; then + # Активируем выбранное VPN соединение + error_output=$(nmcli connection up "$selected_vpn" 2>&1) + + # Проверяем статус выполнения + if [ $? -eq 0 ]; then + notify-send "VPN" "Connected to $selected_vpn successfully" + else + notify-send "VPN" "Failed to connect to $selected_vpn: \n\n$error_output" + fi +fi + + diff --git a/.config/scripts/set_brightness_other_monitors.sh b/.config/scripts/set_brightness_other_monitors.sh new file mode 100755 index 0000000..fb2d7b8 --- /dev/null +++ b/.config/scripts/set_brightness_other_monitors.sh @@ -0,0 +1,81 @@ +#!/bin/bash + +# Проверяем, передан ли аргумент (например, +10, -10 или абсолютное значение) +if [ -z "$1" ]; then + echo "Ошибка: укажи изменение яркости (например, +10, -10 или 50)" + exit 1 +fi + +# Временный файл для хранения значения яркости +TEMP_FILE="/tmp/ddc_brightness_value" +DEBOUNCE_FILE="/tmp/ddc_brightness_debounce" + +# Функция для получения текущей яркости +get_current_brightness() { + ddcutil getvcp 10 | grep -oP '(?<=current value = )\s*\d+' | tr -d ' ' +} + +# Читаем текущее значение из файла или получаем с монитора, если файла нет +if [ -f "$TEMP_FILE" ]; then + CURRENT_VALUE=$(cat "$TEMP_FILE") +else + CURRENT_VALUE=$(get_current_brightness) + echo "$CURRENT_VALUE" > "$TEMP_FILE" +fi + +# Вычисляем новое значение +if [[ "$1" =~ ^[+-] ]]; then + NEW_VALUE=$((CURRENT_VALUE + $1)) +else + NEW_VALUE="$1" +fi + +# Ограничиваем значение в пределах 0-100 +if [ "$NEW_VALUE" -lt 0 ]; then + NEW_VALUE=0 +elif [ "$NEW_VALUE" -gt 100 ]; then + NEW_VALUE=100 +fi + +# Записываем новое значение во временный файл +echo "$NEW_VALUE" > "$TEMP_FILE" +echo "$NEW_VALUE" >> /tmp/wobpipe + +# Обновляем метку времени для debounce +touch "$DEBOUNCE_FILE" + +# Функция для установки яркости с debounce +apply_brightness() { + # Ждём 0.5 секунды после последнего изменения + sleep 0.5 + + # Проверяем, не изменился ли файл с тех пор + NOW=$(date +%s%3N) + LAST_CHANGE=$(cat "$TIMESTAMP_FILE" 2>/dev/null || echo 0) + + # Проверяем, прошло ли 500 мс (0.5 с) с последнего изменения + if [ $((NOW - LAST_CHANGE)) -lt 500 ]; then + exit 0 + fi + + # Читаем финальное значение из файла + FINAL_VALUE=$(cat "$TEMP_FILE") + + # Устанавливаем яркость + ddcutil setvcp 10 "$FINAL_VALUE" > /tmp/ddcutil_output 2>&1 + + # Получаем текущую яркость для вывода + RESULT="$(ddcutil getvcp 10)" + CURRENT_PERC="$(echo "$RESULT" | grep -oP '(?<=current value = )\s*\d+' | tr -d ' ')" + + # Выводим результат и записываем в wobpipe + echo "$RESULT" + echo "\"$CURRENT_PERC\"" +} + +# Запускаем применение яркости в фоновом режиме, если ещё не запущено +if ! pgrep -f "apply_brightness" > /dev/null; then + apply_brightness & +fi + +exit 0 diff --git a/.config/waybar/get_layout.sh b/.config/waybar/get_layout.sh index a651977..3c7d191 100755 --- a/.config/waybar/get_layout.sh +++ b/.config/waybar/get_layout.sh @@ -18,7 +18,7 @@ getFlagEmoji() { } # TODO: get keyboard name dynamically countryCode=$(hyprctl devices -j | - jq -r '.keyboards[] | select(.name == "at-translated-set-2-keyboard") | .active_keymap' | + jq -r '.keyboards[] | select(.main == true) | .active_keymap' | cut -c1-2 | tr 'a-z' 'A-Z') diff --git a/.config/waybar/modules.json b/.config/waybar/modules.json index b0ef433..c2ed617 100644 --- a/.config/waybar/modules.json +++ b/.config/waybar/modules.json @@ -152,8 +152,8 @@ }, "custom/layout": { "exec": "~/.config/waybar/get_layout.sh", - "on-click": "hyprctl switchxkblayout at-translated-set-2-keyboard next", - "on-click-right": "hyprctl switchxkblayout at-translated-set-2-keyboard prev", + "on-click": "hyprctl switchxkblayout all next", + "on-click-right": "hyprctl switchxkblayout all prev", "interval": 1 }, // Wofi Application Launcher diff --git a/.tmux.conf b/.tmux.conf index 67335f4..2cd5786 100644 --- a/.tmux.conf +++ b/.tmux.conf @@ -5,6 +5,8 @@ unbind C-b set -g prefix C-Space +bind-key -n C-\; send-keys C-\; + # ────────────────── prefix ctrl+a for nested sessions ──────────────── bind-key -n C-a send-prefix diff --git a/.zshrc b/.zshrc index ea24341..420a990 100644 --- a/.zshrc +++ b/.zshrc @@ -43,6 +43,12 @@ case ":$PATH:" in *) export PATH="$PNPM_HOME:$PATH" ;; esac +GO_HOME="$(go env GOPATH)/bin" +case ":$PATH:" in + *":$GO_HOME:"*) ;; + *) export PATH="$GO_HOME:$PATH" ;; +esac + # fzf customization if command -v fd > /dev/null; then export FZF_DEFAULT_COMMAND="fd --hidden --strip-cwd-prefix --exclude .git" diff --git a/Profile1.bcf b/Profile1.bcf new file mode 100644 index 0000000..5f8512d Binary files /dev/null and b/Profile1.bcf differ diff --git a/journal/2025/03/23.norg b/journal/2025/03/23.norg new file mode 100644 index 0000000..e69de29 diff --git a/prog.bcf b/prog.bcf new file mode 100644 index 0000000..d642065 Binary files /dev/null and b/prog.bcf differ