Bidirectional text
From Wikipedia:Bidirectional text, is text that contains two text directionalities, right-to-left (RTL) and left-to-right (LTR).
Concepts
- Text direction
- while editing, setting text direction changes the interaction of the editor with the text. It affects text navigation, selection, and insertion.
- Text alignment
- a stylized form of presenting text. E.g: English text can be aligned to the right despite being LTR language, but this does not change the direction of the text which is LTR.
- Fake Bidi
- a fake locale displaying completely reversed English sentences to mimic a RTL context. This helps who are not familiar with RTL language to visualize RTL issues. For example:
This English sentence contains SDROW CIBARA EMOS and ends with English words.
- Poor man's bidi mode
- automatic visual text order right-to-left input in normal terminal.
- Logical navigation
- words are traversed as they are read.
- Visual navigation
- words are traversed as they are displayed. This GIF demonstrates the difference between the two.
Logical navigation is the correct way of navigation that programs should implement to fully support Bidi.
- Unicode support
- In Unicode-supported text editors, text direction can be controlled by inserting special formatting characters in front of it: Wikipedia:RLM (U+200F), Wikipedia:LRM (U+200E), which is a workaround for text editors not supporting switching text direction.
- Bidirectional Algorithm
- is the set of rules applied to display text in the correct order.
Support
In order for a program to fully support Bidi text, it must have:
- Text shaping (RTL shaping)
- correctly apply letter rendering and ligatures. See W:harfbuzz and Complete Text Layout.
- Unicode Bidirectional Algorithm (UBA)
- determine the directionality of text segments and apply the appropriate rendering rules.
- Editing and input (Nav)
- the ability to force text direction and correct behavior of cursor movement, selection, deletion, and insertion (logical navigation).
Some implementations of UBA and letter-shaping:
- fribidi is an open source implementations of Bidi Algorithm.
- python-bidiAUR is a python library for related functions.
- SheenBidi: Improved Unicode Implementation in C.
Browsers
App | RTL | UBA | Nav | Notes |
---|---|---|---|---|
chromium | Yes | No | No | |
firefox | Yes | No | No | |
qtwebbrowser | Yes | Yes | No | |
webkit | Yes | Yes | No |
Editors
App | RTL | UBA | Nav | Notes |
---|---|---|---|---|
AbiWord | Yes | No | No | |
emacs | Yes | No | No | With extension. See also: emacs bidi editing. |
gedit | Yes | Yes | No | For Gedit <= 2.1, workaround by extension. |
ghostwriter | Yes | Yes | No | Qtwebbrowser-based |
kate | Yes | Yes | No | |
LibreOffice | Yes | No | Yes | See: LibreOffice#Bidirectional support |
marktextAUR | Yes | No | No | Blink-based |
neovim | No | No | Yes | See Vim#Bidirectional support |
notepadqq | Yes | No | No | Won't fix. |
texworks | Yes | Yes | No | |
vim | No | No | Yes | see Vim#Bidirectional support |
featherpad | Yes | Yes | No | |
Visual Studio Code | Yes | No | No | |
mousepad | Yes | Yes | No | |
pluma | Yes | Yes | No | |
GTK | Yes | Yes | No | |
xed | Yes | Yes | No |
Terminal
VTE-based terminals support special escape sequences that changes Bidi behavior. For example, to enable UBA support for command output, use echo '\e[?2501h'
. For reading more about Bidi escaping sequences see [1].
App | RTL | UBA | Nav | Notes |
---|---|---|---|---|
alacritty | No | No | No | Tested with alacritty version 0.13.0-3, the 2024-01-03. Does not support RLO (U+202E). |
contour | No | No | No | Tested with contour version 0.3.12, the 2024-01-03. Does not support RLO (U+202E). |
dvtm | No | No | No | |
extraterm | No | No | No | Tested with extraterm-binAUR version 0.74.0-1, the 2024-01-03. Does not support RLO (U+202E). |
kitty | Yes | No | Tested with kitty version 0.31.0-1, the 2024-01-02. Does not support RLO (U+202E). | |
konsole | Yes | No | Tested with konsole version 23.08.4-2, the 2024-01-02. | |
libvte | Yes | No | including libvte-based like Gnome, sakura, xfce4, terminator... Minor issues: 1 | |
mltermAUR | Yes | No | Tested with mltermAUR version 3.9.3-2, the 2024-01-03. | |
neatvi-gitAUR | No | |||
pymux | No | |||
qterminal | No | No | Tested with qterminal version 1.4.0-1, the 2024-01-02. Does not support RLO (U+202E). | |
radare2 | No | |||
Terminator | Yes | No | Tested with terminator version 2.1.3-3, the 2024-01-02. | |
tmux | No | Won't fix | ||
Urxvt | No | No | Tested with rxvt-unicode version 9.31-4, the 2024-01-03. Does not support RLO (U+202E). | |
wezterm | No | |||
xstAUR | No | |||
less | – | No | – |
Other
App | RTL | UBA | Notes |
---|---|---|---|
electronjs | No | ||
groff | No | No | |
irssi | No | ||
latex | Yes | Yes | Using LuaTeX or XeLaTeX with polyglossia |
Pandoc | Yes | No | |
Wikipedia:HTML | Yes | Yes | |
wine | Yes | No |
Troubleshooting
Verify UTF-8 Encoding is properly configured first. Make sure you install the fonts corresponding to your language: Arabic, Persian, Hebrew. For some terminals, (bicon-gitAUR) is required to properly display RTL text.