1
0
Fork 0
This commit is contained in:
Arthur K. 2025-06-16 11:04:16 +03:00
parent ce19d6a62c
commit 624ab42f73
Signed by: wzray
GPG key ID: B97F30FDC4636357
26 changed files with 493 additions and 163 deletions

View file

@ -1,5 +1,4 @@
clipmenud & clipmenud &
flameshot & flameshot &
easyeffects --gapplication-service &
# vim: ft=sh # vim: ft=sh

View file

@ -56,7 +56,8 @@ bindings = [
{key = "Slash", mods = "Control", chars = "\u001f"}, {key = "Slash", mods = "Control", chars = "\u001f"},
{key = "Space", mods = "Control", chars = "\u0000"}, {key = "Space", mods = "Control", chars = "\u0000"},
{key = "Back", mods = "Control", chars = "\u001b\u007f"}, {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] [general]

View file

@ -1,41 +1,43 @@
{ {
"Comment.nvim": { "branch": "master", "commit": "e30b7f2008e52442154b66f7c519bfd2f1e32acb" }, "Comment.nvim": { "branch": "master", "commit": "e30b7f2008e52442154b66f7c519bfd2f1e32acb" },
"LuaSnip": { "branch": "master", "commit": "33b06d72d220aa56a7ce80a0dd6f06c70cd82b9d" }, "LuaSnip": { "branch": "master", "commit": "c1851d5c519611dfc451b6582961b2602e0af89b" },
"Navigator.nvim": { "branch": "master", "commit": "91d86506ac2a039504d5205d32a1d4bc7aa57072" }, "Navigator.nvim": { "branch": "master", "commit": "91d86506ac2a039504d5205d32a1d4bc7aa57072" },
"bufferline.nvim": { "branch": "main", "commit": "261a72b90d6db4ed8014f7bda976bcdc9dd7ce76" }, "bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" },
"cmp-buffer": { "branch": "main", "commit": "3022dbc9166796b644a841a02de8dd1cc1d311fa" }, "cmp-buffer": { "branch": "main", "commit": "b74fab3656eea9de20a9b8116afa3cfc4ec09657" },
"cmp-nvim-lsp": { "branch": "main", "commit": "39e2eda76828d88b773cc27a3f61d2ad782c922d" }, "cmp-nvim-lsp": { "branch": "main", "commit": "a8912b88ce488f411177fc8aed358b04dc246d7b" },
"fidget.nvim": { "branch": "main", "commit": "e2a175c2abe2d4f65357da1c98c59a5cfb2b543f" }, "fidget.nvim": { "branch": "main", "commit": "d9ba6b7bfe29b3119a610892af67602641da778e" },
"indent-blankline.nvim": { "branch": "master", "commit": "259357fa4097e232730341fa60988087d189193a" }, "indent-blankline.nvim": { "branch": "master", "commit": "005b56001b2cb30bfa61b7986bc50657816ba4ba" },
"iptables": { "branch": "master", "commit": "0d18b1e468f547dd7e2c494d42bc134a1e0eac7e" }, "iptables": { "branch": "master", "commit": "0d18b1e468f547dd7e2c494d42bc134a1e0eac7e" },
"lazy.nvim": { "branch": "main", "commit": "656cf4309396b7b8b62984e923bf8d8a0013f7d7" }, "lazy.nvim": { "branch": "main", "commit": "6c3bda4aca61a13a9c63f1c1d1b16b9d3be90d7a" },
"lspkind.nvim": { "branch": "master", "commit": "d79a1c3299ad0ef94e255d045bed9fa26025dab6" }, "lspkind.nvim": { "branch": "master", "commit": "d79a1c3299ad0ef94e255d045bed9fa26025dab6" },
"lualine.nvim": { "branch": "master", "commit": "2a5bae925481f999263d6f5ed8361baef8df4f83" }, "lualine.nvim": { "branch": "master", "commit": "15884cee63a8c205334ab13ab1c891cd4d27101a" },
"mason.nvim": { "branch": "main", "commit": "e2f7f9044ec30067bc11800a9e266664b88cda22" }, "mason.nvim": { "branch": "main", "commit": "7c7318e8bae7e3536ef6b9e86b9e38e74f2e125e" },
"multilayout.nvim": { "branch": "main", "commit": "613ec4ace9097a4464a558777aaf6a15b3d8bd78" },
"neodev.nvim": { "branch": "main", "commit": "46aa467dca16cf3dfe27098042402066d2ae242d" }, "neodev.nvim": { "branch": "main", "commit": "46aa467dca16cf3dfe27098042402066d2ae242d" },
"nvim-autopairs": { "branch": "master", "commit": "b464658e9b880f463b9f7e6ccddd93fb0013f559" }, "nvim-autopairs": { "branch": "master", "commit": "4d74e75913832866aa7de35e4202463ddf6efd1b" },
"nvim-cmp": { "branch": "main", "commit": "ca4d3330d386e76967e53b85953c170658255ecb" }, "nvim-cmp": { "branch": "main", "commit": "b5311ab3ed9c846b585c0c15b7559be131ec4be9" },
"nvim-colorizer.lua": { "branch": "master", "commit": "a065833f35a3a7cc3ef137ac88b5381da2ba302e" }, "nvim-colorizer.lua": { "branch": "master", "commit": "a065833f35a3a7cc3ef137ac88b5381da2ba302e" },
"nvim-lastplace": { "branch": "main", "commit": "0bb6103c506315044872e0f84b1f736c4172bb20" }, "nvim-lastplace": { "branch": "main", "commit": "0bb6103c506315044872e0f84b1f736c4172bb20" },
"nvim-lspconfig": { "branch": "master", "commit": "47f236c058f0511702286a21ba53bbf42abbd8a8" }, "nvim-lspconfig": { "branch": "master", "commit": "61e5109c8cf24807e4ae29813a3a82b31821dd45" },
"nvim-notify": { "branch": "master", "commit": "fbef5d32be8466dd76544a257d3f3dce20082a07" }, "nvim-notify": { "branch": "master", "commit": "b5825cf9ee881dd8e43309c93374ed5b87b7a896" },
"nvim-surround": { "branch": "main", "commit": "9f0cb495f25bff32c936062d85046fbda0c43517" }, "nvim-surround": { "branch": "main", "commit": "0e62500b98f4513feaaf7425c135472457ea5b7d" },
"nvim-tree.lua": { "branch": "master", "commit": "375e38673b5c61debd8074ced01cfd4f3b7ce1e9" }, "nvim-tree.lua": { "branch": "master", "commit": "e7d1b7dadc62fe2eccc17d814354b0a5688621ce" },
"nvim-treesitter": { "branch": "master", "commit": "894cb3cebbad0535fb4e319ada5d875dbc48d8b9" }, "nvim-treesitter": { "branch": "master", "commit": "28d480e0624b259095e56f353ec911f9f2a0f404" },
"nvim-treesitter-context": { "branch": "master", "commit": "b9e30333ece125297cfc5d652465cbc9a23b4916" }, "nvim-treesitter-context": { "branch": "master", "commit": "5c48b8ba1b0b7b25feb6e34e7eb293ea893aedc4" },
"nvim-treesitter-textobjects": { "branch": "master", "commit": "ad8f0a472148c3e0ae9851e26a722ee4e29b1595" }, "nvim-treesitter-textobjects": { "branch": "master", "commit": "0e3be38005e9673d044e994b1e4b123adb040179" },
"nvim-web-devicons": { "branch": "master", "commit": "87c34abe5d1dc7c1c0a95aaaf888059c614c68ac" }, "nvim-web-devicons": { "branch": "master", "commit": "f1420728f59843eb2ef084406b3d0201a0a0932d" },
"onedark.nvim": { "branch": "master", "commit": "67a74c275d1116d575ab25485d1bfa6b2a9c38a6" }, "onedark.nvim": { "branch": "master", "commit": "11de4da47f3e69cb70c3ae9816bd8af166cbe121" },
"plenary.nvim": { "branch": "master", "commit": "2d9b06177a975543726ce5c73fca176cedbffe9d" }, "plenary.nvim": { "branch": "master", "commit": "857c5ac632080dba10aae49dba902ce3abf91b35" },
"quickfix-reflector.vim": { "branch": "master", "commit": "6a6a9e28e1713b9e9db99eec1e6672e5666c01b9" }, "quickfix-reflector.vim": { "branch": "master", "commit": "6a6a9e28e1713b9e9db99eec1e6672e5666c01b9" },
"telescope-emoji.nvim": { "branch": "master", "commit": "86248d97be84a1ce83f0541500ef9edc99ea2aa1" }, "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" }, "telescope.nvim": { "branch": "0.1.x", "commit": "a0bbec21143c7bc5f8bb02e0005fa0b982edc026" },
"todo-comments.nvim": { "branch": "main", "commit": "ae0a2afb47cf7395dc400e5dc4e05274bf4fb9e0" }, "todo-comments.nvim": { "branch": "main", "commit": "304a8d204ee787d2544d8bc23cd38d2f929e7cc5" },
"trouble.nvim": { "branch": "main", "commit": "46cf952fc115f4c2b98d4e208ed1e2dce08c9bf6" }, "trouble.nvim": { "branch": "main", "commit": "85bedb7eb7fa331a2ccbecb9202d8abba64d37b3" },
"vim-bbcode": { "branch": "master", "commit": "6fb28c6deae5844ee2bf0b97ef2fea04bd3d4eac" }, "vim-bbcode": { "branch": "master", "commit": "6fb28c6deae5844ee2bf0b97ef2fea04bd3d4eac" },
"vim-caddyfile": { "branch": "master", "commit": "24fe0720551883e407cb70ae1d7c03f162d1d5a0" }, "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-peekaboo": { "branch": "master", "commit": "cc4469c204099c73dd7534531fa8ba271f704831" },
"vim-sleuth": { "branch": "master", "commit": "be69bff86754b1aa5adcbb527d7fcd1635a84080" } "vim-sleuth": { "branch": "master", "commit": "be69bff86754b1aa5adcbb527d7fcd1635a84080" }
} }

