שפה אדפטיבית: התאמת מצב המקלדת לשפה בנקודת העבודה

אתה כותב מסמך בעברית. במקביל, אתה מתכתב עם אנשים אחרים באימייל באנגלית, מכין מצגת הכוללת אנגלית, או מוסיף בגוף המסמך הפניות באנגלית. אתה חוזר למקום במסמך בו כתבת עברית, ובמקום עברית, יוצא אותיות אנגליות: במקום "שלום" יוצא לך "akuo". כמה זמן אתה מבזבז מפני ששכחת לחזור למוד עברית?

תרחיש

אתה כותב פיסקה בעברית, ובתוך הפיסקה אתה מכניס מילה באנגלית. לאחר מכן, אתה מבקש להמשיך בעריכת טקסט בעברית, אבל שוכח לחזור למוד עברית. מה קורה?

הבעיה

על טעויות צריך להיענש. לא? כך נוהגים לטעון תכנתי מחשב רבים, במיקרוסופט ובשאר העולם.  לא אני המצאתי את זה. מי שלא מאמין, יכול לקרוא את הספר הקלאסי של Weinberg, משנת 1971.

http://www.dorsethouse.com/books/psy.html . כך, לטענתו, נוהגים תכנתים להצדיק את העובדה שלא מנעו ממך את הטעות מלכתחילה.

הפתרון

כיצד ניתן למנוע את הטעות? על ידי ניתוח תרחישים. ב-90% (הערכה) מהמקרים, כשאתה מצביע לתוך טקסט, אתה מתכוון להקליד באותה שפה בה כתוב הטקסט.  נדיר מאוד שתרצה לשבור מלה בעברית ולשלב בתוכה ספרות או אותיות לועזיות. וכשאתה מצביע בין מלים בעברית, בדרך כלל הטקסט שתוסיף בין המלים יהיה אף הוא בעברית. אם תרצה להחליף לאנגלית, תהיה מודע לכך, ולא תשכח בדרך כלל להחליף למוד אנגלית. פתרון הבעיה הוא על ידי התאמת השפה אוטומטית לקונטקסט. כתבת אנגלית, הצבעת לתוך טקסט בעברית, השפה עוברת אוטומטית למוד עברית.

הישום הפשוט

מספר גירסאות של MS-Word כוללות אופציה להתאמה אוטומטית של המקלדת לשפה. הפתרון הפשוט הוא על ידי בחירה באופציה Auto-keyboard switching  שנמצאת במסך האופציות (זמין באמצעות תפריט Tools/Options). משום מה, אופציה זו אינה נמצאת בדף Complex Scripts, שכולל אופציות אחרות בנושא שפות דו-כיווניות, אלא בדף ,Edit ולכן לא כל כך שמים לב אליה. כאשר שינוי השפה נעשה אוטומטית על פי הקונטקסט, הצורך לשנות את השפה ידנית יורד עשרות מונים, והשיטה של מיקרוסופט, ככל שהיא מעצבנת, כבר לא כל כך מציקה.

 

טוב לדעת שמישהו במיקרוסופט חשב על הבעיה והציע פתרון, אבל חבל שהוא לא הצליח לשכנע את מקבלי ההחלטות שם שהאופציה הזו תהיה ברירת המחדל, ולכן אנחנו נאלצים לחפש בעצמנו את האופציה שתקל את חיינו.

 

הישום המורכב

אם גירסת MS-Word שברשותך אינה כוללת אופציה זו, עדיין ניתן לפתור אל הבעיה בעזרת שני קבצי Visual Basic אותם ניתן ליבא ל-Macro Editor, לאחר שהורדו מאתר זה: EventClassModue.cls ו- Bidi.bas, מה עושים? פותחים מסמך MS-Word, פותחים את ה-Macro Editor בעזרת תפריט Tools/Macro ומייבאים את הקבצים בתפריט File/Import File

הסבר

באופיס, קוד ה-ASCII של האותיות העבריות הוא 63. למה? אין לי מושג. למרות שקראתי כבר מספר מאמרים על היוניקוד, עדיין לא הבנתי מה ולמה. נשגב מבינתי. מכל מקום, בהנחה שהתצפית הזו מהמחשב האישי שלי ישימה גם למחשב שלכם, המקרו שעושה את העבודה זהו המקרו הבא:

