اختاپوس خسته

یادداشت‌هایی پیرامون کد، زندگی و دوستان

مشکل نیم‌فاصله در KDE و روش حل آن

قبلاً در مورد باگ بسیار بدی که در کیوت به‌وجود آمده بود و روش حل آن نوشتم. این باگ باعث میشد امکان نوشتن نویسه‌های کنترلی مثل نیم‌فاصله و تغییر جهت به‌طور کامل از بین بره. (اگر از نیم‌فاصله استفاده نمی‌کنید و یا نمی‌دونید تغییر جهت متن چه اهمیتی داره حتماً نویسه‌های کنترلی و جهت‌دهی متون فارسی/انگلیسی رو بخونید)

الآن با گذشت چند ماه باگ مربوطه برطرف شده و با نسخهٔ 5.9.1 منتشر شده. (تغیرات گریت برای ماژول qtbase اینجا و برای ماژول qtdeclarative اینجا قابل مشاهده هستند) خوشبختانه برنامه‌های کیوت دیگه مشکل سابق رو ندارند و هم توی ماژول widgets و هم توی ماژول جدیدتر Qt Quick مشکل به‌طور کامل برطرف شده. خوب حداقل من این‌طور فکر می‌کردم!

با به‌روز کردن سیستم به نسخهٔ جدیدتر الان از کیوت نسخهٔ 5.9.1 استفاده می‌کنم که خوب باگش برطرف شده. اما در کمال تعجب می‌بینم که هنوز نمی‌تونم توی محیط‌های متنی KDE مثل kate و یا kwrite فارسی بنویسم! اولش کلی گیج شدم. فکر کردم باگ برطرف نشده. با مراجعه به صفحهٔ گریت دیدم برطرف شده. ولی خوب kate هنوز نمی‌تونه نیم‌فاصله بنویسه. بعد فکر کردم شاید از نسخهٔ اصلاح‌شدهٔ کیوت استفاده نمی‌کنن، که دیدم این‌طوری هم نیست. آخرش با کیوت یه برنامهٔ ویجتی نوشتم و دیدم نیم‌فاصله به راحتی درج میشه. بعد به این نتیجه رسیدم که خوب حتماً مشکل توی ماژول Qt Quick اصلاح نشده، یه تست دیگه با QML نوشتم و دیدم اونجا هم مشکل نداره! خوب پس چرا kate نمی‌تونه نیم‌فاصله بنویسه؟

بعد از مطالعهٔ ده‌ها پکیج مربوط به KDE (از کتابخانه‌های libkf5 تا خود سورس kate ) بالأخره مشکل رو پیدا کردم. دقیقا مثل کیوت یک فیلتر برای حذف نویسه‌های غیر قابل چاپ از ورودی اضافه شده. خوب وقتی کیوت این ویژگی رو داشت چرا توسعه‌دهندهٔ KDE لازم دیده اضافه‌ش کنه؟ این رو باید از خود توسعه‌دهنده‌ها پرسید. بهرحال نویسندهٔ این سورس فرض کرده هیچ نویسهٔ یونیکدی که نمایش تصویری نداشته باشه شایستگی درج در متن رو نداره. مگر دو تا استثنا: tab و space. خوب من فقط نیم‌فاصله‌ها و کاراکترهای کنترل جهت رو به این استثنا اضافه کردم. با این پچ مشکل من در KDE به‌طور کامل حل شد. اما مطمئن هستم کسانی که توی کشورهای دیگه زندگی می‌کنند و نیاز به درج کاراکترهای خاص‌تری رو دارند همچنان مشکلاتی خواهند داشت. کار بهتر می‌تونه حذف کامل این فیلتر و پیاده‌سازی منطق مربوطه به شکل دیگه باشه. چند ماه آینده شاید بتونم وقتی پیدا کنم که این کار رو انجام بدم. فعلاً اما این پچ کار رو راه می‌اندازه. مراحل قدم‌به‌قدم و پچ نهایی در ادامه نوشته شده.

رفع باگ

