Vim - מדריך עברי למתחילים

Alonisser ,21/08/2013

הקדמה: למה Vim?

  1. כי זה הסטנדרט. ולפעמים תמצאו את עצמכם צריכים לערוך משהו ישירות על שרת לינוקס מוקשח עם Haiku edition, בלי x-windows (כלומר ממשק משתמש גרפי חלונות) ותרצולמות כי כלום לא יעבוד חוץ מVim, שכאמור, הוא הסטנדרט שמותקן בכל מקום.
  2. כי יש סיבה שזה הסטנדרט – הפרודוקטיביות המרשימה בעריכת וכתיבת קוד מקור ע"י משתמשי Vim מקצועניים.
  3. כי זה קוד פתוח וחופשי במובנים העמוקים של המילה, כי זה לא דורש להיות כבול לכלי ספציפי עם אקוספרה ספציפית שטובה רק למשהו ספציפי (מישהו אמר Webstorm שמגרילים רישיונות שלו בכל אתר ומפגש?), לכזה שדורש רישיון וכסף או לכזה שהמפתח יעלם מחר בבוקר.
  4. כי מצאתי את עצמי משקיע כל כך הרבה זמן ומאמץ בניסיון לעקוף את Vim כך שההשקעה בללמוד אותו נראתה לי פחותה. דוגמה מובהקת: שכחתי לצרף commit message בGit והופ נפתח מסך שחוץ מהקשות היסטריות בתקווה שמשהו יעשה "יציאה", לא הצלחתי לעשות בו כלום עד שהתייאשתי, סגרתי את חלון הטרמינל והתחלתי מחדש, כולל לאתחל את הVirtualenv ושאר כלי הפיתוח. בשלב מסויים למדתי להתקין במחשבי הפיתוח השונים שאני עובד עליהם את Gitpad מבית Github שמחליף את עורך ברירת המחדל של הcommit לNotepad. רק ש.. אז "רק הרצתי משהו" על מחשב של חבר ונתקעתי שוב באותה סיטואציה, ובכלל התלות בעוד כלי שצריך להתקין (וברוך השם יש הרבה להתקין גם ככה) על מחשבי פיתוח היא מבאסת. בקיצור תהליך, מבאס ודי דבילי כי יכלתי בשתי מקשים לצאת ו/או לכתוב Commit message ו/או לעוף לירח (וראו "זה הסטנדרט")
  5. כי הוא משחק יפה עם שורת הפקודה, ואם אני עורך וכותב תוכנה משורת הפקודה אני לא רוצה להצטרך להרים את היד לעכבר ואז מהממשק הגרפי לנווט חזרה לתיקייה שבה אני עובד. למשל שאני רוצה לעשות ככה: touch script.py && chmod 775 script.py && vim script.py
  6. כי אתם יודעים שמתכנתים הם "עצלים, חסרי סבלנות ומלאי היבריס" ואין כמו ללמוד vim בשביל להדגים היבריס.

vim

להתקין VIM

יש הוראות ברורות לכל הפלטפורמות באתר שלהם. ממליץ לחלונות ולינוקס להתקין gvim שנותן ממשק גרפי קצת נחמד יותר (ושכל הקסטום שלו משותף עם גרסת הטרמינל). אבל יש גם גרסה קצת יותר מקלה בשם Cream.

מה זה Vim?

Vim הוא עורך טקסט למתכנתים. יש לו גרסה עם Gui בשם Gvim וגרסת טרמינל. יש לו פורט לכל מערכת הפעלה קיימת כנראה (בהתחשב בזה שהפיתוח שלו התחיל בAmiga) והוא הסטנדרט לעריכת טקסט למתכנתים (אם פיספסתם את הנקודה).
ש: "הי, אבל שמעתי שEmacs הוא טוב יותר"
ת: אם מסובך יותר זה טוב יותר אז באמת יכול להיות. אבל אני חושב שבXkcd ענו על זה טוב יותר לפני:

Real programmers

אבל מי אני שאקבע? אתם יכולים ללכת גם עם Emacs. עקומת הלמידה היתה נראית, בשבילי לפחות, קשה מדי. מניח שאם אתם Lispers אז emacs הליספי הוא ברירת המחדל שלכם גם ככה.

איך מתחילים?:

