Vim-style navigation across every macOS app, powered by Kanata layers.
hjkl motions, word jumps, and line ops across all apps.
Overlay shows available motions on each key.
Telemetry tracks which motions the user discovers.
Cmd+Left, Option+Delete, etc.) remapped through Kanata layers. The hint layer is pure UI — removing it changes nothing about functionality.environment.json for mode changes (insert, normal, visual, operatorPending). Emits a strict snapshot with mode, source, confidence, and isStale. De-noises duplicate unchanged states. Falls back to unknown when the file is missing.@MainActor @Observable final class KindaVimStateAdapter { enum Mode: String { case insert, normal, visual, operatorPending, unknown } enum Source: String { case json, karabiner, fallback } private(set) var state: Snapshot // mode + source + confidence + isStale var isEnvironmentFilePresent: Bool }
hjkl get large accent-coloured arrow glyphs; other motions render as a smaller chip. Advanced hints are gated behind the user's "Show all keys" toggle. Lives as a sibling layer in OverlayKeyboardView's ZStack. Uses PhysicalLayout for key geometry.@MainActor struct VimHintLayer: View { let layout: PhysicalLayout let scale: CGFloat let keyFrame: (PhysicalKey) -> CGRect // Renders when adapter mode is normal/visual/operatorPending // Suppressed in terminal apps unless explicitly enabled }
h was pressed), never sequences or timestamps. Data stored at ~/Library/Application Support/KeyPath/kindavim-telemetry.json. Off by default, user-deletable, never transmitted. Powers the insights chart that tracks vim adoption over 30 days.(deflayer vim ...) definition. Motions are macOS shortcuts remapped to vim keys: h sends Left, w sends Option+Right, $ sends Cmd+Right. Mode transitions use push-msg to notify the state adapter. No special runtime support needed — the same mechanism that powers every other Kanata layer.vim layer via tap-hold. push-msg notifies mode transition.KindaVimStateAdapter reads environment.json, emits mode: .normal snapshot.VimHintLayer renders motion labels on every keycap. hjkl get large arrows, others get small chips.w → Kanata sends Option+Right (word forward). Standard macOS shortcut.mode: .insert. Hints disappear.KindaVimTelemetryStore increments the daily counter for each motion used. Aggregate only, no sequences.(deflayer vim ...). KeyPath never intercepts keystrokes itself. The same Kanata engine that runs every other layer runs vim.showHintsInTerminals and suppresses itself by default in terminals to avoid visual noise over real vim.KindaVimStateAdapter is read-only. It watches environment.json and emits snapshots. It never sends commands to Kanata or modifies layer state.h = Left, w = Option+Right, dd = Cmd+Shift+K, $ = Cmd+Right. No custom text engine. Every motion works anywhere macOS shortcuts work.