اینجا گفتم چرا به نظرم توی ویم برای نوشتن متون دوطرفه به همون چپ به راستِ کج و کوله راضی شدم.
میخوام یکم بیشتر دلیلش رو توضیح بدم و بگم چجوری برای این روش میشه یه پلاگین نئوویم نوشت.
چنتا حقیقت (از نظر من):
- روش برخورد با متن و ویرایش ویم با بقیه ویرایشگرهای مرسوم فرق میکنه. یه سری قانون و متود داریم برای پیمایش و ویرایش متن که بعد از یه مدت ناخودآگاه ازشون استفاده میکنیم.
- زبان فارسی راست به چپ هست و وقتی یه جایی مجبوریم فارسی رو با یه زبون چپ به راست قاطی کنیم دهنمون سرویس میشه.
- توی کدهامون اگه یه جمله فارسی بیاد وسط کاراکترای انگلیسی حتی بیشتر دهنمون سرویس میشه.
- مشکل اصلی، عمل پیمایش متن فارسی و پاک کردن و ویرایش متن هست.
- وقتی چینش کل متن به یه شکل باشه (کلا راستچین/کلا چپچین)، خیلی راحت متن رو ویرایش میکنیم حالا چه با نوت پد باشه چه با ویم.
یه ادعا:
هستهی ویم نباید مثل بقیه ویرایشگرها برای درست نشون دادن متنهای دوطرفه دستکاری بشه. یعنی به همین شکلی که ترتیب کاراکترها رو دستکاری نمیکنه و برعکس نشون میده، باید با متن کار کنیم.
چرا؟ چون اگه بخوایم فارسی رو درست نشون بدیم و درست پیمایش کنیم جریانِ کاری که از ویم توی مغزمون به عنوان حافظه عضلانی حک شده خراب میشه.
کوچکترین واحد متنی که توی متن مختلط باهاش کار میکنیم کلمه هست. تقریبا هر موقع میخوایم یه تیکه از یه متن فارسی توی کد رو تغییر بدیم کل یه کلمه رو تغییر میدیم. چون میدونیم اینکه اشارهگر رو بذاریم وسط کلمه و با سلام و صلوات بک اسپیس رو بزنیم، معمولا جوری که پیش بینی میکنیم کار نمیکنه.
برای همین من میگم به جای اینکه کل یه جمله (دنباله کاراکتر فارسی تا رسیدن به کاراکتر انگلیسی بعدی) رو راست چین کنیم، بیایم متن رو بر اساس فاصله بین کلمات تیکه تیکه کنیم و فقط هر کلمه رو راست چین نمایش بدیم. این روش ایدهال نیست (یه جورایی احمقانست) ولی به نظرم یه جورایی کار رو راه میندازه بدون اینکه روند کار ویم به هم بخوره.
خب حالا برای انجام این روش بیایم چینش متن اصلی توی ویرایشگرمون رو عوض کنیم؟
نه، چون میخوایم پیمایش و ویرایشمون دقیقا مثل متن چپ به راست باشه.
پس به یه پنجرهی جدا نیاز داریم که قطعهی فارسی که روش قرار داریم رو تیکه تیکه کنه و کلمههاش رو جدا جدا راست چین کنه و به چشممون کمک کنه که بتونیم متنی که داریم روش پیمایش/ویرایش میکنیم رو بخونیم. اسم این پنجره رو میذارم پنجرهی آینه.
این پنجره آینه میتونه یه پنجره شناور یا یه برش عمودی/افقی (vertical/horizontal split) رو پنجرهی اصلی باشه، یا صرفا نمایش آینه روی نوار وضعیت (status line).
چیزی که من انتخاب کردم یه برش افقی از پنجرهی کنونی هست.
چرا برش افقی؟
به نظرم وقتی که داریم توی یه کد رو ویرایش و پیمایش میکنیم تمرکزمون فقط روی خطی که روش هستیم نیست. نیاز داریم چنتا خط بالاتر و چنتا خط پایینتر رو هم ببینیم. پس به یه دید بازتر از متن نیاز داریم. پس استفاده از نوار وضعیت کارایی لازم رو نداره. انگار ده سانت جلوتر از دماغت رو نتونی ببینی.
پس با این فرض که توی پنجره آینه میخوایم چنتا خط قبلی و بعدی رو هم آینه کنیم و نشون بدیم پنجرهی شناور هم باعث ایجاد مشکل میشه. چون بسته به حجم متن، سایز پنجره شناور متغیر میشه بیشتر ازینکه کمک کننده باشه حواس پرت کن میشه.
یک مسئلهی دیگه هم که هست اینه که میخوایم پنجرهی آینه با پنجرهی اصلی سینک باشه. یعنی موقع پیمایش روی متن اصلی توی پنجرهی آینه هم اشاره گر داشته باشیم. و همچنین با اسکرول کردن متن اصلی متن آینه هم اسکرول شه.
پس برش افقی/عمودی برای ساختن پنجرهی آینه مناسب هست.
دلیل اینکه برش افقی بهتره اینه که برش افقی نسبت به برش عمودی پهنای بیشتری رو در بر میگیره و دید بهتری از متن بهمون ارائه میده. چون چشممون مکررا باید بین پنجره اصلی و آینه سوئیچ کنه اینکه آینه نیمه بالای متن باشه سوئیچ کردن نگاهمون سریعتر میشه.
حالا که به طرز عجیبی خودم رو قانع کردم که متن فارسی رو چپ به راست پیمایش/ویرایش کنم برم ببینم توی ویم چطوری میشه پلاگین نوشت. شنیدم خیلی سخت نیست. ولی خب قظعا خیلی هم آسون نیست.
در اصل من از نئوویم استفاده میکنم. چرا؟ چون پروژهی خیلی زیبا، تمیز، باسلیقه و به فکر فروبرندهای است. هم از دید مهندسی نرمافزار هم از دید کار نهایی محصول. خودشون توی گیتهاب خیلی زیبا و قانع کننده انگیزشون رو توضیح دادن.
چیزی که من توی پروسه نوشتن پلاگین نئوویم دستگیرم شد اینه که شما کافیه بتونید کاری که میخواید انجام بدید رو مرحله به مرحله با apiها و دستورات نئوویم انجام بدید.
برای این که دستورات و متودهای مورد نیاز رو هم پیدا کنید همون سرچ کردن و خوندن خود مستندات نئوویم با دستور help:
یا از توی وبسایتشون کافی هست.
یه مشکل میمونه اونم یاد گرفتن ویم اسکریپت یا لوئا که این مشکل هم با ریموت پلاگینها حل میشه.
یعنی کافیه توی زبان برنامهنویسی مورد نظرمون یه کتابخونه که ارتباط ما با api نئوویم رو برقرار کنه رو پیدا کنیم (مثل pynvim) و همون کارهایی رو که به صورت دستی برای اجام پروسهی پلاگینمون انجام دادیم (اجرای دستورات، فراخوانی متودهای نئوویم، خواندن بافرها و ...) رو با استفاده از pynvim یا نمونههای مشابهش صدا بزنیم.
یا بریم lua یاد بگیریم، که هم آسون هست هم سریع کارمون رو راه میندازه و با دلایل قانعکنندهای به عنوان زبان اسکریپت نویسی اصلی نئوویم انتخاب شده.
نمونه پیاده سازی این پلاگین با پایتون و pynvim با روش پلاگین ریموت، که آرشیو شد. روی گیتهاب
نمونه پیادهسازی با lua : روی گیتهاب