Skip to content

rimeinn/pyrime

Repository files navigation

pyrime

readthedocs pre-commit.ci status github/workflow codecov

github/downloads github/downloads/latest github/issues github/issues-closed github/issues-pr github/issues-pr-closed github/discussions github/milestones github/forks github/stars github/watchers github/contributors github/commit-activity github/last-commit github/release-date

github/license github/languages github/languages/top github/directory-file-count github/code-size github/repo-size github/v

pypi/status pypi/v pypi/downloads pypi/format pypi/implementation pypi/pyversions

aur/votes aur/popularity aur/maintainer aur/last-modified aur/version

screenshot

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

Dependence

# 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 gcc

Usage

Binding

from pyrime.key import Key
from pyrime.session import Session
from pyrime.ui import UI

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 pyrime

Frontend

~/.config/ptpython/config.py:

from ptpython.repl import PythonRepl
from prompt_toolkit.filters.app import (
    emacs_insert_mode,
    vi_insert_mode,
    vi_navigation_mode,
)
from prompt_toolkit.key_binding.key_processor import KeyPressEvent
from pyrime.ptpython import RIME


def configure(repl: PythonRepl) -> None:
    rime = RIME(repl)

    @repl.add_key_binding(
        "c-^",
        filter=(emacs_insert_mode | vi_insert_mode) & rime.filter(),
    )
    def _(event: KeyPressEvent) -> None:
        rime.toggle()

If you have defined some key bindings which will disturb rime, try:

    @repl.add_key_binding("c-h", filter=emacs_insert_mode & rime.filter())
    def _(event: KeyPressEvent) -> None:
        rime.toggle()

If you want to exit rime in vi_navigation_mode, try:

    @repl.add_key_binding("escape", filter=emacs_insert_mode)
    def _(event: KeyPressEvent) -> None:
        """.

        :param event:
        :type event: KeyPressEvent
        :rtype: None
        """
        event.app.editing_mode = EditingMode.VI
        event.app.vi_state.input_mode = InputMode.NAVIGATION
        rime.disable()

    # and a, I, A, ...
    @repl.add_key_binding("i", filter=vi_navigation_mode)
    def _(event: KeyPressEvent) -> None:
        """.

        :param event:
        :type event: KeyPressEvent
        :rtype: None
        """
        event.app.editing_mode = EditingMode.EMACS
        event.app.vi_state.input_mode = InputMode.INSERT
        rime.enable()

It will remember rime status and enable it when reenter vi_insert_mode or emacs_insert_mode.

Some utility functions are defined in this project. Refer my ptpython config to know more.

Related Projects