بی‌شک GNU Emacs یکی از قدرتمند‌ترین ویرایشگر‌های متنی موجود است و از آنجایی که یکی از دلایلی که بنده آن را انتخاب کردم، نوشتن متون پارسی و قابلیت دوسویه‌نویسی (Bidirectional Editing) آن بود، لازم دانستم نوشته کوچکی آماده کنم تا این مسیر را برای آیندگان آسوده‌تر سازم.

به طور پیشفرض تمامی متون در Emacs به صورت چپ‌چین نوشته می‌شوند به برای فعال سازی الگوریتم دوسویه‌نویسی نیاز است که ابتدا متغیر bidi-display-reordering به غیر از nil و در ادامه bidi-paragraph-direction به غیر از left-to-right یا right-to-left تنظیم شود1:

(setq-default bidi-display-reordering t
              bidi-paragraph-direction nil)

همان‌طور که از اسم متغیر bidi-paragraph-direction پیداست، این متغیر جهت متن را کنترل می‌کند و وقتی آن را به nil تغییر دهیم Emacs به طور پاراگراف-به-پاراگراف در خصوص جهت متن تصمیم‌گیری می‌کند. (برای تغییر جهت اجباری متن تنها کافیست این متغیر را به left-to-right یا right-to-left تغییر دهید. آگاه باشید که این مقدار ها symbol هستند و نه string.)

همانند هر ویرایشگر هوشمند دیگری، الگوریتم دوسویه‌نویسی Emacs از روی اولین حرف موجود در خط تصمیم می‌گیرد که پاراگراف را چگونه نمایش دهد؛ ولی با توجه به اینکه لاتک و یا HTML به خطوط جدید حساس هستند و در برخی دستورات و برچسب‌ها را نمی‌توان به سادگی فاصله ایجاد کرد، به نظر من منطقی‌تر است که الگوریتم دوسویه‌نویسی به صورت خط به خط اعمال شود. طراحان Emacs دو متغیر bidi-paragraph-start-re و bidi-paragraph-separate-re را برای تغییر شروع و پایان دوسویه‌نویسی در پاراگراف‌ها در اختیار ما کاربران گذاشته‌اند، از‌این‌رو می‌توان با پیکربندی زیر از آن‌ها برای رسیدن به مقصودمان استفاده کرد:

(setq-default bidi-paragraph-start-re "^"
              bidi-paragraph-separate-re "^")

همان‌گونه که مشاهده کردید، با چندین لاین کد emacs-lisp به سادگی الگوریتم دوسویه‌نویسی را همان‌طور که می‌خواستیم شخصی‌سازی کردیم. یکی از برتری‌های Emacs نسبت به ویرایشگر‌های دیگر همین قابلیت شخصی‌سازی آن است، ازاین‌رو لازم می‌دانم به کاربران جدید این ویرایشگرِ قدرتمند گویم که Emacs به‌راستی "می‌تواند" چیزی باشد که به آن نیاز دارید، تنها باید مستندات آن را مطالعه کرده و طبق نیاز‌های خود آن را پیکربندی و شخصی‌سازی کنید.


  1. از آنجایی که این متغیر buffer-local است، لازم است از تابع ‍setq-default استفاده شود.