diff --git a/.config/X11/runonce b/.config/X11/runonce index 14f3c48..d707607 100755 --- a/.config/X11/runonce +++ b/.config/X11/runonce @@ -1,5 +1,4 @@ clipmenud & flameshot & -easyeffects --gapplication-service & # vim: ft=sh diff --git a/.config/alacritty/alacritty.toml b/.config/alacritty/alacritty.toml index 6cbc0ca..9207478 100644 --- a/.config/alacritty/alacritty.toml +++ b/.config/alacritty/alacritty.toml @@ -56,7 +56,8 @@ bindings = [ {key = "Slash", mods = "Control", chars = "\u001f"}, {key = "Space", mods = "Control", chars = "\u0000"}, {key = "Back", mods = "Control", chars = "\u001b\u007f"}, - {key = "M", mods = "Control", chars = "\u0100"} + {key = "M", mods = "Control", chars = "\u0100"}, + {key = "х", mods = "Control", chars = "\u001b"}, ] [general] diff --git a/.config/nvim/lazy-lock.json b/.config/nvim/lazy-lock.json index e8a7bb2..c20ee07 100644 --- a/.config/nvim/lazy-lock.json +++ b/.config/nvim/lazy-lock.json @@ -1,41 +1,43 @@ { "Comment.nvim": { "branch": "master", "commit": "e30b7f2008e52442154b66f7c519bfd2f1e32acb" }, - "LuaSnip": { "branch": "master", "commit": "33b06d72d220aa56a7ce80a0dd6f06c70cd82b9d" }, + "LuaSnip": { "branch": "master", "commit": "c1851d5c519611dfc451b6582961b2602e0af89b" }, "Navigator.nvim": { "branch": "master", "commit": "91d86506ac2a039504d5205d32a1d4bc7aa57072" }, - "bufferline.nvim": { "branch": "main", "commit": "261a72b90d6db4ed8014f7bda976bcdc9dd7ce76" }, - "cmp-buffer": { "branch": "main", "commit": "3022dbc9166796b644a841a02de8dd1cc1d311fa" }, - "cmp-nvim-lsp": { "branch": "main", "commit": "39e2eda76828d88b773cc27a3f61d2ad782c922d" }, - "fidget.nvim": { "branch": "main", "commit": "e2a175c2abe2d4f65357da1c98c59a5cfb2b543f" }, - "indent-blankline.nvim": { "branch": "master", "commit": "259357fa4097e232730341fa60988087d189193a" }, + "bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" }, + "cmp-buffer": { "branch": "main", "commit": "b74fab3656eea9de20a9b8116afa3cfc4ec09657" }, + "cmp-nvim-lsp": { "branch": "main", "commit": "a8912b88ce488f411177fc8aed358b04dc246d7b" }, + "fidget.nvim": { "branch": "main", "commit": "d9ba6b7bfe29b3119a610892af67602641da778e" }, + "indent-blankline.nvim": { "branch": "master", "commit": "005b56001b2cb30bfa61b7986bc50657816ba4ba" }, "iptables": { "branch": "master", "commit": "0d18b1e468f547dd7e2c494d42bc134a1e0eac7e" }, - "lazy.nvim": { "branch": "main", "commit": "656cf4309396b7b8b62984e923bf8d8a0013f7d7" }, + "lazy.nvim": { "branch": "main", "commit": "6c3bda4aca61a13a9c63f1c1d1b16b9d3be90d7a" }, "lspkind.nvim": { "branch": "master", "commit": "d79a1c3299ad0ef94e255d045bed9fa26025dab6" }, - "lualine.nvim": { "branch": "master", "commit": "2a5bae925481f999263d6f5ed8361baef8df4f83" }, - "mason.nvim": { "branch": "main", "commit": "e2f7f9044ec30067bc11800a9e266664b88cda22" }, + "lualine.nvim": { "branch": "master", "commit": "15884cee63a8c205334ab13ab1c891cd4d27101a" }, + "mason.nvim": { "branch": "main", "commit": "7c7318e8bae7e3536ef6b9e86b9e38e74f2e125e" }, + "multilayout.nvim": { "branch": "main", "commit": "613ec4ace9097a4464a558777aaf6a15b3d8bd78" }, "neodev.nvim": { "branch": "main", "commit": "46aa467dca16cf3dfe27098042402066d2ae242d" }, - "nvim-autopairs": { "branch": "master", "commit": "b464658e9b880f463b9f7e6ccddd93fb0013f559" }, - "nvim-cmp": { "branch": "main", "commit": "ca4d3330d386e76967e53b85953c170658255ecb" }, + "nvim-autopairs": { "branch": "master", "commit": "4d74e75913832866aa7de35e4202463ddf6efd1b" }, + "nvim-cmp": { "branch": "main", "commit": "b5311ab3ed9c846b585c0c15b7559be131ec4be9" }, "nvim-colorizer.lua": { "branch": "master", "commit": "a065833f35a3a7cc3ef137ac88b5381da2ba302e" }, "nvim-lastplace": { "branch": "main", "commit": "0bb6103c506315044872e0f84b1f736c4172bb20" }, - "nvim-lspconfig": { "branch": "master", "commit": "47f236c058f0511702286a21ba53bbf42abbd8a8" }, - "nvim-notify": { "branch": "master", "commit": "fbef5d32be8466dd76544a257d3f3dce20082a07" }, - "nvim-surround": { "branch": "main", "commit": "9f0cb495f25bff32c936062d85046fbda0c43517" }, - "nvim-tree.lua": { "branch": "master", "commit": "375e38673b5c61debd8074ced01cfd4f3b7ce1e9" }, - "nvim-treesitter": { "branch": "master", "commit": "894cb3cebbad0535fb4e319ada5d875dbc48d8b9" }, - "nvim-treesitter-context": { "branch": "master", "commit": "b9e30333ece125297cfc5d652465cbc9a23b4916" }, - "nvim-treesitter-textobjects": { "branch": "master", "commit": "ad8f0a472148c3e0ae9851e26a722ee4e29b1595" }, - "nvim-web-devicons": { "branch": "master", "commit": "87c34abe5d1dc7c1c0a95aaaf888059c614c68ac" }, - "onedark.nvim": { "branch": "master", "commit": "67a74c275d1116d575ab25485d1bfa6b2a9c38a6" }, - "plenary.nvim": { "branch": "master", "commit": "2d9b06177a975543726ce5c73fca176cedbffe9d" }, + "nvim-lspconfig": { "branch": "master", "commit": "61e5109c8cf24807e4ae29813a3a82b31821dd45" }, + "nvim-notify": { "branch": "master", "commit": "b5825cf9ee881dd8e43309c93374ed5b87b7a896" }, + "nvim-surround": { "branch": "main", "commit": "0e62500b98f4513feaaf7425c135472457ea5b7d" }, + "nvim-tree.lua": { "branch": "master", "commit": "e7d1b7dadc62fe2eccc17d814354b0a5688621ce" }, + "nvim-treesitter": { "branch": "master", "commit": "28d480e0624b259095e56f353ec911f9f2a0f404" }, + "nvim-treesitter-context": { "branch": "master", "commit": "5c48b8ba1b0b7b25feb6e34e7eb293ea893aedc4" }, + "nvim-treesitter-textobjects": { "branch": "master", "commit": "0e3be38005e9673d044e994b1e4b123adb040179" }, + "nvim-web-devicons": { "branch": "master", "commit": "f1420728f59843eb2ef084406b3d0201a0a0932d" }, + "onedark.nvim": { "branch": "master", "commit": "11de4da47f3e69cb70c3ae9816bd8af166cbe121" }, + "plenary.nvim": { "branch": "master", "commit": "857c5ac632080dba10aae49dba902ce3abf91b35" }, "quickfix-reflector.vim": { "branch": "master", "commit": "6a6a9e28e1713b9e9db99eec1e6672e5666c01b9" }, "telescope-emoji.nvim": { "branch": "master", "commit": "86248d97be84a1ce83f0541500ef9edc99ea2aa1" }, - "telescope-fzf-native.nvim": { "branch": "main", "commit": "cf48d4dfce44e0b9a2e19a008d6ec6ea6f01a83b" }, + "telescope-fzf-native.nvim": { "branch": "main", "commit": "1f08ed60cafc8f6168b72b80be2b2ea149813e55" }, "telescope.nvim": { "branch": "0.1.x", "commit": "a0bbec21143c7bc5f8bb02e0005fa0b982edc026" }, - "todo-comments.nvim": { "branch": "main", "commit": "ae0a2afb47cf7395dc400e5dc4e05274bf4fb9e0" }, - "trouble.nvim": { "branch": "main", "commit": "46cf952fc115f4c2b98d4e208ed1e2dce08c9bf6" }, + "todo-comments.nvim": { "branch": "main", "commit": "304a8d204ee787d2544d8bc23cd38d2f929e7cc5" }, + "trouble.nvim": { "branch": "main", "commit": "85bedb7eb7fa331a2ccbecb9202d8abba64d37b3" }, "vim-bbcode": { "branch": "master", "commit": "6fb28c6deae5844ee2bf0b97ef2fea04bd3d4eac" }, "vim-caddyfile": { "branch": "master", "commit": "24fe0720551883e407cb70ae1d7c03f162d1d5a0" }, - "vim-fugitive": { "branch": "master", "commit": "320b18fba2a4f2fe3c8225c778c687e0d2620384" }, + "vim-fugitive": { "branch": "master", "commit": "4a745ea72fa93bb15dd077109afbb3d1809383f2" }, + "vim-nftables": { "branch": "master", "commit": "26f8a506c6f3e41f1e4a8d6aa94c9a79a666bbff" }, "vim-peekaboo": { "branch": "master", "commit": "cc4469c204099c73dd7534531fa8ba271f704831" }, "vim-sleuth": { "branch": "master", "commit": "be69bff86754b1aa5adcbb527d7fcd1635a84080" } } diff --git a/.config/nvim/lua/config/options.lua b/.config/nvim/lua/config/options.lua index 23e133f..871ce09 100644 --- a/.config/nvim/lua/config/options.lua +++ b/.config/nvim/lua/config/options.lua @@ -34,3 +34,5 @@ vim.o.timeoutlen = 300 vim.o.splitbelow = true vim.o.splitright = true + +vim.diagnostic.config({ virtual_text = true }) diff --git a/.config/nvim/lua/lsp/init.lua b/.config/nvim/lua/lsp/init.lua index acb1f1a..630ab9c 100644 --- a/.config/nvim/lua/lsp/init.lua +++ b/.config/nvim/lua/lsp/init.lua @@ -1,23 +1,24 @@ local servers = { + ansiblels = {}, bashls = {}, - cmake = {}, clangd = {}, + cmake = {}, eslint = {}, gopls = {}, hls = {}, jdtls = {}, + jsonls = {}, kotlin_language_server = {}, lua_ls = require('lsp.lua_ls'), pyright = {}, ruby_lsp = {}, rust_analyzer = {}, + svls = {}, ts_ls = {}, yamlls = require('lsp.yamlls'), - jsonls = {}, - svls = {} } -vim.lsp.set_log_level("debug") +vim.lsp.set_log_level('info') local on_attach = function(_, bufnr) local nmap = function(keys, func) diff --git a/.config/nvim/lua/plugins/init.lua b/.config/nvim/lua/plugins/init.lua index 0f785bc..7e406c7 100644 --- a/.config/nvim/lua/plugins/init.lua +++ b/.config/nvim/lua/plugins/init.lua @@ -2,6 +2,7 @@ return { 'isobit/vim-caddyfile', 'rcarriga/nvim-notify', 'stefandtw/quickfix-reflector.vim', + 'nfnty/vim-nftables', 'tpope/vim-fugitive', 'junegunn/vim-peekaboo', 'tpope/vim-sleuth', @@ -15,4 +16,33 @@ return { -- { 'wakatime/vim-wakatime', event = 'VeryLazy' }, { 'williamboman/mason.nvim', opts = {} }, 'Winseven4lyf/vim-bbcode', + + + { 'mrsobakin/multilayout.nvim' , opts = { + layouts = { + ru = { + -- Names of this layout, as `libukb` reports. + names = { "Russian" }, + from = [[ёйцукенгшщзхъфывапролджэячсмитьбю.Ё"№;:?ЙЦУКЕНГШЩЗХЪ/ФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,]], + to = [[`qwertyuiop[]asdfghjkl;'zxcvbnm,./~@#$^&QWERTYUIOP{}|ASDFGHJKL:"ZXCVBNM<>?]], + } + }, + aliases = { + -- Maximum length of default commands aliases. + -- Increasing this value leads to longer startup times. + max_length = 2, + -- Extra commands that you want to alias. + -- They are aliased regardless of `max_length`. + extra = { "sort" }, + }, + -- Whether to use `libukb`. If this is set to false, `langmap` + -- won't automatically switch when your layout does. + use_libukb = true, + -- Path to the `libukb.so`. If `nil`, ukb will be automatically + -- downloaded, builded and installed in the neovim data directory. + libukb_path = nil, + -- Function of type `callback(layout: string)`. Called whenever + -- current keyboard layout changes. + callback = nil, + }} } diff --git a/.config/zsh/.zshenv b/.config/zsh/.zshenv index c0050b0..505dfba 100644 --- a/.config/zsh/.zshenv +++ b/.config/zsh/.zshenv @@ -43,12 +43,15 @@ GNUPGHOME='~/.local/share/gnupg' GOPATH="${HOME}/.local/share/go" GPG_TTY="$(tty)" JAVA_HOME="/usr/lib/jvm/java-23-openjdk" -LESS="--wheel-lines 3 --mouse" +LESS="-x4 --wheel-lines 3 --mouse" MANPAGER="sh -c 'col -bx | bat -l man -p --theme Monokai\ Extended'" MANROFFOPT="-c" MTR_OPTIONS="-t" SSH_ASKPASS="${HOME}/.local/bin/scripts/pinentry-askpass" SUDO_ASKPASS="${HOME}/.local/bin/scripts/dmenu-askpass" GRADLE_USER_HOME="${HOME}/.local/share/gradle" +DOCKER_CONFIG="${HOME}/.local/share/docker" +COMPOSE_BAKE=true +GIT_DISCOVERY_ACROSS_FILESYSTEM=1 set +a diff --git a/.config/zsh/.zshrc b/.config/zsh/.zshrc index 9ffd71c..114ce82 100644 --- a/.config/zsh/.zshrc +++ b/.config/zsh/.zshrc @@ -1,5 +1,7 @@ . ~/.config/zsh/modes.sh +fpath=($HOME/.local/share/completions $fpath) + # ls colors eval "$(dircolors -b)" @@ -51,7 +53,8 @@ PS1="%B%{$fg[red]%}[%{$fg[yellow]%}%n%{$fg[green]%}@%{$fg[blue]%}%M %{$fg[magent # ls aliases -alias ls="lsd --color=auto" +alias ls="/usr/bin/lsd --color=always --icon=always" +alias lsd='/usr/bin/ls' alias l="ls -lh" alias la="ls -lah" alias ll="ls -lh" @@ -77,25 +80,28 @@ alias ..............="cd ../../../../../../../../../../../../../" alias ...............="cd ../../../../../../../../../../../../../../" # aliases -alias rz="exec zsh" -alias venv="source src_venv" -alias ex="source src_example" -alias ap="source src_add_path" -alias info="pinfo " -alias bat="bat " -alias img="nsxiv " -alias xclip="xclip -selection clipboard" -alias d="diff --color -u " -alias rgf="rg --files | rg " -alias 7z="7zz" # for whatever reason 7z provides 7zz binary in debian -alias wt="watch --color -d -cn 0.1 " -alias .e="set -a && source .env && set +a" -alias vimu="vim -u /dev/null" +alias sudo='sudo ' # allow aliases with sudo +alias rz='exec zsh' +alias venv='source src_venv' +alias ex='source src_example' +alias ap='source src_add_path' +alias info='pinfo' +alias bat='bat ' +alias img='nsxiv' +alias xclip='xclip -selection clipboard' +alias xxclip='head -c-1 | xclip -selection clipboard' +alias rgf='rg --files | rg' +alias wt='watch --color -d -cn 0.1 ' +alias .e='set -a && source .env && set +a' +alias vimu='vim -u /dev/null' alias reswap="sudo bash -c 'echo Working...; swapoff /swapfile && sudo swapon /swapfile'" alias make="make -j$(nproc)" -alias py="python3" -alias neofetch="fastfetch" -alias open="xdg-open" +alias py='python3' +alias neofetch='fastfetch' +alias open='xdg-open' +alias m.='if mount | grep -q "$(pwd)"; then umount -l .; cd .; else mount .; cd .; fi' +alias rs='stow -R .' +alias sst='ssh -t' # function aliases bl() { brightnessctl set "$1"% > /dev/null; } @@ -103,15 +109,17 @@ nosw() { alacritty --class 'noswallow' -e "$@"; }; compdef _command nosw t() { taskell "${1:-${HOME}/.taskell.md}"; } vims() { filepath="$(type "$1" | rev | cut -d ' ' -f 1 | rev)"; [ $? -eq 0 ] && vim "${filepath}"; }; compdef _command vims tl() { tree -C "$@" | bat }; compdef _tree tl +diff() { /usr/bin/diff --color -u "$@" | delta; }; compdef _files di # compdef compdef -a '_git; _git-commit' gdc # todo compdef '_files -g "*.md"' md +compdef _ollama ollama # git aliases gl() { git log --decorate "$@" | bat }; compdef '_git; _git-log' gl gus() { git branch --set-upstream-to="${1:?}/${2:?}" "${2:?}"}; compdef '_git; _git-push' gus -gpo() { git push --set-upstream origin ${1:-$(git rev-parse --abbrev-ref HEAD)}} +gpo() { git push --set-upstream origin "$(git rev-parse --abbrev-ref HEAD)" "$@"} alias ga="git add" alias gb="git branch" alias gc="git commit" @@ -120,6 +128,8 @@ alias gck="git checkout" alias gcl="git clone" alias gcls="git clone --depth=1" alias gcm="git commit --allow-empty-message -m ''" +alias gcd='git commit --no-gpg-sign' +alias gcmd="git commit --allow-empty-message -m '' --no-gpg-sign" alias gcn="git clean" alias gcp="git cherry-pick" alias gd="git diff" @@ -137,6 +147,8 @@ alias grjs="git rebase --cancel" alias grm="git remote" alias grs="git restore --staged" alias grt="git reset" +alias gsm='git submodule' +alias grc='git rm --cached' alias gs="git status" alias gsc="git switch -c" alias gsh="git show" @@ -146,9 +158,18 @@ alias gt="git tag" alias gus="git fetch --unshallow" # docker aliases -alias dc="docker compose" -alias docker!="DOCKER_HOST=ssh://docker /usr/bin/docker" -alias dc!="docker! compose" +alias d='docker' +alias dc='docker compose' +alias d!='/usr/bin/docker' +alias dc!='d! compose' + +alias dj='dc up -d --force-recreate' +alias djl='dc up -d --force-recreate && dl' +alias dl='dc logs -f' +alias dk='dc down' +alias dv='d volume' +alias di='d image' +alias dr='d run --rm -it' # tmux stuff tn() { tmux new-session -s "${1-"$(basename "$(pwd)")"}" } @@ -158,4 +179,6 @@ alias ta="tmux a -t" stty -ixon # print tasks on startup -cat ~/.taskell.md | grep -v '>.*' +_ZSH_TODO_FILE="${HOME}/todo.md" +[ -f "$_ZSH_TODO_FILE" ] && { bat --color=always -p "$_ZSH_TODO_FILE" | grep -v '>.*'; } +unset _ZSH_TODO_FILE diff --git a/.config/zsh/modes/cpp.sh b/.config/zsh/modes/cpp.sh index bf09306..d15b843 100644 --- a/.config/zsh/modes/cpp.sh +++ b/.config/zsh/modes/cpp.sh @@ -10,9 +10,9 @@ cpp_mode::find_exec() { } ct() { - eval "$(cpp_mode::find_exec "tests")" + "$(cpp_mode::find_exec "tests")" } cr() { - eval "$(cpp_mode::find_exec)" + "$(cpp_mode::find_exec)" } diff --git a/.gitconfig b/.gitconfig index 66a5929..62cdddd 100644 --- a/.gitconfig +++ b/.gitconfig @@ -1,5 +1,5 @@ [core] - pager = delta + pager = delta --tabs 4 [user] email = me@wzray.com name = Arthur K. @@ -17,3 +17,6 @@ tool = nvimdiff [diff] colorMoved = default +[safe] + directory = /home/wzray/Services/cpu + directory = /home/wzray/Services/cpu/* diff --git a/.gitignore b/.gitignore index 617f0fe..49c63a2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ -.zcompdump +.zcompdump* /.fonts/.uuid diff --git a/.local/bin/scripts/bin b/.local/bin/scripts/bin new file mode 100755 index 0000000..7ed7eac --- /dev/null +++ b/.local/bin/scripts/bin @@ -0,0 +1,34 @@ +#!/bin/bash + +URL="https://bin.wzray.com" +SILENT=0 +declare -a files + +while [ "$#" -gt 0 ]; do + case "$1" in + "-s") SILENT=1;; + *) files+=("$1");; + esac + shift +done + +if [ "$#" -gt 0 ]; then + r="$(curl -X PUT --data-binary "@$1" "$URL" 2>/dev/null)" + ext="$(basename -- "$1")" + ext=".${ext##*.}" + [ "$ext" = ".$1" ] && ext= +else + if [ "$SILENT" = 1 ]; then + TMP_FILENAME="$(mktemp)" + cat > "$TMP_FILENAME" + r="$(curl -X PUT --data-binary "@$TMP_FILENAME" "$URL" 2>/dev/null)" + cat < "$TMP_FILENAME" + else + r="$(curl -X PUT --data-binary @- "$URL" 2>/dev/null)" + fi +fi + +r="$(tr -d $'\n' <<< "$r")" +xclip -selection clipboard <<< "$r$ext" +echo "$r$ext" +[ -n "$TMP_FILENAME" ] && rm "$TMP_FILENAME" diff --git a/.local/bin/scripts/docker b/.local/bin/scripts/docker new file mode 100755 index 0000000..49b7462 --- /dev/null +++ b/.local/bin/scripts/docker @@ -0,0 +1,16 @@ +#!/bin/bash + +declare -A CONTEXTS=( + ["cpu"]=hicpu + ["gpu"]=higpu +) + +WORKDIR="$(pwd)" +[[ "$WORKDIR" = "$HOME/Services"* ]] && { + _ctx="$(cut -d'/' -f1 <<<"${WORKDIR#"${HOME}/Services/"}")" + [ -n "$_ctx" ] && _ctx="${CONTEXTS["$_ctx"]}" && \ + [ -n "$_ctx" ] && ctx="--context=$_ctx" +} + +# shellcheck disable=SC2086 +/usr/bin/docker $ctx "$@" diff --git a/.local/bin/scripts/gor b/.local/bin/scripts/gor index 25432c7..2359cc3 100755 --- a/.local/bin/scripts/gor +++ b/.local/bin/scripts/gor @@ -8,6 +8,10 @@ elif [[ "$url" =~ ^[a-zA-Z0-9_-]+@([a-zA-Z0-9_.-]+):(.*) ]]; then url="https://${BASH_REMATCH[1]}/${BASH_REMATCH[2]}" url="${url%.git}" xdg-open "$url" +elif [[ "$url" =~ ^ssh://[a-zA-Z0-9_-]+@([a-zA-Z0-9_.-]+)/(.*) ]]; then + url="https://${BASH_REMATCH[1]}/${BASH_REMATCH[2]}" + url="${url%.git}" + xdg-open "$url" else echo "TODO: $url" fi diff --git a/.local/bin/scripts/gpc b/.local/bin/scripts/gpc index 2d17016..3cdd29f 100755 --- a/.local/bin/scripts/gpc +++ b/.local/bin/scripts/gpc @@ -1,39 +1,146 @@ #!/usr/bin/env python3 +import json import os import subprocess import sys -from typing import Literal -import requests -import time import threading +import time +from concurrent.futures import ThreadPoolExecutor +from typing import Literal + +import requests -state: Literal["loading", "done", "fail"] = "loading" def die(r: str): print(r, file=sys.stderr) exit(1) -def strip_equal(msg: str, substring: str, n_max: int) -> str: - if n_max <= 0 or msg[0] != substring or msg[-1] != substring: - return msg - return strip_equal(msg[1:-1], substring, n_max - 1) -def cleanup_string(s: str) -> str: - return strip_equal(s.replace('\n','').strip(), '`', 4) +with open(f"{os.environ['HOME']}/.secrets/openrouter.nike.secret") as f: + KEY=f.readline().strip() + if not KEY: + die("Missing key!") + HEADERS = {'Authorization': f'Bearer {KEY}'} -def spin(text: str): - interval = 80 - spinner = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"] - i = 0 - while state == "loading": - i = (i + 1) % len(spinner) - print(f"\r{spinner[i]} {text}", end=' ') - time.sleep(interval / 1000) - symbol = "✔️" if state == "done" else "❌" - print(f"\r{symbol} {text}") +with subprocess.Popen(["git", "diff", "--staged"], stdout=subprocess.PIPE) as ps: + ps.wait() + DIFF = ps.stdout and ps.stdout.read().decode('utf-8').strip() + if not DIFF or DIFF == "": + die("Nothing to commit!") + +URL = 'http://higpu:11434/api/chat' +MODEL = 'gemma3:4b' + +SAMPLES = [ + { + "role": "user", + "content": "\ndiff --git a/meson.build b/meson.build\nindex 5ee43f7..bae848d 100644\n--- a/meson.build\n+++ b/meson.build\n@@ -1,5 +1,5 @@\n project('ukb', 'c',\n- version: '0.1.0',\n+ version: '0.2.1',\n default_options: ['warning_level=2', 'optimization=2'],\n )" + }, + { + "role": "assistant", + "content": "chore: bump version to `0.2.1`" + }, + { + "role": "user", + "content": "\ndiff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml\nindex fa4f919..9fadc0d 100644\n--- a/.github/workflows/workflow.yml\n+++ b/.github/workflows/workflow.yml\n@@ -19,7 +19,7 @@ jobs:\n libjson-c-dev libx11-dev \\\n zip\n \n- - name: Build (Linux)\n+ - name: Build (`linux-x86_64`)\n run: |\n meson setup build.linux \\\n --prefix=/ \\\n@@ -29,7 +29,7 @@ jobs:\n meson compile -C build.linux\n meson install -C build.linux --destdir=install\n \n- - name: Build (Windows)\n+ - name: Build (`windows-x86_64`)\n run: |\n cat > mingw-cross.txt < mingw-cross.txt <\n+#include \n+#include \n+\n+#include \"ukb.h\"\n+#include \"../utils.h\"\n+\n+\n+#define POLL_DELAY 1\n+\n+\n+static HKL prev_layout = NULL;\n+static char current_layout[128] = {0};\n+\n+\n+static bool hkl_to_name(HKL hkl, char* dst, size_t n) {\n+ LANGID langid = LOWORD((DWORD_PTR)hkl);\n+ LCID lcid = MAKELCID(langid, SORT_DEFAULT);\n+\n+ char name[LOCALE_NAME_MAX_LENGTH];\n+\n+ if (GetLocaleInfoA(lcid, LOCALE_SENGLANGUAGE, name, LOCALE_NAME_MAX_LENGTH)) {\n+ strncpy(dst, name, n);\n+ return true;\n+ } else {\n+ return false;\n+ }\n+}\n+\n+static HKL poll_layout_switch() {\n+ while(1) {\n+ HWND hwnd = GetForegroundWindow();\n+ DWORD thread_id = GetWindowThreadProcessId(hwnd, NULL);\n+ HKL new_layout = GetKeyboardLayout(thread_id);\n+\n+ if (prev_layout != new_layout) {\n+ prev_layout = new_layout;\n+ return new_layout;\n+ }\n+\n+ Sleep(POLL_DELAY);\n+ }\n+}\n+\n+/********************************* BACKEND ***********************************/\n+\n+static bool windows_can_use(void) {\n+ return true;\n+}\n+\n+static ukb_err_t windows_listen(ukb_layout_cb_t cb) {\n+ while (1) {\n+ HKL layout = poll_layout_switch();\n+ if (!hkl_to_name(layout, current_layout, sizeof(current_layout) - 1)) {\n+ UKB_ERR(\"Unknown layout.\");\n+ }\n+ cb(current_layout);\n+ }\n+\n+ UKB_OK();\n+}\n+\n+const ukb_backend_t ukb_backend_windows = {\n+ .name = \"windows\",\n+ .can_use = windows_can_use,\n+ .listen = windows_listen,\n+};\ndiff --git a/src/ukb.c b/src/ukb.c\nindex ec55ec8..74ed7df 100644\n--- a/src/ukb.c\n+++ b/src/ukb.c\n@@ -11,9 +11,16 @@\n \n /********************************* BACKENDS **********************************/\n \n+#if defined PLATFORM_LINUX\n #define UKB_BACKENDS(M) \\\n M(ukb_backend_sway) \\\n M(ukb_backend_xorg)\n+#elif defined PLATFORM_WINDOWS\n+#define UKB_BACKENDS(M) \\\n+ M(ukb_backend_windows)\n+#else\n+#error \"No platform is set.\"\n+#endif\n \n /*****************************************************************************/" + }, + { + "role": "assistant", + "content": "feat(windows): add new backend" + }, + { + "role": "user", + "content": "\ndiff --git a/Makefile b/Makefile\ndeleted file mode 100644\nindex 9a8818d..0000000\n--- a/Makefile\n+++ /dev/null\n@@ -1,52 +0,0 @@\n-CC = gcc\n-AR = ar\n-\n-DEPS = json-c x11\n-\n-CFLAGS = -Iinclude -Wall -O2 $(shell pkg-config --cflags $(DEPS))\n-LDFLAGS = $(shell pkg-config --libs $(DEPS))\n-\n-LIB_SRC = src/ukb.c $(wildcard src/backends/*.c)\n-LIB_OBJ = $(LIB_SRC:.c=.o)\n-\n-BIN_SRC = src/main.c\n-BIN_OBJ = $(BIN_SRC:.c=.o)\n-\n-PREFIX ?= /usr/local\n-BIN_DIR = $(PREFIX)/bin\n-LIB_DIR = $(PREFIX)/lib\n-INCLUDE_DIR = $(PREFIX)/include/libukb\n-\n-all: libukb.a libukb.so ukb\n-\n-$(LIB_OBJ): %.o: %.c\n-\t$(CC) $(CFLAGS) -fPIC -DUKB_BACKENDS_INTERNAL -c $< -o $@\n-\n-$(BIN_OBJ): %.o: %.c\n-\t$(CC) $(CFLAGS) -c $< -o $@\n-\n-libukb.so: $(LIB_OBJ)\n-\t$(CC) -shared -o $@ $^ $(LDFLAGS)\n-\n-libukb.a: $(LIB_OBJ)\n-\t$(AR) rcs $@ $^\n-\n-ukb: $(BIN_OBJ) libukb.a\n-\t$(CC) $(BIN_OBJ) -L. -l:libukb.a -o $@ $(LDFLAGS)\n-\n-.PHONY: install\n-install: all\n-\tinstall -d $(BIN_DIR) $(LIB_DIR) $(INCLUDE_DIR)\n-\tinstall -m 0755 ukb $(BIN_DIR)/\n-\tinstall -m 0644 libukb.a libukb.so $(LIB_DIR)/\n-\tinstall -m 0644 include/*.h $(INCLUDE_DIR)/\n-\n-.PHONY: uninstall\n-uninstall:\n-\trm -f $(BIN_DIR)/ukb\n-\trm -f $(LIB_DIR)/libukb.a $(LIB_DIR)/libukb.so\n-\trm -rf $(INCLUDE_DIR)\n-\n-.PHONY: clean\n-clean:\n-\trm -f $(LIB_OBJ) $(BIN_OBJ) ukb libukb.so libukb.a\ndiff --git a/meson.build b/meson.build\nnew file mode 100644\nindex 0000000..229d3fd\n--- /dev/null\n+++ b/meson.build\n@@ -0,0 +1,44 @@\n+project('ukb', 'c',\n+ version: '0.1.0',\n+ default_options: ['warning_level=2', 'optimization=2'],\n+)\n+\n+\n+inc = include_directories('include')\n+lib_src = files('src/ukb.c')\n+deps = []\n+\n+platform = host_machine.system()\n+\n+if platform == 'linux'\n+ add_project_arguments('-DPLATFORM=LINUX', language: ['c'])\n+ lib_src += files(\n+ 'src/backends/sway.c',\n+ 'src/backends/xorg.c',\n+ )\n+ deps += [\n+ dependency('json-c', required: true),\n+ dependency('x11', required: true),\n+ ]\n+else\n+ error('unknown platform: ' + platform)\n+endif\n+\n+\n+install_headers('include/ukb.h', subdir: 'ukb')\n+\n+libukb_kwargs = {\n+ 'include_directories': inc,\n+ 'dependencies': deps,\n+ 'c_args': ['-DUKB_BACKENDS_INTERNAL'],\n+ 'install': true,\n+}\n+libukb_a = static_library('ukb', lib_src, kwargs: libukb_kwargs)\n+libukb_so = shared_library('ukb', lib_src, kwargs: libukb_kwargs)\n+\n+\n+executable('ukb', 'src/main.c',\n+ include_directories: inc,\n+ link_with: libukb_a,\n+ install: true,\n+)" + }, + { + "role": "assistant", + "content": "feat: transition to meson build system" + }, + { + "role": "user", + "content": "\ndiff --git a/src/backends/sway.c b/src/backends/sway.c\nindex a7dfd9c..229b8bb 100644\n--- a/src/backends/sway.c\n+++ b/src/backends/sway.c\n@@ -80,7 +80,7 @@ static bool sway_ipc_recv(int fd, header_t *h, char **data) {\n left -= n;\n }\n \n- *data = (char*)malloc(h->fields.length);\n+ *data = (char*)calloc(1, h->fields.length + 1);\n left = h->fields.length;\n dst = (uint8_t*)*data;" + }, + { + "role": "assistant", + "content": "fix(sway): buffer overflow" + }, + { + "role": "user", + "content": "\ndiff --git a/src/backends/xorg.c b/src/backends/xorg.c\nindex 00f6ae8..d74c696 100644\n--- a/src/backends/xorg.c\n+++ b/src/backends/xorg.c\n@@ -89,6 +89,27 @@ static int xorg_open_display() {\n /********************************* BACKEND ***********************************/\n \n static bool xorg_can_use(void) {\n+ // xkblib is pretty much useless when running under xwayland,\n+ // so we'll try to detect xwayland with some simple heuristics.\n+\n+ const char* session = getenv(\"XDG_SESSION_TYPE\");\n+ if (session) {\n+ if (strcmp(session, \"wayland\") == 0) {\n+ return false;\n+ }\n+\n+ if (strcmp(session, \"x11\") != 0) {\n+ // require an additional check if session is neither wayland nor x11\n+ session = NULL;\n+ }\n+ }\n+\n+ if (!session) {\n+ if (getenv(\"WAYLAND_DISPLAY\") != NULL) {\n+ return false;\n+ }\n+ }\n+\n int reason_return = xorg_open_display();\n XCloseDisplay(x_display);\n return reason_return == XkbOD_Success;" + }, + { + "role": "assistant", + "content": "feat(xorg): detect xwayland" + }, + { + "role": "user", + "content": "\ndiff --git a/src/backends/xorg.c b/src/backends/xorg.c\nindex 86820df..00f6ae8 100644\n--- a/src/backends/xorg.c\n+++ b/src/backends/xorg.c\n@@ -59,7 +59,7 @@ static ukb_err_t xorg_wait_event() {\n \n XEvent event;\n int iret = XNextEvent(x_display, &event);\n- if (!iret) {\n+ if (iret) {\n UKB_ERR(\"XNextEvent failed\");\n }" + }, + { + "role": "assistant", + "content": "fix: erroneous error on XNextEvent (#2)" + }, + { + "role": "user", + "content": "\ndiff --git a/src/backends/xorg.c b/src/backends/xorg.c\nindex dfb5459..86820df 100644\n--- a/src/backends/xorg.c\n+++ b/src/backends/xorg.c\n@@ -54,7 +54,7 @@ static ukb_err_t update_current_layout() {\n static ukb_err_t xorg_wait_event() {\n Bool bret = XkbSelectEventDetails(x_display, XkbUseCoreKbd, XkbStateNotify, XkbAllStateComponentsMask, XkbGroupStateMask);\n if (!bret) {\n- UKB_ERR(\"XkbSelectEventDetails failed\")\n+ UKB_ERR(\"XkbSelectEventDetails failed\");\n }\n \n XEvent event;\ndiff --git a/src/utils.h b/src/utils.h\nindex fee5425..f15f4d4 100644\n--- a/src/utils.h\n+++ b/src/utils.h\n@@ -2,10 +2,10 @@\n \n #define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0]))\n \n-#define UKB_OK() return (ukb_err_t) { .msg = NULL };\n-#define UKB_ERR(m) return (ukb_err_t) { .msg = m };\n+#define UKB_OK() return (ukb_err_t) { .msg = NULL }\n+#define UKB_ERR(m) return (ukb_err_t) { .msg = m }\n #define UKB_PROPAGATE(expr) \\\n- { \\\n+ do { \\\n ukb_err_t err = expr; \\\n if (err.msg != NULL) return err; \\\n- };\n+ } while (0)" + }, + { + "role": "assistant", + "content": "fix: require semicolons for util macros" + }, + { + "role": "user", + "content": "\ndiff --git a/Makefile b/Makefile\nindex 702edec..9a8818d 100644\n--- a/Makefile\n+++ b/Makefile\n@@ -1,7 +1,7 @@\n CC = gcc\n AR = ar\n \n-DEPS = json-c\n+DEPS = json-c x11\n \n CFLAGS = -Iinclude -Wall -O2 $(shell pkg-config --cflags $(DEPS))\n LDFLAGS = $(shell pkg-config --libs $(DEPS))\ndiff --git a/src/backends/xorg.c b/src/backends/xorg.c\nindex aebd709..dfb5459 100644\n--- a/src/backends/xorg.c\n+++ b/src/backends/xorg.c\n@@ -32,7 +32,7 @@ static ukb_err_t update_current_layout() {\n }\n \n int num_groups = desc_ptr->ctrls->num_groups;\n- if (xkbState.group >= num_groups) {\n+ if (xkb_state.group >= num_groups) {\n UKB_ERR(\"Group index out of range.\");\n }" + }, + { + "role": "assistant", + "content": "fix: x11 linking and incorrect variable name" + } +] + +SAMPLES = [] -# globals PROMPT="""You are an assistant that helps user to write semantic commit messages. You will be presented with git diff of the code. Write a single short, concise and meaningful message to describe changes that were made. You can only write a single commit message for the entire diff. The single message that you write has to include ALL the changes, that exist in the diff. You can't skip anything. Git commit messages are LIMITED TO 72 CHARACTERS. YOUR MESSAGE COULD NOT BE LONGER THAN 72 CHARACTERS. @@ -60,71 +167,106 @@ Bear in mind that the `short description` of your commit becomes a globally-uniq Use the "`" (backtick) symbol when referring to certain parts of code in your commit message.""" -with open(f"{os.environ['HOME']}/.secrets/openai.secret") as f: - KEY=f.readline().strip() +REQUEST = { + "model": MODEL, + "messages": [ + { + "role": "system", + "content": PROMPT + }, + *SAMPLES, + { + "role": "user", + "content": DIFF + }, + ], + "stream": False, + "options": { + "temperature": 1, + "num_ctx": 117000, + } +} -ps = subprocess.Popen(["git", "diff", "--staged"], stdout = subprocess.PIPE) -DIFF = ps.stdout and ps.stdout.read().decode('utf-8').strip() -if not DIFF or DIFF == "": - die("Nothing to commit!") - -# arguemnt parsing - -N: int = 5 +N: int = 1 argv = iter(sys.argv[1:]) for arg in argv: if arg == "-n": N = int(next(argv)) -thread = threading.Thread(target = spin, args = ['Generating...']) -thread.start() -r = requests.post("https://api.openai.com/v1/chat/completions", headers={'Authorization': f'Bearer {KEY}'}, json = { - "model": "gpt-4o-mini", - "messages": [ - { - "role": "system", - "content": [ - { - "type": "text", - "text": PROMPT, - } - ] - }, - { - "role": "user", - "content": [ - { - "type": "text", - "text": DIFF, - } - ] - }, - ], - "response_format": { - "type": "text" - }, - "temperature": 1, - "max_completion_tokens": 72, - "n": N, - "top_p": 1, - "frequency_penalty": 0, - "presence_penalty": 0 -}) +def strip_equal(msg: str, substring: str, n_max: int) -> str: + if n_max <= 0 or msg[0] != substring or msg[-1] != substring: + return msg + return strip_equal(msg[1:-1], substring, n_max-1) -if r.status_code != 200: - state = "fail" - thread.join() - die(f"status code: {r.status_code}\n{r.text}") -state = "done" -thread.join() +def cleanup_string(s: str) -> str: + return strip_equal(s.replace('\n','').strip(), '`', 4) -choices = '# ' + '\n# '.join(map(lambda x: cleanup_string(x['message']['content']), r.json()['choices'])) -fd = os.memfd_create("file.txt") -fd_wrapper = os.fdopen(fd, mode="w+") -fd_wrapper.write(choices) -fd_wrapper.flush() -fd_path = f"/proc/{os.getpid()}/fd/{fd}" -os.system(f"git commit -v -e -F- < {fd_path}") +class Spinner: + _thread: threading.Thread | None = None + _state: Literal['loading', 'done', 'fail'] + total: int = N + current = 0 + + @classmethod + def start(cls, text: str): + if cls._thread: + return + cls._state = 'loading' + cls.text = text + cls._thread = threading.Thread(target = cls._spin) + cls._thread.start() + + @classmethod + def stop(cls, state: bool = True): + if not cls._thread: + return + cls._state = 'done' if state else 'fail' + cls._thread.join() + + @classmethod + def _spin(cls): + interval = 80 + spinner = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"] + i = 0 + while cls._state == "loading": + i = (i + 1) % len(spinner) + print(f"\r{spinner[i]} {cls.text} ({cls.current}/{cls.total})", end=' ') + time.sleep(interval / 1000) + symbol = "✓" if cls._state == "done" else "⨯" + print(f"\r{symbol} {cls.text} ") + + +def main(): + Spinner.start('Generating...') + + choices = [] + futs = [] + with ThreadPoolExecutor(max_workers=1) as ex: + for _ in range(N): + futs.append(ex.submit(requests.post, URL, headers=HEADERS, json=REQUEST)) + + for fut in futs: + r: requests.Response = fut.result() + Spinner.current += 1 + if r.status_code != 200: + Spinner.stop(False) + die(f"status code: {r.status_code}\n{r.text}") + choices.append(r.json()) + + Spinner.stop() + + choices = '# ' + '\n# '.join(map(lambda x: cleanup_string(x['message']['content']), choices)) + + fd = os.memfd_create("file.txt") + with os.fdopen(fd, mode="w+") as fd_wrapper: + fd_wrapper.write(choices) + fd_wrapper.flush() + os.system(f"git commit -v -e -F- < /proc/{os.getpid()}/fd/{fd}") + +try: + main() +finally: + Spinner.stop(False) diff --git a/.local/bin/scripts/ie b/.local/bin/scripts/ie index b49d95d..0589f88 100755 --- a/.local/bin/scripts/ie +++ b/.local/bin/scripts/ie @@ -29,7 +29,6 @@ else else curl "${API_ENDPOINT}${FIELDS_SHORT}" 2>/dev/null | jq -r .query | tr -d $'\n' fi - # curl "${API_ENDPOINT}${FIELDS_SHORT}" 2>/dev/null | jq -r .query | tr -d $'\n' fi # vim: ft=bash diff --git a/.local/bin/scripts/mnt b/.local/bin/scripts/mnt index e586cbb..7295b2e 100755 --- a/.local/bin/scripts/mnt +++ b/.local/bin/scripts/mnt @@ -2,7 +2,7 @@ set -e -[ -z "$1" ] && (echo "No arguments supplied!" ; exit 1) +[ -z "$1" ] && { echo "No arguments supplied!" ; exit 1; } if [ "$(udisksctl info -b "$1" | grep -c 'MountPoints:\s\{8\}.')" -eq 0 ]; then udisksctl mount -b "$1" diff --git a/.local/bin/scripts/ollama b/.local/bin/scripts/ollama new file mode 100755 index 0000000..9d2ca8c --- /dev/null +++ b/.local/bin/scripts/ollama @@ -0,0 +1,9 @@ +#!/bin/bash + +flags="-it" + +if [ ! -t 0 ] || [ ! -t 1 ]; then + flags= +fi + +docker --context=higpu exec $flags ollama-ollama-1 ollama "$@" diff --git a/.local/bin/scripts/tablet b/.local/bin/scripts/tablet new file mode 100755 index 0000000..7dc41e0 --- /dev/null +++ b/.local/bin/scripts/tablet @@ -0,0 +1,14 @@ +#!/bin/bash +EXT_MON="$(xrandr | grep -ow "\(DP-[0-9]\) connected" | cut -d " " -f 1)" + +map() { + xinput --map-to-output "UGTABLET 6 inch PenTablet Mouse" "$1" + xinput --map-to-output "UGTABLET 6 inch PenTablet Pen (0)" "$1" + xinput --map-to-output "UGTABLET 6 inch PenTablet Eraser (0)" "$1" +} + +if [ -n "$EXT_MON" ]; then + map "$EXT_MON" +else + map 'eDP-1' +fi diff --git a/.local/bin/scripts/vpn b/.local/bin/scripts/vpn index 455bdab..dc9b88e 100755 --- a/.local/bin/scripts/vpn +++ b/.local/bin/scripts/vpn @@ -6,6 +6,19 @@ send_cmd() { cat < $PIPE } +send_router_cmd() { + touch "${HOME}/.local/state/.vpn_loading" + pkill -36 dwmblocks + ssh router vpn "$1" laptop 2>/dev/null + rm "${HOME}/.local/state/.vpn_loading" +} + +DEFAULT_LINK="$(resolvectl status | grep 'Default Route: yes' -B10 | grep 'Link' | tail -1 | grep -Eo '\(.*\)' | tr -d '()')" + +if resolvectl domain "$DEFAULT_LINK" | grep -q 'wzray.com'; then + IS_LOCAL=1 +fi + IFNAME="rix" while [ "$#" -gt 0 ]; do @@ -25,17 +38,26 @@ fi UP_NAME="$(send_cmd status)" -if [ -n "${UP_NAME}" ]; then - if [ "${UP_NAME}" != "${IFNAME}" ]; then +if [ -n "$IS_LOCAL" ]; then + if [ -n "$UP_NAME" ]; then send_cmd down - send_cmd up "$IFNAME" else - send_cmd down + send_router_cmd toggle fi else - send_cmd up "$IFNAME" + if [ -n "${UP_NAME}" ]; then + if [ "${UP_NAME}" != "${IFNAME}" ]; then + send_cmd down + send_cmd up "$IFNAME" + else + send_cmd down + fi + else + send_cmd up "$IFNAME" + fi fi + pkill -36 dwmblocks # vim: ft=bash diff --git a/.local/bin/scripts/vpnd b/.local/bin/scripts/vpnd index 7845a78..c529be0 100755 --- a/.local/bin/scripts/vpnd +++ b/.local/bin/scripts/vpnd @@ -2,7 +2,7 @@ # shellcheck disable=SC2034 die() { - [ -n "$oc_pid" ] && kill -s TERM $oc_pid + [ -n "$oc_pid" ] && kill -s TERM "$oc_pid" echo "exitting..." rm -f $PIPE exit 0 @@ -25,6 +25,13 @@ done COMMANDS=("up" "down" "status") +is_really_up() { + [ -n "$oc_pid" ] && if ! kill -0 "$oc_pid"; then + oc_pid= + up_name= + fi +} + in_arr() { declare -n arr="$2" @@ -35,14 +42,16 @@ in_arr() { } down() { + is_really_up [ -z "$oc_pid" ] && return - kill -s TERM $oc_pid - wait $oc_pid + kill -s TERM "$oc_pid" + wait "$oc_pid" oc_pid= up_name= } up() { + is_really_up [ -n "$oc_pid" ] && down openconnect --config "/etc/openconnect/config_$1" & oc_pid="$!" @@ -50,11 +59,8 @@ up() { } status() { - # if [ -z "$up_name" ]; then - # echo "DOWN" > $PIPE - # else - # fi - echo "$up_name" > $PIPE + is_really_up + echo "$up_name" > $PIPE } main() { diff --git a/.local/bin/scripts/win b/.local/bin/scripts/win new file mode 100755 index 0000000..2e42731 --- /dev/null +++ b/.local/bin/scripts/win @@ -0,0 +1,2 @@ +#!/bin/sh +moonlight stream higpu Desktop diff --git a/.local/bin/scripts/xr b/.local/bin/scripts/xr index ecd33f3..583ecd6 100755 --- a/.local/bin/scripts/xr +++ b/.local/bin/scripts/xr @@ -33,9 +33,6 @@ else xrandr --addmode eDP-1 "${INT_RES}" xrandr --output eDP-1 --pos 2560x400 --mode "${INT_RES}" --output "${EXT_MON}" --pos 0x0 --mode "2560x1440" --rate 144 --primary change_dpi 96 24 - xinput --map-to-output "UGTABLET 6 inch PenTablet Mouse" "${EXT_MON}" - xinput --map-to-output "UGTABLET 6 inch PenTablet Pen (0)" "${EXT_MON}" - xinput --map-to-output "UGTABLET 6 inch PenTablet Eraser (0)" "${EXT_MON}" fi exec "${HOME}/.config/X11/autostart" diff --git a/.local/bin/statusbar/sb-battery b/.local/bin/statusbar/sb-battery index 288598c..5b12415 100755 --- a/.local/bin/statusbar/sb-battery +++ b/.local/bin/statusbar/sb-battery @@ -38,10 +38,10 @@ for battery_path in /sys/class/power_supply/!(AC*); do *) status_symbol="?? " ;; esac - if [ "$capacity" -eq 100 ]; then - status_symbol=" " - elif [ -n "${custom_icons[$device_name]}" ]; then + if [ -n "${custom_icons[$device_name]}" ]; then status_symbol="${custom_icons["$device_name"]}" + elif [ "$capacity" -eq 100 ]; then + status_symbol=" " elif [[ "$status" = "Discharging" && "$capacity" -le 20 ]]; then status_symbol="❗" [ -n "$sep" ] && sep="" || sep=" "; diff --git a/.local/bin/statusbar/sb-vpn b/.local/bin/statusbar/sb-vpn index 442b058..276f398 100755 --- a/.local/bin/statusbar/sb-vpn +++ b/.local/bin/statusbar/sb-vpn @@ -1,5 +1,9 @@ #!/bin/bash +[ -f "${HOME}/.local/state/.vpn_loading" ] && { + echo 'Loading...' + exit 0 +} PIPE="/var/run/vpnd.sock" send_cmd() { @@ -16,4 +20,11 @@ esac if [ -n "$IFNAME" ]; then echo "󰦝 $IFNAME" + exit 0 +fi + +DEFAULT_LINK="$(resolvectl status | grep 'Default Route: yes' -B10 | grep 'Link' | tail -1 | grep -Eo '\(.*\)' | tr -d '()')" + +if resolvectl domain "$DEFAULT_LINK" | grep -q 'wzray.com'; then + [ "$(ssh router vpn status laptop 2>/dev/null)" = '1' ] && echo "󰦝 Local" fi diff --git a/.ssh/config b/.ssh/config index 1f9b98c..6a993af 100644 --- a/.ssh/config +++ b/.ssh/config @@ -2,17 +2,27 @@ Host * AddKeysToAgent yes IdentityFile ~/.ssh/id_ed25519 -Host *.zvray.ru *.wzray.com *.vpn.wzray.ru +Host *.zvray.ru mx*.wzray.com User root Port 8022 -Host docker - User root - Hostname 10.161.192.10 +Host phone + User u0_a230 + Port 8022 -Host 192.168.1.1 10.161.0.1 10.162.0.1 openwrt +Host laptop laptop.*.wzray.com + +Host hicpu hicpu.spb.wzray.com + User root + +Host git.wzray.com + User git + Port 2201 + +Host 192.168.1.1 10.161.0.1 10.161.0.2 10.162.0.1 openwrt router ap gateway router.*.wzray.com ap.*.wzray.com openwrt.*.wzray.com gateway.*.wzray.com User root UserKnownHostsFile /dev/null + IdentityFile /dev/null StrictHostKeyChecking no UpdateHostkeys no PubkeyAcceptedAlgorithms +ssh-rsa