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
  • A librime frontend on neovim (TODO)

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.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 pyrime

By 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)

Frontend

Enable

~/.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_enabled

If 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"))),
    )

Key Bindings

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:
        pass

If 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.iminsert

It 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),
])

Related Projects

About

γ„“ rime for python 🐍️

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 2

  •  
  •