#+TITLE: input/bidi #+DATE: April 22, 2022 #+SINCE: v3.0.0 #+STARTUP: inlineimages nofold * Table of Contents :TOC_3:noexport: - [[#description][Description]] - [[#maintainers][Maintainers]] - [[#module-flags][Module Flags]] - [[#plugins][Plugins]] - [[#prerequisites][Prerequisites]] - [[#features][Features]] - [[#configuration][Configuration]] - [[#using-bidi-mode][Using ~+bidi-mode~]] - [[#force-rtl-text-alignment][Force RTL text alignment]] - [[#input-methods][Input Methods]] - [[#fonts][Fonts]] - [[#smart-fontify][Smart Fontify]] - [[#change-dictionary-language-on-bidi-buffers][Change Dictionary Language On Bidi Buffers]] - [[#automatic-input-mode-switching][Automatic input mode switching]] - [[#troubleshooting][Troubleshooting]] - [[#nastaliq-font-display-bug][Nastaliq font display bug]] * Description This module improves support for bidi (bidirectional text). It should be enabled if you regularly write in languages that write right-to-left. It also provides some added configuration instructions in the README, since a lot of it is user specific. ** Maintainers + [[https://github.com/iyefrat][@iyefrat]] + [[https://github.com/ymarco][@ymarco]] ** Module Flags This module provides no flags. ** Plugins This module provides no plugins. * Prerequisites This module has no prerequisites. * Features This module provides ~+bidi-mode~, a minor mode that improves the display of RTL text by right-aligning lines that start with an RTL language, on a per-line basis. Since exact use cases vary, turning on this mode is left to the user. It also provides easy font configuration for Hebrew and Arabic-derived scripts (Arabic, Persian, Urdu, etc.) in ~+bidi-hebrew-font~ and ~+bidi-arabic-font~. See [[Fonts]] for more information. If you use an RTL language that isn't covered by these characters, open an issue requesting support for it. * Configuration ** Using ~+bidi-mode~ ~+bidi-mode~ is a local minor mode, meaning it has to be turned on a per-buffer basis. If you want to have it on for all buffers, use ~+bidi-global-mode~: #+begin_src emacs-lisp ;; ~/.doom.d/config.el (+bidi-global-mode 1) #+end_src If you only need it for specific purposes, e.g. editing LaTeX documents, you probably want to enable it through a hook: #+begin_src emacs-lisp (add-hook 'TeX-mode-hook #'+bidi-mode) #+end_src This is also useful for adding specific functionality for when ~+bidi-mode~ is on. ** Force RTL text alignment By default, ~+bidi-mode~ will align paragraphs by the first character with strong directionality. If you want to force all paragraphs to be aligned right-to-left when ~+bidi-mode~ is on, add the following to your config: #+begin_src emacs-lisp (setq +bidi-paragraph-direction 'right-to-left) #+end_src *Warning:* do not do this if you are using ~+bidi-global-mode~, it will mess up all of the buffers in Emacs that use English, including things like the =M-x= buffer. ** Input Methods If you need bidi support, it's likely that you want to easily switch between English and your favorite RTL language. In order to be able to do this without losing access to all of the keybindings require English letters, you should use [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Input-Methods.html][input methods]] to switch languages instead of changing the system keyboard language. If you use a non-qwerty layout, you will need extra configuration to keep the input method consistent, see [[https://github.com/ymarco/doom-emacs-config/blob/2d655adb6a35c5cd3afcba24e76327f5444cf774/dvorak-config.el#L3-L18][here]] for an example for dvorak. Toggling the input method bound to =C-\=. It prompts you to choose an input method the first time you do this in a session, but you bypass this by setting the default input method: #+begin_src emacs-lisp (setq default-input-method "hebrew") #+end_src ** Fonts Many good English fonts do not have great coverage for RTL languages, especially for Hebrew and monospace fonts. To this end, we provide ~+bidi-hebrew-font~ and ~+bidi-arabic-font~ as an easy way to override the default fonts but only for Hebrew and Arabic characters. They are set by default to =DejaVu Sans=, since it has pretty decent looking Hebrew and Arabic characters. Note, that if you are writing in an Arabic-derived script, such as Persian, Urdu, or Pashto, you may want to change ~+bidi-arabic-font~ to one specific to your language, especially if you want your script to be written in the Nastaliq style. If you use an RTL language the script of which isn't covered by the =hebrew= or =arabic= unicode blocks, you can set a font override manually. For example: #+begin_src emacs-lisp (add-hook 'after-setting-font-hook (lambda () (set-fontset-font t 'syriac (font-spec :family "DejaVu Sans")))) #+end_src Make sure to use the correct unicode block name, see the documentation of ~set-fontset-font~ for more details. *** Smart Fontify Since good bidi fonts are often not monospace (as is the default =DejaVu Sans=), It usually looks better to have the surrounding spaces and punctuation in the use the bidi font as well. This is the default behaviour, but you can turn this off by setting: #+begin_src emacs-lisp (setq +bidi-want-smart-fontify nil) #+end_src ** Change Dictionary Language On Bidi Buffers If you are only using ~+bidi-mode~ in specific buffers, you might want to automatically change the dictionary language there. For example: #+begin_src emacs-lisp (add-hook! '+bidi-mode-hook (if +bidi-mode (ispell-change-dictionary "hebrew") (ispell-change-dictionary "default"))) #+end_src ** Automatic input mode switching You may want to Emacs to try and guess when you want it to switch input methods. See [[https://github.com/ymarco/doom-emacs-config/blob/2d655adb6a35c5cd3afcba24e76327f5444cf774/hebrew-latex-config.el#L7-L21][here]] and [[https://github.com/ymarco/doom-emacs-config/blob/2d655adb6a35c5cd3afcba24e76327f5444cf774/hebrew-latex-config.el#L99-L102][here]] for an example of how to get Emacs to switch to hebrew when entering insert mode after a hebrew character, in LaTeX buffers. * Troubleshooting ** Nastaliq font display bug If Emacs is having trouble properly displaying a Nastaliq font, try using one of [[https://urdufonts.net/fonts/jameel-noori-nastaleeq-regular][these]] [[https://urdufonts.net/fonts/alvi-nastaleeq-regular][two]] fonts for ~+bidi-arabic-font~.