Hobby IME toy project bridging Wayland and Neovim.
No Fcitx/IBus needed.
Requires a Wayland compositor that implements.
zwp_input_method_v2zwp_virtual_keyboard_v1zwp_input_popup_surface_v2
- Neovim >= 0.10
- A Wayland compositor with
zwp_input_method_v2,zwp_virtual_keyboard_v1, andzwp_input_popup_surface_v2support - 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" (ext_popupmenu) or "nvim-cmp"
[behavior]
startinsert = true # true: start in insert mode, false: start in normal mode
recording_blink = true # Blink the REC indicator while recording a macro
write_to_commit = false # :w commits preedit text to the application (:wq, :x also work)
[font]
family = "Noto Sans CJK JP" # Proportional font (preedit/candidates). Default: fontconfig auto
mono_family = "JetBrains Mono" # Monospace font (keypress/mode display). Default: "monospace"
size = 16.0 # Font size in pixelsAll fields are optional and fall back to the defaults shown above.
- native (default): Uses Neovim's
ext_popupmenuUI extension. 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 (nvim-cmp uses its own floating window, not the native popup menu).
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