View file

@ -34,3 +34,5 @@ vim.o.timeoutlen = 300
vim.o.splitbelow = true vim.o.splitbelow = true
vim.o.splitright = true vim.o.splitright = true
vim.diagnostic.config({ virtual_text = true })

View file

@ -1,23 +1,24 @@
local servers = { local servers = {
ansiblels = {},
bashls = {}, bashls = {},
cmake = {},
clangd = {}, clangd = {},
cmake = {},
eslint = {}, eslint = {},
gopls = {}, gopls = {},
hls = {}, hls = {},
jdtls = {}, jdtls = {},
jsonls = {},
kotlin_language_server = {}, kotlin_language_server = {},
lua_ls = require('lsp.lua_ls'), lua_ls = require('lsp.lua_ls'),
pyright = {}, pyright = {},
ruby_lsp = {}, ruby_lsp = {},
rust_analyzer = {}, rust_analyzer = {},
svls = {},
ts_ls = {}, ts_ls = {},
yamlls = require('lsp.yamlls'), yamlls = require('lsp.yamlls'),
jsonls = {},
svls = {}
} }
vim.lsp.set_log_level("debug") vim.lsp.set_log_level('info')
local on_attach = function(_, bufnr) local on_attach = function(_, bufnr)
local nmap = function(keys, func) local nmap = function(keys, func)