יהודה כץ – מפתח שאחראי על Ember וsproutcore וcore dev בjQuery, rails ועוד כתב פוסט מצויין על "איך כל מי שניסה לשכנע אותי לעבור ל Vim טעה" ועל הקושי שלו לעבור לvim בדרך שהVim masters ממליצים עליה. וגם על איך הוא כן עבר בסופו של דבר ומה עבד בשבילו. רמז – ליהודה כץ אשכרה יש עבודה וזמן מוגבל לעקומת למידה קשוחה ועל כן הוא לא יכול להרשות לעצמו להיות "טהרן" ולהתעקש על מתודות שמאיטות משמעותית את הפרודקטיביות שלו. אז בהמשך לעצה של יהודה כץ, אם אנחנו מתחילים בVim עדיף לא להיות דוגמטי, לשכוח מהעכבר ומתנועה עם החיצים וכו', להשתמש בplugins מקילים כמו janus ולדעת שאם לא נעבוד עם זה בפועל נתקשה להתקדם. אני אגב גיליתי שהמתודה "הקלאסית" (לשכוח את העכבר, החיצים וללמוד את הכל מחדש) יחסית עובדת עבורי, אבל אם ליהודה כץ זה לא עובד, אז מי אני כאזוב קיר, אומר.

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

"נפתח vim (או Vi האח הקטן והמפגר) שלא הכנסנו commit message ולמרות שניסינו לכתוב לא הצלחנו לעשות כלום" וואלה, זה נכון. כי Vim נפתח בNormal mode שהוא גם מצב האב של "מצב פקודות – command mode". רק שהמצב "הנורמלי" הוא ממש לא נורמלי למי שהתרגל לעבוד בעורך טקסט בשלושים השנים האחרונות. אז מה הם המצבים של Vim? 1. המצב ה"נורמלי"" שבו **אי אפשר להקליד טקסט אלא רק לבצע פעולות על הטקסט המוקלד כבר. איזה פעולות? למשל: ניווט, החלפה, חיפוש, מחיקה, הדבקה, פתיחת וסגירת קובץ וכו'. מהמצב הנורמלי תוכלו לכתוב : ולדברים אחרים / ותכנסו למצב פקודה בשורה שבתחתית העורך. בפוסט הזה אתייחס ל: כחלק מהפקודה (אם כי זה לא מדוייק)
2. **מצב "עריכת טקסט". שאליו תוכלו להכנס עם a לעריכה אחרי הטקסט או i לעריכה לפני הטקסט. לחזור למצב פקודות תוכלו עם esc או עדיף עם Ctrl+[
3. יש לVim גם מצב בחירה ויזואלי (שתכנסו אליו עם.. נכון: v) ומצב בלוק- ויזואלי, אולי הדבר הכי דומה לגזור/הדבק בעורך טקסט רגיל שבו גם יש מקום לעכבר ועוד. אבל נתחיל מזה.
אז לסיכום המצבים, כדאי לדעת ש i או a יקחו אותכם למצב עריכה (כן, זו כפירה לכתוב את זה ככה, אבל זה פשוט) וesc חזרה למצב פקודה. ועם :q תוכלו לצאת. הדבר השני והמוזר בVim הוא הניווט.

מקשי הניווט הבסיסים בvim (שפועלים כמובן במצב הנורמלי ולא במצב עריכה, עוד משהו להתרגל אליו) הם הצירוף המוזר משהו של h,j,k,l. שh זה שמאלה (כי שמאל מכולם), l זה ימינה (ובניגוד למילה left שמתחילה בו..) j למטה (כי הוא לכאורה מזכיר חץ למטה) ו k למעלה.
אגב, ברוב המקרים (אלא אם אתם בvi, או בcompatible mode אליו) גם החיצים הרגילים יעבדו, אבל אומרים שצירוף ברירת המחדל הוא צירוף המקשים המהירים ביותר לניווט, אז שווה להתרגל אליו.
אז עד כאן התמודדות עם הפחד הראשוני מvim ואם הגעתם לפוסט הזה בניסיון נואש לצאת ממצב פקודות שנקלעתם אליו אז הנה הפתרון. עכשיו ננסה לחפור קצת יותר.

Vimtutor – ללמוד Vim 101

נקודת פתיחה טובה לvim היא פשוט להריץ את קובץ vimtuter משורת הפקודה. אם במקרה ההתקנה לא צירפה את vim לPath שלכם אז הוא נמצא בספריית vim. בעצם מדובר בקובץ טקסט (שאפשר גם לפתוח ישירות, הדבר היחידי שהקובץ עושה הוא לייצר אותו כעותק, כדי לא לדרוס את המקור) שמכיל הדרכה בסיסית, אבל מקיפה ונותנת התמצאות ראשונית לVim. מדובר על בערך שעה. כולל לבצע את התרגילים וכו'. אחרי זה יהיה לכם מושג מה אתם עושים.
עוד אופציות טובות להתחלה הם מדריכי הוידאו המומלצים האלו כמו גם שתי ניסיונות (אחד מהם בתשלום אחרי כמה רמות) למשחק את לימוד vim. vim adventures והמדריך האינטראקטיבי לvim.

פקודה – מספר – תנועה

זה הריקוד הבסיסי של עריכת טקסט בVim וחלק משמעותי מהכוח שלו. להרבה מהפקודות עריכה (למשל מחיקה: d) יש אפשרות לביצוע בצירוף תנועה. מה זו תנועה? תנועה היא מקש ניווט בתוך הטקסט כמו שלמדנו עליו מקודם. למשל dw - מחוק את המילה הבאה. או cw ערוך טקסט להחלפה של המילה הבאה. ומה שייך המספר באמצע? כאמור, הוא לא חובה, אבל הוא מאפשר לקבוע כמה פעמים לחזור על הפעולה. מה שמאפשר לדייק בחירת/עריכת/מחיקת טקסט היישר מהמקלדת, בלי שימוש מסורבל בעכבר. כך למשל: d5w ימחוק את 5 המילים הבאות ו y5w יעתיק אותן.
נוכל גם להשתמש ב5w בלי פקודה רק כדי לנוע 5 מילים קדימה.
אני לפחות (ואולי זה אומר משהו עלי?) מוצא משהו כיפי ביכולת להתייחס לתנועה בטקסט כ"מיני סקריפט" כמעט.

לקסטם לקסטם לקסטם:

.vimrc (או _vimrc בחלונות) היא התוכנית (שאמורה להיות בתיקיית Home שלכם) היא הקובץ שבו משנים ומגדירים את "הכל" בvim. הרבה מהפקודות שאתם יכולים להריץ ב"מצב פקודות" אפשר פשוט לכתוב ב.vimrc (כמובן בלי : לפני). יש טוטוריאל מובנה בvim לקנפוג הראשוני בהרצה של הפקודה :help vimrc וגם example שאפשר פשוט להעתיק. אפשר גם להשתמש באחת מהאופציות "האולטימטיביות" עד שתרגישו יותר בבית לכתוב אחת כזו בעצמכם. אחרי שתרגישו קצת יותר בבית תגלו שיש המון מפתחים ששומרים את הDot files שלהם בGithub. אפשר לעיין ולהתרשם. (מנהג שימושי שעוברים בין מחשבי פיתוח, סביבות vagrant וירטואליות ועוד).
עוד מקור יכול להיות בvimbits אתר שמציג ומדרג snippets של vimrc. יש עוד עולם שלם של קסטום Vim, כולל יקום חלופי של פלאגינים, קבצי .before_vimrc ו.after_vimrc ושפת תכנות בשם vimscript שמאפשרת ליצור את הפלאג ינים, סקריפטים וכו'. נשאיר את זה למדריך מתקדם יותר.
הפנייה ראשונית לפלאגינים מומלצים (ועל כל אחד כזה יהיה ויכוח) יש במדריכי הוידאו של Nettuts.
לפני הכל מומלץ להתקין את Pathogen מבית Tim pope מפתח הplugins הסופר פורה לvim (מהר מאוד תתמכרו אליהם). Pathogen או אחיו הגדול Vundle מאפשרים התקנת plugins פשוטה לVim.

רגע של עברית

השימוש בעברית בVim הוא לא חוויה מענגת. נכון, זה עובד קצת יותר טוב מSts2 המהולל והאהוב, אבל עדיין חוויה "קצת" מפוקפקת. יש אפשרות לעשות :set למצב מימין לשמאל שיציג את העברית (אך לא האנגלית) נכון. אבל כל עוד אנחנו בעברית קיצורי המקלדת לא ממש יעבדו לנו. בכל מקרה הנה ההמלצות מויקיפדיה לvim בשפת הקודש ויש גם hspell לאיות אם תתעקשו.

Vim כIde

Vim הוא עורך טקסט למתכנתים. זה בא לידי ביטוי בכמה מקומות מעבר לפרודקטיביות של עריכת טקסט מהירה במיוחד. בראש ובראשונה בSyntax highlighting (שיש מובנה לרוב שפות התכנות, ולאלו שלא באות מובנה, סביר שמישהו כבר כתב כזה, כי זה אחד הדברים הראשונים שמתכנתים מקצועיים שמפתחים שפה עושים. גם אם לא, אתם יכולים לכתוב כזה בVimscript לשפה שהמצאתם זה עתה). אבל גם בקבצים שמלמדים את vim להתייחס לקונווציות העריכה של שפות שונות. אפשר לבחור סינטקס ספציפי ולעקוף את ברירות המחדל. אפשר גם לציין לvim להתייחס לקובץ שטרם נשמר, או שהוא לא זיהה אוטומטית כסינטקס מסויים. יש כמובן גם פלאגינים ייחודיים לכל שפה שמוסיפים השלמת טקסט, איתור שגיאות, קמפול, התייחסות לקונוונציות מסוימות (pep8 בפייטון למשל) ועוד. בגדול, לפני שאתם כותבים שורה בVimscript תחשבו לעצמכם, שכמה מיליוני מפתחים בעשרות השנים האחרונות כבר בטח ניסו לעשות מה שאתם עושים עכשיו ומישהו מהם טרח וכתב את הסקריפט הזה לפניכם, או שהפקודה בכלל מוטמעת בVim, שווה לגגל.

Vim למגניבים

או – איך נעשה שזה יראה קצת יותר כמו Sublime Text 2?

vim set background=dark  
colorscheme monokai  
set guifont=Ubuntu_Mono:h12 
"need to install ubunto fonts from:fonts.ubuntu.com

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

buffers, טאבים וחלונות

הכנסו לשורת הפקודה ופתחו קובץ טקסט עם vim:

vim textfile.txt

כעת, בקובץ שיפתח בצעו כמה פעולות עריכה ואז ממצב הפקודה הקישו

:e anotherfile.txt

והופ - נפתח קובץ חדש! אבל הי ? איפה הקובץ הקודם שעבדנו עליו? מה קרה לו? אם נכנס לשורת הפקודה בvim ונכתוב:

:buffers "או גם 
:ls

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

:buffer 2 "בשביל להכנס לבאפר מספר 2 
" או לחילופין:
 :b 2

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

:tabe newfile.txt "this would go for a new tab

אבל אין קשר הכרחי בין בפארים לטאבים. יכולים להיות באפרים שלא מוצגים באף טאב/חלון כרגע ויכולים שתי טאבים להציג את אותו באפר.

על חלונות (שיכולים להתפצל לאורך או לרוחב) תקראו כבר לבד..

והנה הסבר טוב יחסית למה זה buffers ומה ביניהם לטאבים, חלונות ועוד ומשם גם תמונה מממחישה:

תמונת אילוסטרציה: טאבים, באפרים וחלונות

]16 תמונת אילוסטרציה: טאבים, באפרים וחלונות

