קונפיגורציה של Vim
24 במאי, 2005

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

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

גרסאות של Vim קיימות לכל מערכות־ההפעלה הנפוצות. ptr*.

אין לי כוונה ללמד כאן Vim. הדרך הרגילה ללמוד אותו היא באמצעות הקלדת "help:" בתוכנה, ושימוש במנגנון ה־hypertext של ה־manual, שמדריך איך להשתמש ב־Vim, צעד אחר צעד. דוקומנטציה, כולל גרסת־online של ה־manual וגרסה אלקטרונית של ה־Vim book, אפשר למצוא כאן וכאן. מעבר לזה, חפשו ברשת; לא חסר מידע.
גם אין כל כוונה לסכם את ההיסטוריה של Vi - יש על זה מספיק טקסטים ברשת.

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

אז נתחיל.

איך לערוך את קובץ־הקונפיגורציה של Vim

הפתרון של Vim לניהול הקונפיגורציה שלו הוא מאוד UNIX־י באופיו: קובץ טקסט פשוט עם תחביר בהיר, ששמו מתחיל בנקודה (vimrc.) ונמצא ב־home directory של כל יוזר. ביוניקסים (כולל Mac OSX), כאמור, הקובץ נקרא "vimrc./~". ב־DOS ו־Windows הקובץ נקרא "vimrc_" ונמצא במקום שבו התקנם את Vim או בספריה המתאימה אצל היוזר שלכם (בגרסאות מאוחרות של Windows אמורה להיות איזו תמיכה בריבוי משתמשים).

בגדול, הפקודות שמופיעות בקובץ הן פקודות רגילות של Vim, שניתן להשתמש בהם גם מחוץ לקובץ־הקונפיגורציה, על־ידי הקשת ":" ב־command mode.

כדי להביא שינויים בקובץ־הקונפיגורציה לתוקף צריך להריץ עותק חדש של Vim, או להריץ את הפקודות ששונו ישירות ב־Vim.

פקודות־קונפיגורציה שימושיות

colorscheme

