- Keep changes minimal; no fallbacks; add tests after edits.
- i3 config lives at
i3/config;exec --no-startup-id xbindkeysstarts user hotkeys. - STT mapping source is not in i3: it’s in
~/.xbindkeysrc→ runs~/git/voice_input/voice_toggle.shonb:9(mouse button 9). - Change applied (2025‑11‑01): commented out those two lines in
~/.xbindkeysrcand backed up to~/.xbindkeysrc.bak.<timestamp>. - Test added:
tests/xbindkeys_no_stt_test.shensures no active (uncommented)voice_toggle.shbinding remains. - Note:
$mod+pappears twice ini3/config(workspace prev vs.--releaseadd_anki_screenshot). Consider resolving to a single behavior.
2025‑11‑07: Colemak‑DH nav keys in i3
- Added Colemak nav in
i3/config:$mod+n/e/i/o→ focus left/down/up/right. - Kept existing QWERTY home‑row nav (
j/k/l/;). Did not change$mod+hsince it’s used forsplit hhere. - Freed conflicting bindings:
- Removed
$mod+n/$mod+pworkspace next/prev; rely on$mod+Ctrl+Right/Left(already present). This also resolves the$mod+pconflict with the--releaseAnki screenshot. - Removed
layout toggle splitbinding to avoid duplicate with exit on$mod+Shift+e(use$mod+qsplit toggle instead). - Sticky toggle now on
$mod+Shift+a(freed$mod+Shift+ofor move‑right).
- Removed
- Test added:
tests/i3_nav_keys_test.shverifies NEIO focus binds exist and conflicts are gone.
2025‑11‑07: Colemak move‑window bindings
- Added
$mod+Shift+n/e/i/o→ move left/down/up/right (tiling moves). - Left pixel moves on
$mod+Shift+j/k/l/;for floating windows. - Updated test to assert move binds and sticky relocation; tests pass.
2025‑11‑07: Resize mode NEIO aliases
- Added
n/e/i/oinmode "resize"mirroringj/k/l/;. - Test added:
tests/i3_resize_neio_test.sh; all tests pass.
2025‑11‑09: Move stays on Shift
- Reverted move-window to
$mod+Shift+n/e/i/o. - Moved exit shortcut to
$mod+Shift+Escapeto avoid conflict withShift+e. - Tests updated;
i3 -Cclean; reload succeeds.
Notes / potential issues
- i3
bindsymis layout‑dependent; enabling both NEIO and JKL provides simple multi‑layout support withoutbindcodecomplexity.
2025‑11‑07: How to reload i3
- Reload config: press
$mod+Shift+c(Super+Shift+C). - CLI alternative:
i3-msg reload(andi3-msg restartif needed). - If it errors, run
i3 -Cto see the failing line.
2025‑11‑07: Config linkage
- Verified
~/.config/i3/configis a symlink to~/git/dotfiles/i3/configon this system; reloading i3 picks up repo changes.
2025‑11‑07: i3 reload error reported
- Ask user to run
i3 -Cand share the exact error line(s) and line number. - If not symlinked, validate which file i3 reads: usually
~/.config/i3/config.
2025‑11‑07: Accidental‑trigger review (suspects)
--release $mod+p→add_anki_screenshot.shati3/config:374; very easy to hit during workspace nav habits.$mod+h→split hati3/config:72; clashes with Vim‑muscle memory for focus.$mod+q→split toggleati3/config:74; near common letters.$mod+b→workspace back_and_forthati3/config:67; surprising workspace flips.$mod+Shift+q→ kill ati3/config:22; fat‑finger risk.$mod+Shift+o→ sticky toggle ati3/config:385; less risky now, but still close to navo.
Suggested fixes (pending user pick)
- Move Anki screenshot to
$mod+Shift+Pand drop--release. - Consider moving
split hoff$mod+hor add HJKL focus and relocate split. - Optionally comment out
workspace back_and_forth. 2025‑11‑07: Removed release trigger - Changed
bindsym --release $mod+p …add_anki_screenshot.shtobindsym $mod+p …ini3/config:380. - Left
--release $mod+xuntouched for now; can remove if wanted.
2025‑11‑07: Fix move-left not working
- Cause: duplicate binding for
$mod+Shift+n—border normal(i3/config:10) conflicted with newmove left(i3/config:45). i3 keeps the earlier one and ignores the later, so move-left didn’t fire and reload printed a duplicate-binding error. - Fix: remapped
border normalto$mod+Shift+y. - Test:
tests/i3_nav_keys_test.shnow fails if$mod+Shift+nis bound toborder normal.
2025‑11‑11: Fuzzy‑search shortcuts (current)
- i3 launcher:
$mod+d→dmenu_run(i3/config:26).rofi -show runexists but is commented (i3/config:25). - Neovim Telescope:
<leader>fand<C-s>→Telescope find_files(nvim/lua/plugins/init.lua:120,:121);<leader>fs→current_buffer_fuzzy_find(:127);<leader>fg→live_grep(:126). - Zsh + fzf:
Ctrl+Khistory (zshrc_custom.sh:166),Alt/Ctrl+Afile widget (:182,:183),Alt/Ctrl+Jz+j dir jump (:169,:170),Ctrl+Sopensnvimoldfiles picker (:240).
Notes
- If “fuzzy search” is intended as the i3 app launcher, consider switching back to
rofifor true fuzzy matching and replacing the currentdmenu_run.
2025‑11‑11: Project content search mapping
- Added Neovim mapping:
<leader>e→Telescope live_grepfor project-wide content search (Colemak-DH home row). File:nvim/lua/plugins/init.lua:121–129area. - Test:
tests/nvim_project_search_keymap_test.shasserts the mapping exists; all tests pass locally. - Future cleanup (optional): remove duplicate live_grep bindings (
<leader>s,<leader>fg) to keep the surface minimal.
2025‑11‑11: Filename fuzzy search mapping
- Updated:
<leader>o→Telescope find_files(Colemak‑DH home row). Replaces prior<leader>i. - Test:
tests/nvim_filename_search_keymap_test.shupdated accordingly.
2025‑11‑11: Git shorthand
- "acp" means: run tests, then
git add -A,git commit, andgit push. - Commit style: concise, mention mappings/tests/docs; keep it minimal.
2025‑11‑11: Telescope keymap audit (applied)
- Files: standardized on
<leader>o(find_files). Removed leader duplicates<leader>f/<leader>ff>; kept<C-s>as optional non‑leader. - Content: standardized on
<leader>s(live_grep). Removed<leader>eand<leader>fgduplicates. - Others kept:
<leader>fsbuffer fuzzy find;<leader>fbbuffers;<leader>fhhelp;<leader>:cmd history.
2025‑11‑11: Leader keys
mapleaderis Space;maplocalleaderis\. File:nvim/init.lua:25–26.- Test added:
tests/nvim_leader_test.shverifies both assignments.
2025‑11‑11: Hop jump mappings
- Added Hop char jumps:
s→ 2‑char jump (current window);S→ 2‑char jump across all windows. File:nvim/lua/plugins/init.luain Hop config. - Test:
tests/nvim_hop_mappings_test.shgreps forhint_char2()andmulti_windows = true. - Note: This repurposes default
s/Smotions; if you rely ons(substitute), considergs/gSinstead. - Also:
;currently runs a custom Hop‑word action.
2025‑11‑11: Why <Space>f/<Space>s didn’t work
- We deduped and removed
<Space>f; filename search is now<Space>o(see note below about a conflicting map inkeymaps.lua). <Space>smapping lived inside Telescope’s pluginconfig, but Telescope was lazy‑loaded with no key triggers, so the mapping wasn’t created at startup. Fix: setlazy = falsefor Telescope. Test:tests/nvim_telescope_eager_test.sh.- Heads‑up:
nvim/lua/keymaps.lua:63maps<Space>oto previous file (<C-^>), overriding the Telescope file search map. Decide which one to keep.
2025‑11‑11: Revert Hop s/S bindings
- Removed
s/Schar-jump mappings per request; semicolon remains the Hop trigger. - Test updated:
tests/nvim_hop_semicolon_test.shensures;mappings exist. 2025‑11‑11: Hop mapping options (proposed) - Goal: one key then type chars to jump anywhere (Hop).
- 11a (recommend):
;→hop.hint_char2()(current window). Minimal; fast. - 11b:
;→hop.hint_char2({ multi_windows = true })(all windows). - 11c: Split:
;→ char2 (current window),g;→ char2 (all windows). - 11d: Keep
;= Hop words; add<Space>;→ char2 (avoids overriding current;). - 11e: Use
gs/gSfor char2 (preserves defaults/S). - 11f: Line jumping:
<Space>l→hop.hint_lines(); keep;for words. - Note: Pick one; do not keep multiple to avoid muscle-memory conflicts. Remove the old
;mapping when switching. 2025‑11‑11: Why use Hop char2 - Char2 balances precision and speed: far fewer on‑screen hints than char1, but no word‑boundary constraints like
hint_words. - Works uniformly across code, prose, and symbols (camelCase, snake_case, punctuation, paths) without per‑language setup.
- Muscle‑memory friendly: one trigger then two natural letters you already see under the cursor.
- Tradeoffs: char1 is faster to type but noisy;
hint_wordsis simple but can’t jump mid‑token. Choose based on preference.
2025‑11‑11: Why <leader>o fuzzy file search didn’t work
- Root cause: conflicting map in
nvim/lua/keymaps.lua:63sets<leader>oto<C-^>(previous file), overriding Telescope’s<leader>o→find_filesinnvim/lua/plugins/init.lua:123. - Load order: Telescope is eager (
lazy = false), butrequire("keymaps").setup()runs at the end ofnvim/init.lua, so the keymaps file wins. - Added test:
tests/nvim_leader_o_conflict_test.shfails if<leader>ois defined inkeymaps.lua. - Suggested fix: remove the
<leader>omapping inkeymaps.luaand rely on native<C-^>for previous file, keeping<leader>oexclusively for Telescope.
2025‑11‑12: Prev file on <leader>p (applied)
- Change: remapped previous file to
<leader>pinnvim/lua/keymaps.lua;<leader>ois now free for Telescope files. - Test:
tests/nvim_prev_file_leader_p_test.shasserts the new mapping. - Guard:
tests/nvim_leader_o_conflict_test.shprevents regressions by failing if<leader>oreappears inkeymaps.lua.
2025‑11‑12: Fixed flaky tests
tests/nvim_leader_test.sh: switched to fixed‑stringrg -Fand corrected backslash escaping formaplocalleader = "\\".tests/nvim_hop_semicolon_test.sh: simplified to fixed‑string checks; no brittle regexes.- Full suite now passes locally.
2025‑11‑24: ZSA Keymapp install (user‑space)
- Found
~/Downloads/keymapp-latest.tar.gz; installed Keymapp to~/.local/opt/keymappand symlinked~/.local/bin/keymapp. - Added desktop entry:
~/.local/share/applications/keymapp.desktop(icon from the tarball). - Test added:
tests/keymapp_install_test.shverifies binary, icon, and desktop entry. - Note: udev rules for ZSA (vendor
3297) were NOT installed due to no root access in this session. Without them, Keymapp may not detect keyboards. Next session with sudo: add/etc/udev/rules.d/50-zsa.rulesand reload udev. - Ubuntu 20.04: if Keymapp fails to start, install runtime deps:
libwebkit2gtk-4.0-37 libusb-1.0-0 libgtk-3-0.
What I learned / keep in mind
- Prefer user‑space installs when escalations aren’t available; leave a minimal test.
- ZSA needs udev
uaccessrules for Vendor3297; add them system‑wide when allowed.