Vim לקצת יותר מתקדמים

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

Vim, במקום סיכום

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


Vim בקיצור – נספח לטובת קוראינו העצלנים וחסרי הסבלנות לטקסטים ארוכים באנגלית:


הנה תקציר, מעבר למה שכתבנו קודם.

ניווט בטקסט.

מעבר לשימוש ב h,j,k,l הסטנדרטי, vim מאפשר להשתמש בטקסט עצמו לניווט. הפקודות המרכזיות לתנועה קשורות בטקסט עצמו. w למילה הבאה, b לתחילת המילה או לקודמת, e לסוף המילה (וגרסאות הקפיטל של כולן יעשו משהו דומה, אך קצת שונה). יש עוד המון פקודות כאלו (ועוד המון צירופים שיושבים על הפקודות) אבל זה בסיס. כדאי לשים לב שvim מתייחס שונה לאות/טקסט שהוא מזהה כמילה/מילה בלי הרווחים וסימני ניקוד/משפט/שורה/שורה אמיתית (שיש בסופה סימן "שורה חדשה") ויש לו פקודות בהתאמה לכל אחד מהמקרים (ובטח גם לעוד כמה)

איפה אני

לחיצה על הצירוף ctrl-g תגלה במהירות באיזו שורה וטור אני נמצא. לחיצה למשל על 45G תיקח אותי לשורה 45. שעה ש gg יקח אותי לסוף הטקסט וG להתחלה שלו