תחביר: [colorscheme [color scheme name.

ל־Vim יש מנגנון גמיש של צביעת־טקסט (syntax-highlighting). סכמת־הצבעים הדיפולטיבית נראית נורא. לכן, כדאי להחליף אותה למשהו יפה יותר. יש כמה יותר ממאה סכמות מוכנות, שניתן להוריד מ־vim.org (בנפרד, או בקובץ שמאגד את כולן). הסכמה שאני משתמש בה, ונראית מצויין עם מחשב שחור־כסוף, היא brookstream. היא מאוד ברורה, סולידית ו־1337־ית.

כדי להתקין סכמה חדשה בדרך כלל צריך פשוט להעתיק את הקובץ של הסכמה, פרוש, ל־vim/colors./~

בממשק הגראפי של Vim (בקיצור: gvim) ה־syntax-highlighting בדרך־כלל נראה הרבה יותר טוב מאשר בממשק הטקסטואלי. בממשק הטקסטואלי לא כל הגוונים מוצגים.

set encoding

תחביר: [set encoding=[encoding.

כשמופיע בקובץ־הקונפיגורציה, משנה את הקידוד הדיפולטיבי שבו Vim ישתמש. לכן, במידה ועיקר השימוש שלכם הוא ביוניקוד או ב־latin1 (האותיות הלטיניות הבסיסיות, וכמה נוספות), כדאי להוסיף לקובץ־הקונפיגורציה את השורה set encoding=utf-8.

כשפוקדים על Vim שינוי של הקידוד כשקובץ פתוח ברקע, הוא ימיר אותו לקידוד היעד. עם מעט עבודה אפשר לגרום ל־Vim לעבור על כל הקבצים בספריה, לדוגמה, ולשנות להם את הקידוד.

set guifont

תחביר: [set guifont=[font name\ size

כמו שהשם אומר: משנה את הפונט של ה־GUI, או קובע את זה ש־Vim ישתמש בו אם לא הוגדר אחרת (במידה והשורה נמצאת בקובץ־הקונפיגורציה).

התחביר הבסיסי בנוי משם הפונט, ואחריו גודל הפונט. כך, אם נרצה להשתמש בפונט "מרים מונוטייפ" של קולמוס בגודל 15, נכתוב set guifont=Miriam\ Mono\ CLM\ 15.

מיותר לציין שלהגדרה הזו אין כל השפעה על הקובץ עצמו: מעצם ההגדרה של עורך־טקסט, צורך ההצגה של הטקסט לא מכתיבה את האופן שבו הוא יכתב לדיסק.

set guioptions

משנה אפיונים של ה־GUI. קראו את 'help 'guioptions: בשביל לראות את כל האופציות.

שלוש אופציות שבהתקנה רגילה מופעלות ולא תמיד נוחות למי שמכיר היטב את Vim, מהסיבה הפשוטה שהן תופסות מקום על המסך (כשיש ארבעה frames של Vim על המסך ב־Ion, זה מתחיל להפריע):

אם משתמשים בצירוף MTLR, המראה הכללי של הממשק הגראפי של Vim נראה כמו זה של הממשק הטקסטואלי, אבל עם היתרונות שיש לממשק הגראפי: שיתוף clipboard עם תוכנות אחרות במערכת הגראפית, anti-aliasing לפונטים, צביעת־טקסט מדוייקת ואפשרות פשוטה להשתמש בפונט שונה מזה של הטרמינל.

set ruler

תחביר: set ruler או set noruler.

מוסיף לכל חלון של Vim קורדינטות מספריות של מיקום הסמן באותו החלון. זה שימושי כשעובדים מול רשימת שגיאות של קומפיילר, כשמצויינים מספרי־השורות (אגב, כדי לעבור למספר שורה n אפשר לכתוב n: ב־command mode), כשעובדים עם קבצים שמשמשים לאינפוט בתחביר מאוד מסויים, שתלוי במיקום בשורה או במספרי־שורות, או סתם להתמצאות במיקום בקובץ.

אינדנטאציה

[set shiftwidth=[n ו־[set tabstop=[n קובעים את מספר הרווחים המייצגים רמת אינדנטציה אחת ואת הגודל של tab אחד. מבחינה אסתטית, אני מעדיף את n=4. ההגדרה set noexpandtab חשובה כדי לשמור על המבנה של קובץ עם אינדנטציה אחיד בכל מחשב שתשתמשו בו, גם כזה עם n≠4.

set smartindent ו-set smarttab מאפשרים אינדטנציה אוטומטית, שתלויה בשפה שבה אתם עובדים; "שפה" במובן של שפת־סימון למחשב. זה מאוד נוח - Vim דואג לאינדנטציה במקומכם, ובדרך כלל עושה את זה לא רע בכלל.

set visualbell

מציג הבזק קצר על המסך כשמנסים לחרוג מעבר לגבולות שונים, כמו תחילת/סוף שורה/קובץ/רשימת הפקודות האחרונות.

map ו־imap

Vim מאפשר להריץ מאקרו בלחיצה על כפתור. כדי ללמוד איך לעשות את זה, תקראו את help map:.

דוגמאות להגדרות שאני משתמש בהן, שיכולות לתת דוגמה פשוטה למה שאפשר לעשות עם map:

abbreviate

תחביר: [abbreviate [original] [replace

אם הפקודה הקודמת מיפתה מקש מסויים במקלדת למאקרו קטן שהורץ, זו מחליפה, תוך כדי כתיבה, מילה נתונה (בלי רווחים) במאקרו נתון. אפשר להחליף את המילה addimg, נאמר, בתג HTML ריק להוספת תמונה, נאמר.
לביטול: unabbreviate.

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

עברית

אחרונות השארתי את ההגדרות שנוגעות לעברית.

הגישה של Vim לעברית שונה מזו של רוב התוכנות שתומכות ב־bidi. הגישה היא לא "WYSIWYG", אלא "WYSI מה שבאמת קיים מבחינת המחשב", שבה סדר התווים שמוצג על המסך הוא זה ששמור בקובץ ויכול להיות מוצג מימין לשמאל (ואז העברית "ישרה" והאנגלית "הפוכה") או משמאל לימין (ואז העברית "הפוכה" והאנגלית "ישרה"). על היתרונות שבשיטה הזו, ועוד על Vim ועברית, כתבתי ב־talkback כאן, תחת הכינוי Anonymous Coward. זה הרבה יותר נוח ככה, לפחות עבורי, בעריכה של קבצים שמשלבים קוד וטקסט באותיות לטיניות עם טקסט באותיות עבריות (כתיבה ב־LaTeX וב־HTML, בעיקר). אמנם במבט ראשון הטקסט נראה פחות קל לקריאה, כשחלק מהטקסט מופיע בכיוון הטבעי וחלק בכיוון ההפוך, אבל לעריכה של טקסט - שזה מה ש־Vim עוסק בו - זה יותר אפקטיבי. בכתיבה שכוללת רק מלל אנושי, בלי הוראות למחשב (קבצי טקסט פשוטים, לדוגמה), אולי יותר נוחה השיטה של ה־WYSIWYG.

כדי להחליף את כיוון הכתיבה, אומרים ל־Vim לעשות set invrl: ב־command mode. במידה ורוצים גם שהמקלדת תשתנה מאנגלית לעברית או מעברית לאנגלית, אם הגדרות המקלדת לא מוגדרות ברמת המערכת הגרפית, כדאי להגיד גם set invhk:. כדי ללמד את Vim לעשות את זה במקש אחד, להחליף את הכיוון שבו הוא מציג את הטקסט, נוסיף את השורה <map <F9> :set invrl<CR לקובץ־הקונפיגורציה. זה טוב אם אנחנו נמצאים ב־command mode. כדי להוסיף את האפשרות גם ב־insert mode נוסיף את השורה הבאה: imap <F9> <Esc>:set invrl<CR>a. כמובן שאת F9 אפשר להחליף במקשים אחרים, ואם נרצה להוסיף גם החלפה של שפת־המקלדת נצטרך להוסיף <set invhk<CR:.
כדי לכתוב בעברית הפוכה ("ויזואלית") או באנגלית הפוכה, במקום ה־invrl נכתוב invrevins. אני מניח שתוכלו לעשות לבד את ההיסק של האופן שבו מוסיפים בקובץ־הקונפיגורציה מיפוי למקש אחר שיעשה את זה...

לאיגלו יש דף שמסביר על התמיכה העברית ב־Vim.

הוספת תמיכה בעברית, במקרה שזו לא קיימת

(רוב הסיכויים הם שאם אתם לא מבינים מה כתוב בתת־הסעיף הזה, הוא לא רלוונטי עבורכם - יש לכם חבילה בינארית עם דו־כיווניות פועלת)

כנראה כדי ליצור קובץ בינארי קטן ומהיר יותר, Vim מתוכנן כך שהוספה של התמיכה בדו־כיווניות תלויה בקימפול עם הגדרות מיוחדות. ברוב החבילות הבינאריות Vim כבר מקומפל עם הפיצ'ר של הדו־כיווניות, אבל לא בכולן. כדי לבדוק אם יש לכם תמיכה בעברית נסו להריץ vim -H: אם Vim עולה, כשכיוון הכתיבה הוא מימין לשמאל, יש לכם תמיכה; אם מופיעה הודעת שגיאה - לא.

כדי להוסיף תמיכה עברית מקוד מקור, צריך להוריד את הקוד (מ־vim.org), לפרוש אותו איפשהו ולערוך את הקובץ src/feature.h באותו מקום בו פרשתם את הקוד (כך גם בענף 6, היציב כיום, וגם בענף 7, שבפיתוח). חפשו שורה שכתוב בה "rightleft Right-to-left editing/typing support+". מיד אחריה מופיעות שלוש שורות:

#ifdef FEAT_BIG
# define FEAT_RIGHTLEFT
#endif

הכניסו את ה־ifdef לקומנט. כלומר, החליפו את אותן שלוש שורות בשלושת השורות הבאות:

//#ifdef FEAT_BIG
# define FEAT_RIGHTLEFT
//#endif

עכשיו קמפלו כרגיל (configure, make, make install).

למשתמשי Windows: קובץ ההתקנה הבסיסי כולל תמיכה בדו־כיווניות, כך שאין לכם מה לדאוג מכך שמערכת־ההפעלה שלכם לא כוללת קומפיילר.

אני לא יודע מה המצב במקינטוש - האם הקבצים המקומפלים שאפשר להוריד מהרשת מכילים את הפיצ'ר של דו־הכיווניות. בכל מקרה, אפשר לקמפל לבד ב־Mac OSX. קבצים ומידע: Mac Vim.
עדכון (2006/10): התמיכה בעברית בממשק הגראפי במקינטוש, נכון לעכשיו, זוועתית. התמיכה בגרסה הטקסטואלית בסדר גמור. אפשר להריץ אותה תחת טרמינל שתומך ביוניקוד (דוגמת iTerm). למידע נוסף, ר' ptr*. אם יש למישהו דרך לגרום לממשק הגראפי לעבוד טוב עם עברית, אשמח מאוד לשמוע.
עדכון (2007/11): MacVim פותר את הבעיה. איזה כיף!
הדף ב־iusethis:


זהו. אני מקווה שהסברתי בצורה ברורה איך לקנפג את Vim, גם כדי ליצור סביבת־עבודה יותר נוחה ונעימה (כמובן שיש עוד המון דברים שאפשר לשנות ולהתאים) וגם בהוספה של תמיכה בעברית.
אם יש שאלות או צורך בעזרה, דואל או talkback... :-)

תגים