Hobby IME toy project bridging Wayland and Neovim (Hyprland/wlroots)
- A wlroots-based Wayland compositor (Hyprland, Sway, etc.) with
zwp_input_method_v2support - Neovim >= 0.10
- A compositor keybind to send
SIGUSR1to jacin for toggling
bind = ALT, grave, exec, pkill -SIGUSR1 jacinConfig file: ~/.config/jacin/config.toml
[keybinds]
commit = "<C-CR>" # Commit preedit text to application
[completion]
adapter = "native" # "native" (CompleteChanged/CompleteDone) or "nvim-cmp"
[behavior]
auto_startinsert = false # true: start in insert mode, false: start in normal modeAll fields are optional and fall back to the defaults shown above.
- native (default): Uses Vim's
CompleteChanged/CompleteDoneautocmds. Works with skkeleton henkan and any plugin that callscomplete(), including ddc.vim withddc-ui-native. - nvim-cmp: Hooks into nvim-cmp's Lua API directly for candidate extraction.
Note: Since jacin sets
buftype=nofileon its buffer, ddc.vim requiresspecialBufferCompletionenabled in your ddc config.
Kill any running IME (fcitx5, ibus, etc.) before starting jacin. Only one IME can bind zwp_input_method_v2 at a time.
cargo build --release
./target/release/jacin
./target/release/jacin --clean # Start with vanilla Neovim (no user config/plugins)Toggle the IME by sending SIGUSR1:
pkill -SIGUSR1 jacinRUST_LOG=debug ./target/release/jacinPreedit is single-line only. Multiline operations (yy, dd, cc, p, P) are not supported.
jacin grabs your keyboard via the Wayland input method protocol. While the keyboard is grabbed, all keystrokes pass through jacin and the embedded Neovim instance before reaching the focused application. This is inherent to how IMEs work, but be aware that any Neovim plugin loaded in the embedded instance can observe your input. Use --clean to run without user config/plugins if needed.
MIT