View file

@ -2,6 +2,7 @@ return {
'isobit/vim-caddyfile', 'isobit/vim-caddyfile',
'rcarriga/nvim-notify', 'rcarriga/nvim-notify',
'stefandtw/quickfix-reflector.vim', 'stefandtw/quickfix-reflector.vim',
'nfnty/vim-nftables',
'tpope/vim-fugitive', 'tpope/vim-fugitive',
'junegunn/vim-peekaboo', 'junegunn/vim-peekaboo',
'tpope/vim-sleuth', 'tpope/vim-sleuth',
@ -15,4 +16,33 @@ return {
-- { 'wakatime/vim-wakatime', event = 'VeryLazy' }, -- { 'wakatime/vim-wakatime', event = 'VeryLazy' },
{ 'williamboman/mason.nvim', opts = {} }, { 'williamboman/mason.nvim', opts = {} },
'Winseven4lyf/vim-bbcode', '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,
}}
} }

View file

@ -43,12 +43,15 @@ GNUPGHOME='~/.local/share/gnupg'
GOPATH="${HOME}/.local/share/go" GOPATH="${HOME}/.local/share/go"
GPG_TTY="$(tty)" GPG_TTY="$(tty)"
JAVA_HOME="/usr/lib/jvm/java-23-openjdk" 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'" MANPAGER="sh -c 'col -bx | bat -l man -p --theme Monokai\ Extended'"
MANROFFOPT="-c" MANROFFOPT="-c"
MTR_OPTIONS="-t" MTR_OPTIONS="-t"
SSH_ASKPASS="${HOME}/.local/bin/scripts/pinentry-askpass" SSH_ASKPASS="${HOME}/.local/bin/scripts/pinentry-askpass"
SUDO_ASKPASS="${HOME}/.local/bin/scripts/dmenu-askpass" SUDO_ASKPASS="${HOME}/.local/bin/scripts/dmenu-askpass"
GRADLE_USER_HOME="${HOME}/.local/share/gradle" GRADLE_USER_HOME="${HOME}/.local/share/gradle"
DOCKER_CONFIG="${HOME}/.local/share/docker"
COMPOSE_BAKE=true
GIT_DISCOVERY_ACROSS_FILESYSTEM=1
set +a set +a

View file

