ekiwookie.ninja
RU EN

Инструменты

i use Arch btw…

Всё, что ниже, лежит в репозиториях и разворачивается симлинками в ~/.config. Ничего экзотического: тайлинг, один хоткей-демон, neovim и сплит-клавиатура на своей прошивке.

gitlab / dotfiles bspwm, sxhkd, polybar, rofi, dunst, ghostty, alacritty, nvim, yazi, zathura, mpv, nsxiv github / corne-keyboard ZMK-конфиг сплит-клавиатуры Corne, прошивка собирается в CI

bspwm оконный менеджер

Тайлинг без лишнего: девять десктопов, рамка в 2 пикселя, нулевые зазоры, фокус только по клавише — мышь не перехватывает окно, пока ты её просто проносишь мимо.

##Main settings
bspc config border_width         2
bspc config window_gap           0
bspc config split_ratio          0.50
bspc config borderless_monocle   true
bspc config gapless_monocle      true
bspc config single_monocle       false
bspc config focus_follows_pointer false
Экран bspwm: слева ghostty с nvim, справа сверху браузер с репозиторием, справа снизу aseprite; сверху полоса polybar
Три окна в тайлинге: ghostty с nvim, браузер и aseprite. Активное окно обведено рамкой в два пикселя, зазоров между окнами нет.

Часть окон живёт на закреплённых десктопах и сразу в monocle — их не нужно искать, они всегда там, где их оставил:

bspc rule -a 'KeePassXC:*:*' -o desktop='^4' & bspc desktop '^4' -l monocle &
bspc rule -a 'Telegram:*:*'  -o desktop='^6' & bspc desktop '^6' -l monocle &
bspc rule -a 'signal:*:*'    -o desktop='^9' & bspc desktop '^9' -l monocle &

При холодном старте (когда на дереве нет ни одного окна) сессия сама поднимает браузер на первом десктопе и терминал на втором, плюс апплеты сети, блютуса и syncthing. Раскладка ставится там же: us,ru, переключение Alt+Shift, Caps Lock отдан под Ctrl.

setxkbmap -layout "us,ru" -option "grp:alt_shift_toggle,ctrl:nocaps"

sxhkd горячие клавиши

Один демон на все клавиши — и оконные, и системные. 194 строки, из них половина выражена диапазонами вида super + {_,shift + }{h,j,k,l}, поэтому таблица ниже короче конфига.

Окна и десктопы

super+h/j/k/l фокус влево / вниз / вверх / вправо
super+shift+h/j/k/l поменять окно местами с соседним
super+ctrl+h/j/k/l преселект стороны для следующего окна
super+alt+h/j/k/l раздвинуть окно на 20 px (с ctrl — сжать)
super+1…0 десктоп; с shift — отправить туда окно
super+f / d фуллскрин / плавающее — обе кнопки-переключатели
super+m следующий layout (tiled ↔ monocle)
super+g обменять текущее окно с самым большим
super+a цикл по плавающим окнам десктопа
super+` назад к предыдущему окну
super+shift+m/n повернуть всё дерево
super+w закрыть; с shift — прибить

Запуск и система

super+Return ghostty
super+space rofi drun
alt+Tab rofi по окнам вместо системного переключателя
super+c rofi-калькулятор
super+t перевести выделенное в goldendict (xsel прямо в аргумент)
super+ctrl+k шпаргалка по самим хоткеям
super+ctrl+s переключить звуковой выход
super+alt+w случайные обои
Print flameshot; с shift — весь экран сразу в ~/Pictures/Screenshots
ctrl+alt+l betterlockscreen
super+Escape перечитать конфиг sxhkd

Отдельная мелочь — отключить вставку по средней кнопке, чтобы случайный клик не ронял буфер в текст:

# disable paste clipboard on middle mouse click
~button2
    echo -n | xsel -in

neovim редактор

Конфиг на lua, менеджер плагинов — lazy.nvim, точка входа в пять строк:

require("mappings")
require("lazy-loader")
require("configs")
require("langmap")
require("autocmd")

Лидер — пробел. Из плагинов: telescope с fzf-native, neo-tree, harpoon, treesitter, nvim-cmp с LuaSnip, lspconfig под mason, conform для форматирования, nvim-dap с ui и python-адаптером, neotest, gitsigns, lazygit, hop, mini.nvim, snacks и noice. Тема — nightfox, статусная строка — lualine.

Окно telescope поверх кода: строка поиска, список совпадений и панель предпросмотра
telescope: живой греп по проекту — совпадения слева, предпросмотр найденного справа.

Русская раскладка внутри vim

Самое полезное здесь — langmap. Команды работают и в кириллице, так что переключать раскладку, чтобы нажать dd, не надо:

local en = [[`qwertyuiop[]asdfghjkl;'zxcvbnm]]
local ru = [[ёйцукенгшщзхъфывапролджэячсмить]]

