• בלוג
  • סניפטים לעניים ב-וים

סניפטים לעניים ב-וים

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

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

1. פונקציית vim להוספת snippet

הפונקציה המרכזית שנצטרך נקראת ExpandSnippet ומטרתה לקחת מילה קצרה ולהחליף אותה בקטע קוד שהכנו מבעוד מועד. למשל נוכל להחליף את המילה vim במשפט "the best text editor".

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

את הפונקציה נפעיל באופן אוטומטי כל פעם שלוחצים על Tab באמצעות הפקודה inoremap.

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

let g:snippets = {
      \  'vim': 'the best editor',
      \}


function ExpandSnippet()
  let l:word = expand("<cword>")
  if has_key(g:snippets, l:word) == 1
    exe 'normal! "_Bcw'.g:snippets[l:word]
  endif
endfunction

inoremap <Tab> <Esc>:call ExpandSnippet()<cr>a

אפשר להדביק את הקוד ב vimrc שלכם או לקובץ חדש עם סיומת vim בתוך תיקיית plugin. אחרי זה הפעילו מחדש את vim, כיתבו את המילה vim באיזשהו קובץ ולחצו Tab. אם עשיתם הכל נכון המילה תוחלף במשפט the best editor.

2. הוספת סניפטים לפי סוג קובץ

וים מאפשר הרצה של קוד לפי סוג קובץ באמצעות קבצי ftplugin. לדוגמא כדי להוסיף קוד ספציפי לקבצי csh נוסיף בתיקיית ~/.vim/ftplugin קובץ בשם csh.vim. הוספה של סניפטים חדשים למילון מבוצעת באופן הבא:

let g:snippets.if = 'if ( "$var" == "value" ) then'."\n".'
      \  echo "true"'."\n".'
      \endif'."\n"

כעת בפעם הבאה שנפתח קובץ עם סיומת csh לעריכה וים אוטומטית יעדכן את המילון g:snippets עם ההרחבה למילה if. לחיצה על Tab אחרי המילה if בקובץ csh תביא להרחבת המילה לבלוק ה if שהוצג.

3. פלאגינים ונקודות להמשך

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

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

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