Sub AdaptCursor()

  Context = Selection.Characters(1).Text
  If Asc(Context) = 63 Then ' Hebrew
    Application.Keyboard (1037)
  ElseIf (Context >= "A") And (Context <= "Z") Then
    Application.Keyboard (1033)
  ElseIf (Context >= "a") And (Context <= "z") Then
    Application.Keyboard (1033)
  ElseIf (Context >= "0") And (Context <= "9") Then
    Application.Keyboard (1033)
  End If
End Sub

 

הביטוי Selection.Characters(1).Text מתייחס לתו שמקומו אחרי הסמן (משמאל לו בעברית, מימין לו במספרים ובאנגלית). לכן המקרו בוחר את השפה על פי קוד ה-ASCII של ביטוי זה.

הקטע הבעייתי הוא להפעיל את המקרו. הדרך הפשוטה להפעיל מקרואים, כפי שהודגמה בדוגמאות הקודמות, היא על ידי הפעלה במפורש, בעזרת מקש בסרגל הכלים או בעזרת מקש קיצור. במקרה שלנו, אנחנו מעוניינים שהמקרו יופעל אוטומטית בכל מקרה של הצבעה בעזרת העכבר, וכן במקרה של הזזת הסמן בעזרת לוח המקשים. הדרך של Visual Basic לזהות ארועים כאלו היא על ידי איבחון שינויים במצב של האובייקט Selection. ולמזלנו, Visual Basic מאפשר לנו להגיב לשינויים הללו, ולהפעיל מקרואים מתוצרת בית כתגובה לפעילות הקשורה לעריכת טקסט.

 

ויז'ואל בייסיק מאפשר לנו להפעיל פונקציה משלנו בכל פעם שהמשתמש משנה את הטקסט שנבחר על גבי המסך. זאת, על ידי הפונקציה  WindowSelectionChange. בפועל, כל שינוי במיקום הסמן נחשב כשינוי בטקסט שנבחר, ולכן כל שינוי במיקום הסמן יכול להפעיל פונקציה זו. הדרך של Visual Basic להפעלת פונקציות בתגובה לפעולה של המשתמש היא על ידי הפרדת קוד המקרואים לשני קבצים. כדי שויז'ואל בייסיק יוכל להפעיל פונקציה זו בשינוי טקסט, אנחנו צריכים להגדיר אותה ב-Class Module שנקרא EventClassModule, ולהכריז (ולשריין מקום) על משתנה ממחלקה זו.  קטע הקוד הבא עושה את העבודה:

 

Private Sub app_WindowSelectionChange _

  (ByVal Sel As Selection)

  SelLenght = Selection.End - Selection.Start
  If SelLenght = 0 Then
    AdaptCursor

  End If

End Sub

מקרו זה מופעל אוטומטית בכל ארוע של המשתמש. בכל מקרה שהמשתמש הצביע מבלי לסמן קטוע, המקרו מפעיל את הפונקציה שמבצעת את החלפת השפה לכעיל.

 

כעת, מה שנשאר זה להגיד ל-Visual Basic מתי לאפשר למקרו זה לפעול, ומתי למנוע ממנו לפעול. Visual Basic מחייב תהליך של רישום. בכדי להתחיל בתהליך המעקב, עלינו "לרשום" את המשתנה בעזרת הפקודה Set. לדוגמא, אם הכרזנו על המשתנה בשם EventModule, אז פקודת הרישום תהיה:

Set EventModule.App = Application

פקודת הרישום היא:

 

Set EventModule.App = Application ' Event Registration

 

כאשר EventModue זהו השם שאנחנו בחרנו להעניק למודול התוכנה שקולט את הארועים ומגיב להם. ההכרזה על שם המודול היא בפקודה הבאה:

 

Public WithEvents App As Word.Application

 

ההגדרות של EventModule מופיעות בקובץ (EventClassModue.cls)באתר. ניתן ליבא קובץ זה ו-Visual Basic יודע לשמור אותו במקום.

 

כעת, מה שנשאר לנו זה להפעיל את פונקצית הרישום (Set). בדרך כלל נרצה שהרישום יהיה אוטומטי, בכל פעם שאנחנו פותחים מסמך. (אלא אם כן יש באג בקוד שמשגע אותנו). הדרך להפעלה אוטומטית של מקרואים היא על ידי מקרו עם שם יחודי - AutoExec. עלינו לבנות מקרו עם שם זה, ולבקש ממנו לרשום עבורנו את תהליך ניהול הארועים. מקרו זה נמצא אף הוא בקובץ

 (Bidi.bas) באתר זה.