vim.opt.langnoremap = true
vim.opt.langmap = vim.fn.join({ ... }, ',')

Сверху — langmapper.nvim, который тем же трюком чинит хоткеи плагинов.

Мелочи, которые въелись в пальцы

Ctrl+d / u скролл с центровкой курсора (zz следом)
n / N поиск с центровкой и раскрытием фолдов (nzzzv)
| / \ вставить пустую строку под / над курсором, не входя в insert
Tab / Shift+Tab отступ в visual, не теряя выделение
Ctrl+j / k двигать выделенные строки вверх-вниз
leader+p вставить поверх выделения, не затирая регистр
J отключён — слишком часто срабатывал случайно
leader+sx chmod +x текущему файлу

Отдельно приятное: qmk.nvim подключён для файлов devicetree и форматирует ZMK-раскладку по сетке 12×3+6 — то есть клавиатура из следующего раздела редактируется прямо здесь, и таблица биндингов сама выравнивается по физическим клавишам.

Corne сплит-клавиатура 42 клавиши, ZMK

Сплит-клавиатура на 42 клавиши: две половинки, беспроводная, на прошивке ZMK. Прошивка собирается в GitHub Actions прямо из репозитория с конфигом — правишь corne.keymap, пушишь, забираешь uf2 из артефактов.

Слои

default основной, весь модификаторный вес — на home row
fn функциональные клавиши и навигация
numeric цифры и символы
adjust bluetooth-профили, питание, служебное
worms, factorio игровые: на время игры home-row-моды выключаются, возврат — комбо крайних клавиш верхнего ряда

Home row mods

Весь домашний ряд — mod-tap: нажал коротко — буква, придержал — модификатор. Расположение зеркальное на обеих половинках: указательный палец держит shift, средний — ctrl, безымянный — alt, мизинец — gui. То есть F и J — это shift, D и K — ctrl, и так далее.

quick_tap_ms = 220 нужен, чтобы повтор буквы не превращался в зажатый Ctrl:

&lt { quick_tap_ms = <220>; };
&mt { quick_tap_ms = <220>; };

Комбо

Скобки не заведены на слой — они на одновременное нажатие соседних клавиш. Окно 50 мс плюс требование 125 мс тишины перед комбо, иначе быстрый набор ловил бы их случайно.

combo_paren_l { bindings = <&kp LPAR>; key-positions = <26 27>; };
combo_paren_r { bindings = <&kp RPAR>; key-positions = <27 28>; };
combo_bracket_l { bindings = <&kp LBKT>; key-positions = <31 32>; };
combo_brace_l   { bindings = <&kp LBRC>; key-positions = <7 8>; };

COMBO_TIMEOUT      = 50 ms
COMBO_IDLE_TIMEOUT = 125 ms

Большие пальцы и макросы

Шесть больших клавиш — все layer-tap или mod-tap: tab/numeric, space/shift, enter/fn слева, esc/fn, bspc/shift, del/numeric справа.

Из макросов живут два: accent добавляет ударение к предыдущей букве (комбинирующий U+0301 через Ctrl+Shift+U), а shiftalt жмёт Alt+Shift одной клавишей — этой связкой в X переключается раскладка. Отдельных клавиш shift и alt в раскладке нет — оба модификатора живут только как удержание в mod-tap, и нажать их вдвоём вхолостую, ничего не напечатав, неудобно.

Дисплей и статус слоя включены, RGB — нет, сон отключён: CONFIG_ZMK_DISPLAY=y, CONFIG_ZMK_SLEEP=n. Раскладка правится и глазами — через keymap-editor.