@ -1,5 +1,7 @@
. ~/.config/zsh/modes.sh . ~/.config/zsh/modes.sh
fpath=($HOME/.local/share/completions $fpath)
# ls colors # ls colors
eval "$(dircolors -b)" eval "$(dircolors -b)"
@ -51,7 +53,8 @@ PS1="%B%{$fg[red]%}[%{$fg[yellow]%}%n%{$fg[green]%}@%{$fg[blue]%}%M %{$fg[magent
# ls aliases # 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 l="ls -lh"
alias la="ls -lah" alias la="ls -lah"
alias ll="ls -lh" alias ll="ls -lh"
@ -77,25 +80,28 @@ alias ..............="cd ../../../../../../../../../../../../../"
alias ...............="cd ../../../../../../../../../../../../../../" alias ...............="cd ../../../../../../../../../../../../../../"
# aliases # aliases
alias rz="exec zsh" alias sudo='sudo ' # allow aliases with sudo
alias venv="source src_venv" alias rz='exec zsh'
alias ex="source src_example" alias venv='source src_venv'
alias ap="source src_add_path" alias ex='source src_example'
alias info="pinfo " alias ap='source src_add_path'
alias bat="bat " alias info='pinfo'
alias img="nsxiv " alias bat='bat '
alias xclip="xclip -selection clipboard" alias img='nsxiv'
alias d="diff --color -u " alias xclip='xclip -selection clipboard'
alias rgf="rg --files | rg " alias xxclip='head -c-1 | xclip -selection clipboard'
alias 7z="7zz" # for whatever reason 7z provides 7zz binary in debian alias rgf='rg --files | rg'
alias wt="watch --color -d -cn 0.1 " alias wt='watch --color -d -cn 0.1 '
alias .e="set -a && source .env && set +a" alias .e='set -a && source .env && set +a'
alias vimu="vim -u /dev/null" alias vimu='vim -u /dev/null'
alias reswap="sudo bash -c 'echo Working...; swapoff /swapfile && sudo swapon /swapfile'" alias reswap="sudo bash -c 'echo Working...; swapoff /swapfile && sudo swapon /swapfile'"
alias make="make -j$(nproc)" alias make="make -j$(nproc)"
alias py="python3" alias py='python3'
alias neofetch="fastfetch" alias neofetch='fastfetch'
alias open="xdg-open" 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 # function aliases
bl() { brightnessctl set "$1"% > /dev/null; } bl() { brightnessctl set "$1"% > /dev/null; }
@ -103,15 +109,17 @@ nosw() { alacritty --class 'noswallow' -e "$@"; }; compdef _command nosw
t() { taskell "${1:-${HOME}/.taskell.md}"; } t() { taskell "${1:-${HOME}/.taskell.md}"; }
vims() { filepath="$(type "$1" | rev | cut -d ' ' -f 1 | rev)"; [ $? -eq 0 ] && vim "${filepath}"; }; compdef _command vims vims() { filepath="$(type "$1" | rev | cut -d ' ' -f 1 | rev)"; [ $? -eq 0 ] && vim "${filepath}"; }; compdef _command vims
tl() { tree -C "$@" | bat }; compdef _tree tl tl() { tree -C "$@" | bat }; compdef _tree tl
diff() { /usr/bin/diff --color -u "$@" | delta; }; compdef _files di
# compdef # compdef
compdef -a '_git; _git-commit' gdc # todo compdef -a '_git; _git-commit' gdc # todo
compdef '_files -g "*.md"' md compdef '_files -g "*.md"' md
compdef _ollama ollama
# git aliases # git aliases
gl() { git log --decorate "$@" | bat }; compdef '_git; _git-log' gl gl() { git log --decorate "$@" | bat }; compdef '_git; _git-log' gl
gus() { git branch --set-upstream-to="${1:?}/${2:?}" "${2:?}"}; compdef '_git; _git-push' gus 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 ga="git add"
alias gb="git branch" alias gb="git branch"
alias gc="git commit" alias gc="git commit"
@ -120,6 +128,8 @@ alias gck="git checkout"
alias gcl="git clone" alias gcl="git clone"
alias gcls="git clone --depth=1" alias gcls="git clone --depth=1"
alias gcm="git commit --allow-empty-message -m ''" 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 gcn="git clean"
alias gcp="git cherry-pick" alias gcp="git cherry-pick"
alias gd="git diff" alias gd="git diff"
@ -137,6 +147,8 @@ alias grjs="git rebase --cancel"
alias grm="git remote" alias grm="git remote"
alias grs="git restore --staged" alias grs="git restore --staged"
alias grt="git reset" alias grt="git reset"
alias gsm='git submodule'
alias grc='git rm --cached'
alias gs="git status" alias gs="git status"
alias gsc="git switch -c" alias gsc="git switch -c"
alias gsh="git show" alias gsh="git show"
@ -146,9 +158,18 @@ alias gt="git tag"
alias gus="git fetch --unshallow" alias gus="git fetch --unshallow"
# docker aliases # docker aliases
alias dc="docker compose" alias d='docker'
alias docker!="DOCKER_HOST=ssh://docker /usr/bin/docker" alias dc='docker compose'
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 # tmux stuff
tn() { tmux new-session -s "${1-"$(basename "$(pwd)")"}" } tn() { tmux new-session -s "${1-"$(basename "$(pwd)")"}" }
@ -158,4 +179,6 @@ alias ta="tmux a -t"
stty -ixon stty -ixon
# print tasks on startup # 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

View file

@ -10,9 +10,9 @@ cpp_mode::find_exec() {
} }
ct() { ct() {
eval "$(cpp_mode::find_exec "tests")" "$(cpp_mode::find_exec "tests")"
} }
cr() { cr() {
eval "$(cpp_mode::find_exec)" "$(cpp_mode::find_exec)"
} }

View file

