[TITLE] [DATE]
--------------------------------------------------------------------------------
[SETTITLE]Janky IME
[SETDATE]6-29-2023
UPDATE: This IME is now tmux based, old xdotool version is still here
UPDATE2: I have created the most cursed thing in existance. Full unicode display
and input support in the linux console using only bash/busybox and tmux.
See we have unicode at home
A new python version came out, so of course that means every python package on
my rolling-release system has broken. This includes ibus, which I need for my
input method. I'm currently running some web-crawling scripts that I don't want
to stop, so while I wait for my machine to finish downloading all PDB, I decided
to write a janky bashscript implementation of ibus table so that I can still use
嘸蝦米.
Background:
嘸蝦米 (EN: Boshiamy) is a proprietary component-based input method for
Chinese. They offer paid software on iOS, Android, and Windows, but no
Linux version is available. On my phone I gladly pay for a Boshiamy
license, but on Linux I use this implementation of Boshiamy using ibus
table from here.
However, I urge that people pay for the license anyways as most of the
actual work in creating an IME is organizing ways to decompose
characters into componentd and compiling inputs codes off of that, and
not the technical implementation I'm doing here, which is fairly
trivial.
In technical terms, it's just a very large TSV file with the first
column being the input code, the 2nd being the character, and the 3rd
being a ranking for ordering which character comes first when selecting
them.
EX:
typing wso[SPACE] or wso1 inputs 浩, typing wso2 inputs 澢
wso 浩 100
wso 澢 99
It can also be used for non-chinese characters such as è
,ne è 100
The Implementation:
I want this to work in the terminal, and I want it to only require bash,
and xorg, and it needs to work on all programs running in the terminal
regardless of whether they used cooked input(bash) or raw input(vim)
So what I ended up on is a bash script that runs in a seperate tmux
panel and sends input to the previously active panel
Input is read with read in a loop
CODE:
OIFS=$IFS
export IFS=""; read -rsn1 i
IFS=$OIFS
IFS="" is done to make it read spaces as input, but this makes this
implementation very brittle and probably not portable depending on bash
versions. This also passes along control and special characters such as
delete and move left, and it seems tmux handles most of these
differences
I then simple run grep ^$code\s, rearrange the columns with awk, sort,
then take out the ranking column
CODE:
opt=$(grep "^$code\s" ~/lang/zh/boshiamy/ibus-boshiamy/boshiamy.txt |\
#remove simplfied
grep -v 98|\
awk '{print $3" "$2}' |\
sort -nr|\
awk '{print $2}')
finally, it inputs the selected character if the input is 1-9 or Space,
using tmux send-keys on the previously active pane. Note that bash
variables don't sort newlines, so the conversion of the input characters
from line seperated to space seperated was done for free. However this
makes the code less portable
CODE:
char=$(echo $opt | awk "{print \$1}")
...
tmux send-key -t "!" "$char"
Downsides/The Future:
This works in the linux console but obviously the linux console has
limitations on what text it can display(by default the linux console can
not display fonts with more than 512 characters). I think I'm gonna
write a bash based cbrll implemntation and a character displayer as well