החלפת טקסט

`\r `\`` מאפשרת להחליף את האות שאתם עליה באות אחרת. אבל גם בלהכניס טקסט מbuffer כזה או אחר
בשביל החלפה גדולה יותר נשתמש ב c
לא עובדת בפני עצמה, אלא יחד עם תנועה. כך למשלcw יאפשר לנו עריכה מחליפה של המילה הבאה.

מחיקה

x מוחק את האות שמתחת לסמן. d הוא פקודת מחיקה (וגם העתקה לregister בעצם) מלאה שצריכה להתלוות אליה גם פקודת כיוון. למשל dw ימחוק עד המילה הבאה וd$עד סוף השורה. לחסרי הסבלנות יש גם dd שימחוק שורה שלמה. אגב, כל פקודות עריכת הטקסט בכפול יבצעו פעולה על שורה שלמה. למשל yy יעתיק שורה שלמה.

בצע שנית

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

חיפוש

/searchword אחרי זה . יש גם אופציות (שתוכלו לחפש בקלות בvimrc של הארת הטקסט שמחפשים וחיפוש אינקרמנטלי, כזה שמציג את תוצאות החיפוש תוך כדי כתיבה. בשביל לעבור לתוצאה הבאה תוכלו לנוע עם n או למעלה N.

חיפוש והחלפה

/s/old/new הוא הנתיב הנכון לפעולה, כל השאר דומה לחיפוש כולל n וכו.

גזור/העתק/הדבק

בעצם מחיקה עם d היא גזירה, לא מאמינים? הקלידו את הפקודה :registers ותקבלו כל מה שנמחק לאחרונה. אם נרצה רק להעתיק נוכל להשתמש בy, קיצור של Yank, הביטוי הוימי להעתקה (עם איזו וריאציה שלא הבנתי). להדבקה נשתמש בput או בקיצור p. שנוכל גם להדביק רגיסטר ספציפי שנגזר עם שמו pa למשל להדביק את מה שבregister עם השם a.

יציאה/שמירה/פתיחה

:q היא פקודת היציאה. אפשר גם לאכוף יציאה גם אם לא שמרנו שינויים (או לא שינינו כלום) עם :q!. :w היא פקודת write out – כלומר שמירת הטקסט. אם הקובץ הוא ללא שם נתבקש לתת לו שם כעת. אם כי אפשר כבר בפקודה :w somename. בשילוב עם היציאה אפשר :wq שמתרגם ל"שמור וסגור" בשביל לפתוח קובץ חדש מתוך העורך (כי מחוץ לעורך אפשר פשוט לקרוא vim somefile) נשתמש ב:e קיצור לedit. ולאחריו שם הקובץ. טריק מעניין הוא שvim תומך בכל השלמות שורת הפקודה (עם tab) כך למשל שאפשר לנווט את הPath לקובץ שאנחנו רוצים, עם מעט מאוד קליקים.

Undo!

u יבצע את רצף הundo הרגיל ו ctrl-r את הredo. שימו לב שU (עם קפיטל) זו פקודה אחרת לגמרי שעושה "כאילו" undo לשורה שלמה. אפשר לעשות לה Undo עם u.

הרצת פקודות מהטרמינל

:! commandname יפתח מסך טרמינל ויריץ את הפקודה שהרצנו. האפשרות הזו פותחת בפנינו גם עוד אופציית Debugging מעניינת. כי אפשר גם להשתמש בטקסט שהוא הפלט של פקודת הshell שהרצנו ישירות לתוך vim . כך למשל נכניס את הפלט של פקודת ls לתוך הקובץ שאנחנו עובדים עליו במסך: :r !ls וזה כמובן רק רמז קטן לאפשרויות. אפשר לדוגמא גם להריץ פקודת shell, כמו sed, grep, sort וחברים נוספים על הטקסט בתוך vim ולהוציא פלט לBuffer אחר.

עריכה לפני

אופציה מובילה אחת של מצב עריכה – לחיצת i. תכניס אותכם לInsert mode לפני הטקסט שהסמן עליו. אם תלחצו על I (capital i) לעומת זאת תכנסו למצב עריכה לפני הסמן ובתחילת השורה.

עריכה אחרי

האופציה המובילה השנייה של מצב עריכה – לחיצת a (מ - Append) תכניס אותם למצב עריכה אחרי הטקסט שהסמן עליו. גם כאן גרסת הA תעשה אותו דבר אבל בסוף השורה. אפשר גם להשתמש בo בשביל להתחיל שורה חדשה אחרי מיקום הסמן ובמצב עריכה או O בשביל לעשות את זה לשורה לפני השורה הנוכחית ובמצב עריכה.

ויש גם cheetsheet

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

תגובה