@ -1,5 +1,5 @@
[core] [core]
pager = delta pager = delta --tabs 4
[user] [user]
email = me@wzray.com email = me@wzray.com
name = Arthur K. name = Arthur K.
@ -17,3 +17,6 @@
tool = nvimdiff tool = nvimdiff
[diff] [diff]
colorMoved = default colorMoved = default
[safe]
directory = /home/wzray/Services/cpu
directory = /home/wzray/Services/cpu/*

2
.gitignore vendored
View file

@ -1,2 +1,2 @@
.zcompdump .zcompdump*
/.fonts/.uuid /.fonts/.uuid

34
.local/bin/scripts/bin Executable file
View file

@ -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"

16
.local/bin/scripts/docker Executable file
View file

@ -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 "$@"

View file

@ -8,6 +8,10 @@ elif [[ "$url" =~ ^[a-zA-Z0-9_-]+@([a-zA-Z0-9_.-]+):(.*) ]]; then
url="https://${BASH_REMATCH[1]}/${BASH_REMATCH[2]}" url="https://${BASH_REMATCH[1]}/${BASH_REMATCH[2]}"
url="${url%.git}" url="${url%.git}"
xdg-open "$url" 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 else
echo "TODO: $url" echo "TODO: $url"
fi fi

View file

@ -1,39 +1,146 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import json
import os import os
import subprocess import subprocess
import sys import sys
from typing import Literal
import requests
import time
import threading 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): def die(r: str):
print(r, file=sys.stderr) print(r, file=sys.stderr)
exit(1) 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: with open(f"{os.environ['HOME']}/.secrets/openrouter.nike.secret") as f:
return strip_equal(s.replace('\n','').strip(), '`', 4) KEY=f.readline().strip()
if not KEY:
die("Missing key!")
HEADERS = {'Authorization': f'Bearer {KEY}'}
def spin(text: str): with subprocess.Popen(["git", "diff", "--staged"], stdout=subprocess.PIPE) as ps:
interval = 80 ps.wait()
spinner = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"] DIFF = ps.stdout and ps.stdout.read().decode('utf-8').strip()
i = 0 if not DIFF or DIFF == "":
while state == "loading": die("Nothing to commit!")
i = (i + 1) % len(spinner)
print(f"\r{spinner[i]} {text}", end=' ') URL = 'http://higpu:11434/api/chat'
time.sleep(interval / 1000) MODEL = 'gemma3:4b'
symbol = "✔️" if state == "done" else "❌"
print(f"\r{symbol} {text}") 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 <<EOF\n [binaries]\n@@ -59,16 +59,17 @@ jobs:\n \n - name: Package artifacts\n env:\n- ARTIFACT_SUFFIX: ${{ startsWith(github.ref, 'refs/tags/v') && format('-{0}', github.ref_name) || '' }}\n+ VERSION_SUFFIX: ${{ startsWith(github.ref, 'refs/tags/v') && format('-{0}', github.ref_name) || '' }}\n run: |\n mkdir artifacts\n+ BASE=\"ukb$VERSION_SUFFIX\"\n \n- NAME=\"ukb-linux$ARTIFACT_SUFFIX\"\n+ NAME=\"$BASE-linux-x86_64\"\n cd build.linux/install\n tar czf \"../../artifacts/$NAME.tar.gz\" *\n cd ../..\n \n- NAME=\"ukb-windows$ARTIFACT_SUFFIX\"\n+ NAME=\"$BASE-windows-x86_64\"\n cd build.win/install\n zip -r \"../../artifacts/$NAME.zip\" *\n cd ../.."
},
{
"role": "assistant",
"content": "feat: include arch in artifacts names"
},
{
"role": "user",
"content": "\ndiff --git a/src/main.c b/src/main.c\nindex 2d87a78..0f64564 100644\n--- a/src/main.c\n+++ b/src/main.c\n@@ -11,6 +11,7 @@\n \n static struct {\n bool silent;\n+ bool list;\n const char* backend;\n } args;\n \n@@ -20,6 +21,7 @@ static const char* usage =\n \" -h show this help page\\n\"\n \" -s be silent and don't print anything to stderr\\n\"\n \" -b manually specify backend that should be used\\n\"\n+ \" -l list all registered backends and their availability\\n\"\n \" it will be used even if it is reported as unavailable\\n\"\n \"\";\n \n@@ -28,9 +30,10 @@ void parse_args(int argc, char **argv) {\n int opt;\n \n args.silent = false;\n+ args.list = false;\n args.backend = NULL;\n \n- while ((opt = getopt(argc, argv, \"shb:\")) != -1) {\n+ while ((opt = getopt(argc, argv, \"shb:l\")) != -1) {\n switch (opt) {\n case 's':\n args.silent = true;\n@@ -40,6 +43,10 @@ void parse_args(int argc, char **argv) {\n args.backend = optarg;\n break;\n \n+ case 'l':\n+ args.list = true;\n+ break;\n+\n case '?':\n fatal(\"Invalid option or missing argument\");\n break;\n@@ -54,6 +61,22 @@ void parse_args(int argc, char **argv) {\n }\n \n \n+void list_backends() {\n+ printf(\"Registered backends:\\n\\n\");\n+\n+ for (size_t i = 0; i < ukb_backends_number; ++i) {\n+ const ukb_backend_t *b = ukb_backends[i];\n+ if (ukb_backend_can_use(b)) {\n+ printf(\" * %s [available]\\n\", ukb_backend_name(b));\n+ } else {\n+ printf(\" * %s\\n\", ukb_backend_name(b));\n+ }\n+ }\n+\n+ printf(\"\\n\");\n+}\n+\n+\n void cb_print(const char* layout) {\n printf(\"%s\\n\", layout);\n fflush(stdout);\n@@ -62,6 +85,11 @@ void cb_print(const char* layout) {\n int main(int argc, char **argv) {\n parse_args(argc, argv);\n \n+ if (args.list) {\n+ list_backends();\n+ return 0;\n+ }\n+\n const ukb_backend_t *b;\n \n if (args.backend) {"
},
{
"role": "assistant",
"content": "feat: add list (`-l`) option to ukb"
},
{
"role": "user",
"content": "\ndiff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml\nindex 4a6e5bc..fa4f919 100644\n--- a/.github/workflows/workflow.yml\n+++ b/.github/workflows/workflow.yml\n@@ -21,7 +21,11 @@ jobs:\n \n - name: Build (Linux)\n run: |\n- meson setup build.linux\n+ meson setup build.linux \\\n+ --prefix=/ \\\n+ --libdir=/lib \\\n+ --buildtype=release \\\n+ --strip\n meson compile -C build.linux\n meson install -C build.linux --destdir=install\n \n@@ -33,7 +37,7 @@ jobs:\n cpp = 'x86_64-w64-mingw32-g++'\n ar = 'x86_64-w64-mingw32-ar'\n strip = 'x86_64-w64-mingw32-strip'\n- pkgconfig = 'x86_64-w64-mingw32-pkg-config'\n+ pkg-config = 'x86_64-w64-mingw32-pkg-config'\n exe_wrapper = ''\n \n [host_machine]\n@@ -46,7 +50,10 @@ jobs:\n prefix = '/'\n EOF\n \n- meson setup build.win --cross-file mingw-cross.txt\n+ meson setup build.win \\\n+ --cross-file mingw-cross.txt \\\n+ --buildtype=release \\\n+ --strip\n meson compile -C build.win\n meson install -C build.win --destdir=install\n \ndiff --git a/meson.build b/meson.build\nindex 898c3e0..5ee43f7 100644\n--- a/meson.build\n+++ b/meson.build\n@@ -30,18 +30,17 @@ endif\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+libukb = both_libraries('ukb', lib_src,\n+ include_directories: inc,\n+ dependencies: deps,\n+ c_args: ['-DUKB_BACKENDS_INTERNAL'],\n+ install: true,\n+ install_dir: get_option('libdir'),\n+)\n \n \n executable('ukb', 'src/main.c',\n include_directories: inc,\n- link_with: libukb_a,\n+ link_with: libukb.get_static_lib(),\n install: true,\n )"
},
{
"role": "assistant",
"content": "feat: unify artifact structure, enable release mode"
},
{
"role": "user",
"content": "\ndiff --git a/src/backends/sway.c b/src/backends/sway.c\nindex 229b8bb..c7e8978 100644\n--- a/src/backends/sway.c\n+++ b/src/backends/sway.c\n@@ -37,22 +37,22 @@ typedef union header {\n \n \n static int sway_ipc_open(const char *socket_path) {\n-\tint socketfd;\n-\tif ((socketfd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {\n+ int socketfd;\n+ if ((socketfd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {\n return -1;\n-\t}\n+ }\n \n-\tstruct sockaddr_un addr = {\n+ struct sockaddr_un addr = {\n .sun_family = AF_UNIX,\n .sun_path = {0},\n };\n-\tstrncpy(addr.sun_path, socket_path, sizeof(addr.sun_path) - 1);\n+ strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path) - 1);\n \n-\tif (connect(socketfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_un)) == -1) {\n+ if (connect(socketfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_un)) == -1) {\n return -1;\n-\t}\n+ }\n \n-\treturn socketfd;\n+ return socketfd;\n }\n \n static bool sway_ipc_send(int fd, uint32_t type, uint32_t length, const char *data) {"
},
{
"role": "assistant",
"content": "style: fix indentation (tabs & spaces mixing)"
},
{
"role": "user",
"content": "\ndiff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml\nnew file mode 100644\nindex 0000000..4a6e5bc\n--- /dev/null\n+++ b/.github/workflows/workflow.yml\n@@ -0,0 +1,81 @@\n+name: Build\n+\n+on: [push]\n+\n+jobs:\n+ build:\n+ runs-on: ubuntu-latest\n+ permissions:\n+ contents: write\n+ steps:\n+ - uses: actions/checkout@v4\n+\n+ - name: Install dependencies\n+ run: |\n+ sudo apt update\n+ sudo apt install -y \\\n+ mingw-w64 build-essential pkg-config \\\n+ ninja-build meson \\\n+ libjson-c-dev libx11-dev \\\n+ zip\n+\n+ - name: Build (Linux)\n+ run: |\n+ meson setup build.linux\n+ meson compile -C build.linux\n+ meson install -C build.linux --destdir=install\n+\n+ - name: Build (Windows)\n+ run: |\n+ cat > mingw-cross.txt <<EOF\n+ [binaries]\n+ c = 'x86_64-w64-mingw32-gcc'\n+ cpp = 'x86_64-w64-mingw32-g++'\n+ ar = 'x86_64-w64-mingw32-ar'\n+ strip = 'x86_64-w64-mingw32-strip'\n+ pkgconfig = 'x86_64-w64-mingw32-pkg-config'\n+ exe_wrapper = ''\n+\n+ [host_machine]\n+ system = 'windows'\n+ cpu_family = 'x86_64'\n+ cpu = 'x86_64'\n+ endian = 'little'\n+\n+ [built-in options]\n+ prefix = '/'\n+ EOF\n+\n+ meson setup build.win --cross-file mingw-cross.txt\n+ meson compile -C build.win\n+ meson install -C build.win --destdir=install\n+\n+ - name: Package artifacts\n+ env:\n+ ARTIFACT_SUFFIX: ${{ startsWith(github.ref, 'refs/tags/v') && format('-{0}', github.ref_name) || '' }}\n+ run: |\n+ mkdir artifacts\n+\n+ NAME=\"ukb-linux$ARTIFACT_SUFFIX\"\n+ cd build.linux/install\n+ tar czf \"../../artifacts/$NAME.tar.gz\" *\n+ cd ../..\n+\n+ NAME=\"ukb-windows$ARTIFACT_SUFFIX\"\n+ cd build.win/install\n+ zip -r \"../../artifacts/$NAME.zip\" *\n+ cd ../..\n+\n+ - name: Upload artifacts\n+ if: ${{ !startsWith(github.ref, 'refs/tags/v') }}\n+ uses: actions/upload-artifact@v4\n+ with:\n+ name: artifacts\n+ path: artifacts/*\n+\n+ - name: Create Release\n+ if: ${{ startsWith(github.ref, 'refs/tags/v') }}\n+ uses: ncipollo/release-action@v1.16.0\n+ with:\n+ generateReleaseNotes: true\n+ artifacts: \"artifacts/*\"\ndiff --git a/.gitignore b/.gitignore\nindex 276e9cd..2fa41b4 100644\n--- a/.gitignore\n+++ b/.gitignore\n@@ -4,3 +4,5 @@\n ukb\n .cache/\n compile_commands.json\n+build*/\n+artifacts/"
},
{
"role": "assistant",
"content": "feat: add cicd"
},
{
"role": "user",
"content": "\ndiff --git a/meson.build b/meson.build\nindex 229d3fd..898c3e0 100644\n--- a/meson.build\n+++ b/meson.build\n@@ -11,7 +11,7 @@ deps = []\n platform = host_machine.system()\n \n if platform == 'linux'\n- add_project_arguments('-DPLATFORM=LINUX', language: ['c'])\n+ add_project_arguments('-DPLATFORM_LINUX', language: ['c'])\n lib_src += files(\n 'src/backends/sway.c',\n 'src/backends/xorg.c',\n@@ -20,6 +20,9 @@ if platform == 'linux'\n dependency('json-c', required: true),\n dependency('x11', required: true),\n ]\n+elif platform == 'windows'\n+ add_project_arguments('-DPLATFORM_WINDOWS', language: ['c'])\n+ lib_src += files('src/backends/windows.c')\n else\n error('unknown platform: ' + platform)\n endif\ndiff --git a/src/backends/windows.c b/src/backends/windows.c\nnew file mode 100644\nindex 0000000..491af84\n--- /dev/null\n+++ b/src/backends/windows.c\n@@ -0,0 +1,67 @@\n+#include <stdio.h>\n+#include <stdbool.h>\n+#include <windows.h>\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. 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.""" 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: REQUEST = {
KEY=f.readline().strip() "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) N: int = 1
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
argv = iter(sys.argv[1:]) argv = iter(sys.argv[1:])
for arg in argv: for arg in argv:
if arg == "-n": if arg == "-n":
N = int(next(argv)) 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 = { def strip_equal(msg: str, substring: str, n_max: int) -> str:
"model": "gpt-4o-mini", if n_max <= 0 or msg[0] != substring or msg[-1] != substring:
"messages": [ return msg
{ return strip_equal(msg[1:-1], substring, n_max-1)
"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 cleanup_string(s: str) -> str:
return strip_equal(s.replace('\n','').strip(), '`', 4)
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: if r.status_code != 200:
state = "fail" Spinner.stop(False)
thread.join()
die(f"status code: {r.status_code}\n{r.text}") die(f"status code: {r.status_code}\n{r.text}")
choices.append(r.json())
state = "done" Spinner.stop()
thread.join()
choices = '# ' + '\n# '.join(map(lambda x: cleanup_string(x['message']['content']), r.json()['choices'])) choices = '# ' + '\n# '.join(map(lambda x: cleanup_string(x['message']['content']), choices))
fd = os.memfd_create("file.txt") fd = os.memfd_create("file.txt")
fd_wrapper = os.fdopen(fd, mode="w+") with os.fdopen(fd, mode="w+") as fd_wrapper:
fd_wrapper.write(choices) fd_wrapper.write(choices)
fd_wrapper.flush() fd_wrapper.flush()
fd_path = f"/proc/{os.getpid()}/fd/{fd}" os.system(f"git commit -v -e -F- < /proc/{os.getpid()}/fd/{fd}")
os.system(f"git commit -v -e -F- < {fd_path}")
try:
main()
finally:
Spinner.stop(False)

View file

@ -29,7 +29,6 @@ else
else else
curl "${API_ENDPOINT}${FIELDS_SHORT}" 2>/dev/null | jq -r .query | tr -d $'\n' curl "${API_ENDPOINT}${FIELDS_SHORT}" 2>/dev/null | jq -r .query | tr -d $'\n'
fi fi
# curl "${API_ENDPOINT}${FIELDS_SHORT}" 2>/dev/null | jq -r .query | tr -d $'\n'
fi fi
# vim: ft=bash # vim: ft=bash

View file

@ -2,7 +2,7 @@
set -e 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 if [ "$(udisksctl info -b "$1" | grep -c 'MountPoints:\s\{8\}.')" -eq 0 ]; then
udisksctl mount -b "$1" udisksctl mount -b "$1"

9
.local/bin/scripts/ollama Executable file
View file

@ -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 "$@"

14
.local/bin/scripts/tablet Executable file
View file

@ -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

View file

@ -6,6 +6,19 @@ send_cmd() {
cat < $PIPE 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" IFNAME="rix"
while [ "$#" -gt 0 ]; do while [ "$#" -gt 0 ]; do
@ -25,6 +38,13 @@ fi
UP_NAME="$(send_cmd status)" UP_NAME="$(send_cmd status)"
if [ -n "$IS_LOCAL" ]; then
if [ -n "$UP_NAME" ]; then
send_cmd down
else
send_router_cmd toggle
fi
else
if [ -n "${UP_NAME}" ]; then if [ -n "${UP_NAME}" ]; then
if [ "${UP_NAME}" != "${IFNAME}" ]; then if [ "${UP_NAME}" != "${IFNAME}" ]; then
send_cmd down send_cmd down
@ -35,6 +55,8 @@ if [ -n "${UP_NAME}" ]; then
else else
send_cmd up "$IFNAME" send_cmd up "$IFNAME"
fi fi
fi
pkill -36 dwmblocks pkill -36 dwmblocks

View file

@ -2,7 +2,7 @@
# shellcheck disable=SC2034 # shellcheck disable=SC2034
die() { die() {
[ -n "$oc_pid" ] && kill -s TERM $oc_pid [ -n "$oc_pid" ] && kill -s TERM "$oc_pid"
echo "exitting..." echo "exitting..."
rm -f $PIPE rm -f $PIPE
exit 0 exit 0
@ -25,6 +25,13 @@ done
COMMANDS=("up" "down" "status") COMMANDS=("up" "down" "status")
is_really_up() {
[ -n "$oc_pid" ] && if ! kill -0 "$oc_pid"; then
oc_pid=
up_name=
fi
}
in_arr() { in_arr() {
declare -n arr="$2" declare -n arr="$2"
@ -35,14 +42,16 @@ in_arr() {
} }
down() { down() {
is_really_up
[ -z "$oc_pid" ] && return [ -z "$oc_pid" ] && return
kill -s TERM $oc_pid kill -s TERM "$oc_pid"
wait $oc_pid wait "$oc_pid"
oc_pid= oc_pid=
up_name= up_name=
} }
up() { up() {
is_really_up
[ -n "$oc_pid" ] && down [ -n "$oc_pid" ] && down
openconnect --config "/etc/openconnect/config_$1" & openconnect --config "/etc/openconnect/config_$1" &
oc_pid="$!" oc_pid="$!"
@ -50,10 +59,7 @@ up() {
} }
status() { status() {
# if [ -z "$up_name" ]; then is_really_up
# echo "DOWN" > $PIPE
# else
# fi
echo "$up_name" > $PIPE echo "$up_name" > $PIPE
} }

2
.local/bin/scripts/win Executable file
View file

@ -0,0 +1,2 @@
#!/bin/sh
moonlight stream higpu Desktop

View file

@ -33,9 +33,6 @@ else
xrandr --addmode eDP-1 "${INT_RES}" 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 xrandr --output eDP-1 --pos 2560x400 --mode "${INT_RES}" --output "${EXT_MON}" --pos 0x0 --mode "2560x1440" --rate 144 --primary
change_dpi 96 24 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 fi
exec "${HOME}/.config/X11/autostart" exec "${HOME}/.config/X11/autostart"

View file

@ -38,10 +38,10 @@ for battery_path in /sys/class/power_supply/!(AC*); do
*) status_symbol="?? " ;; *) status_symbol="?? " ;;
esac esac
if [ "$capacity" -eq 100 ]; then if [ -n "${custom_icons[$device_name]}" ]; then
status_symbol=" "
elif [ -n "${custom_icons[$device_name]}" ]; then
status_symbol="${custom_icons["$device_name"]}" status_symbol="${custom_icons["$device_name"]}"
elif [ "$capacity" -eq 100 ]; then
status_symbol=" "
elif [[ "$status" = "Discharging" && "$capacity" -le 20 ]]; then elif [[ "$status" = "Discharging" && "$capacity" -le 20 ]]; then
status_symbol="❗" status_symbol="❗"
[ -n "$sep" ] && sep="" || sep=" "; [ -n "$sep" ] && sep="" || sep=" ";

View file

@ -1,5 +1,9 @@
#!/bin/bash #!/bin/bash
[ -f "${HOME}/.local/state/.vpn_loading" ] && {
echo 'Loading...'
exit 0
}
PIPE="/var/run/vpnd.sock" PIPE="/var/run/vpnd.sock"
send_cmd() { send_cmd() {
@ -16,4 +20,11 @@ esac
if [ -n "$IFNAME" ]; then if [ -n "$IFNAME" ]; then
echo "󰦝 $IFNAME" 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 fi

View file

@ -2,17 +2,27 @@ Host *
AddKeysToAgent yes AddKeysToAgent yes
IdentityFile ~/.ssh/id_ed25519 IdentityFile ~/.ssh/id_ed25519
Host *.zvray.ru *.wzray.com *.vpn.wzray.ru Host *.zvray.ru mx*.wzray.com
User root User root
Port 8022 Port 8022
Host docker Host phone
User root User u0_a230
Hostname 10.161.192.10 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 User root
UserKnownHostsFile /dev/null UserKnownHostsFile /dev/null
IdentityFile /dev/null
StrictHostKeyChecking no StrictHostKeyChecking no
UpdateHostkeys no UpdateHostkeys no
PubkeyAcceptedAlgorithms +ssh-rsa PubkeyAcceptedAlgorithms +ssh-rsa