Инструменты
i use Arch btw…
Всё, что ниже, лежит в репозиториях и разворачивается симлинками в
~/.config. Ничего экзотического: тайлинг, один
хоткей-демон, neovim и сплит-клавиатура на своей прошивке.
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
Часть окон живёт на закреплённых десктопах и сразу в 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 | случайные обои |
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.
Русская раскладка внутри 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:
< { 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.