محیط کاری من KDE (نسخهٔ اوبونتو 17.10) هست. اگر از توزیع‌های دیگهٔ مبتنی‌بر دبیان یا خود دبیان استفاده می‌کنید مراحل کار تقریباً مشابه خواهد بود.

اول باید پکیج‌های زیر رو نصب کنید. این‌ها اسکریپت‌های کمکی برای ایجاد و تغییر محتوای پکیج‌های deb هستند.

1
$ sudo apt install quilt devscripts

تعداد زیادی از پکیج‌های توسعهٔ KDE و کیوت رو هم نیاز خواهید داشت. من لیست معقولی از این پکیج‌ها رو پایین آوردم، اما خوب کامپایلر و باقی پیش‌نیازهای بدیهی رو فرض کردم که از قبل نصب کرده‌اید:

1
2
3
4
5
$ sudo apt install debhelper extra-cmake-modules libeditorconfig-dev
libgit2-dev libkf5archive-dev libkf5config-dev libkf5guiaddons-dev
libkf5i18n-dev libkf5iconthemes-dev libkf5kio-dev libkf5parts-dev
libkf5sonnet-dev libkf5syntaxhighlighting-dev libqt5xmlpatterns5-dev
pkg-kde-tools qtdeclarative5-dev qtscript5-dev

در مرحلهٔ بعد شما باید پکیج سورس کتابخانه‌ای رو دانلود کنید که شامل ادیتورهای متنی فریم‌ورک KDE هست. برای این کار:

1
$ apt source ktexteditor

بعد محیط رو برای ایجاد تغییرات (مثل قبل) آماده می‌کنیم:

1
2
3
4
$ cd ktexteditor-5.38.0/
$ export QUILT_PATCHES=debian/patches
$ quilt push -a
$ quilt add ./src/document/katedocument.cpp

بعد فایل ‪./src/document/katedocument.cpp‬ رو تغییر میدیم و فیلترهای مربوطه رو اضافه می‌کنیم. و یا می‌تونید از پچی که پایین نوشتم استفاده کنید.

در نهایت (بازم مثل قبل) کامپایل و نصب پکیج رو انجام میدیم:

1
2
3
4
$ quilt refresh
$ quilt pop -a
$ DEB_BUILD_OPTIONS=nocheck debuild -us -uc -b -j10
$ sudo debi

در ادامه شما می‌تونید از تایپ فارسی در محیط متنی KDE و هر برنامه‌ای که از اون استفاده می‌کنه (مثل kate) لذت ببرید (:

وصله

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
----    2017-12-18 16:53:03.435719378 +0330
+++ 
/home/soroush/workspace/kate-bugfix/ktexteditor-5.38.0/src/document/katedocument
.cpp  2017-12-18 16:50:09.000000000 +0330
@@ -2904,8 +2904,7 @@
     const auto realUcs4Chars = realChars.toUcs4();
     QVector<uint> ucs4Chars;
     Q_FOREACH (auto c, realUcs4Chars)
-        if (QChar::isPrint(c) || c == QChar::fromLatin1('\t') || c == 
QChar::fromLatin1('\n') || c == QChar::fromLatin1('\r')
-            || (0x2000 <= c && c <= 0x200F) || (0x2028 <= c && c <= 0x202F) ) {
+        if (QChar::isPrint(c) || c == QChar::fromLatin1('\t') || c == 
QChar::fromLatin1('\n') || c == QChar::fromLatin1('\r')) {
             ucs4Chars.append(c);
         }

مشکلات باقی‌مانده

چند تا مشکل کوچیک هنوز هست که باید برطرف بشه. یکی این که تمام نویسه‌های فیلتر شده، شمرده نخواهند شد. یعنی اگر شما مثلا بنویسید «ل» بعد یک نیم‌فاصله بزنید، و بنویسید «م»، نیم‌فاصله اون وسط جا می‌گیره. اما اگر یکی به عقب برگردید و Backspace بزنید، هم نیم‌فاصله و هم «ل» پاک میشن. خیلی باگ بدی نیست. این هفته سعی خواهم کرد این رو هم درست کنم.

دیدگاه‌ها