rime for python, attached to prompt-toolkit keybindings for some prompt-toolkit applications such as ptpython.
This project is consist of two parts:
- A python binding of librime
- A librime frontend on ptpython
- A librime frontend on neovim (TODO)
# Ubuntu
sudo apt-get -y install librime-dev librime1 pkg-config
sudo apt-mark auto librime-dev pkg-config
# ArchLinux
sudo pacman -S --noconfirm librime pkg-config
# Android Termux
apt-get -y install librime pkg-config
# Nix
# use nix-shell to create a virtual environment then build
# homebrew
brew install librime pkg-config
# Windows msys2
pacboy -S --noconfirm pkg-config librime gccfrom pyrime.ime.ui import UI
from pyrime.key import Key
from pyrime.session import Session
session = Session()
key = Key.new("n")
ui = UI()
if not session.process_key(key.code, key.mask):
raise Exception
context = session.get_context()
if context is None:
raise Exception
content, _ = ui.draw(context)
print("\n".join(content))n|
[β δ½ ]β‘ ι£ β’ ε’ β£ θ½ β€ εΉ΄ β₯ ζ¨ β¦ ε
β§ ζΏ β¨ εͺ βͺ εΌ |>
A simplest example can be found by:
pip install pyrime[cli]
python -m pyrimeBy default, pyrime search ibus/fcitx/trime's config paths. You can see where it found:
from pyrime.api import Traits
print(Traits.user_data_dir)~/.config/ptpython/config.py:
from ptpython.repl import PythonRepl
from prompt_toolkit.key_binding.key_processor import KeyPressEvent
from pyrime.ptpython.rime import Rime
def configure(repl: PythonRepl) -> None:
rime = Rime(repl)
@repl.add_key_binding("c-^", filter=rime.insert_mode)
def _(event: KeyPressEvent) -> None:
rime.is_enabled = not rime.is_enabledIf you have a special rime config path, you can:
import os
from ptpython.repl import PythonRepl
from pyrime.session import Session
from pyrime.api import Traits
def configure(repl: PythonRepl) -> None:
rime = Rime(
repl,
Session(Traits(user_config_dir=os.path.expanduser("~/.config/rime"))),
)If you have defined some key bindings in *_insert_mode, they can disturb rime.
try:
# from prompt_toolkit.filters.app import emacs_insert_mode, vi_insert_mode
# @repl.add_key_binding("c-h", filter=emacs_insert_mode | vi_insert_mode)
@repl.add_key_binding("c-h", filter=rime.insert_mode)
def _(event: KeyPressEvent) -> None:
passIf you want to exit rime in vi_navigation_mode, refer the following code of
pyrime.ptpython.bindings.viemacs's load_viemacs_bindings():
from prompt_toolkit.filters.app import vi_navigation_mode
@repl.add_key_binding("escape", filter=rime.insert_mode)
def _(event: KeyPressEvent) -> None:
"""Switch insert mode to normal mode.
:param event:
:type event: KeyPressEvent
:rtype: None
"""
# store rime status
rime.iminsert = rime.is_enabled
# disable rime
rime.is_enabled = False
event.app.editing_mode = EditingMode.VI
event.app.vi_state.input_mode = InputMode.NAVIGATION
# and a, I, A, ...
@repl.add_key_binding("i", filter=vi_navigation_mode)
def _(event: KeyPressEvent) -> None:
"""Switch normal mode to insert mode.
:param event:
:type event: KeyPressEvent
:rtype: None
"""
event.app.editing_mode = EditingMode.EMACS
event.app.vi_state.input_mode = InputMode.INSERT
# recovery rime status
rime.is_enabled = rime.iminsertIt will remember rime status and enable it when reenter vi_insert_mode or
emacs_insert_mode.
Some predefined key bindings are provided. You can enable what you want:
from prompt_toolkit.key_binding.key_bindings import merge_key_bindings
from pyrime.ptpython.bindings.autopair import load_autopair_bindings
from pyrime.ptpython.bindings.rime import load_rime_bindings
# by default, last registry is:
# from pyrime.ptpython.bindings import load_key_bindings
# rime.app.key_bindings.registries[-1] = load_key_bindings(rime)
rime.app.key_bindings.registries[-1] = merge_key_bindings([
load_rime_bindings(rime),
load_autopair_bindings(rime),
])- A collection of rime frontends
- A collection of rime frontends for neovim
- A collection of rime translators and filters