#308 Oh My ZSH
- Download:
- source codeProject Files in Zip (2.18 KB)
- mp4Full Size H.264 Video (25.9 MB)
- m4vSmaller H.264 Video (11.2 MB)
- webmFull Size VP8 Video (11.7 MB)
- ogvFull Size Theora Video (23.5 MB)
בתור תכנתי Rails, אנו משתמשים לעיתים קרובות בפקודות טקסט בטרמינל, אך לא תמיד מפיקים מכך את המירב האפשרי. כברירת מחדל, המעטפת הפעילה ברוב הטרמינלים במערכות מבוססות UNIX היא Bash. אחד הדברים הטובים ביותר שתוכלו לעשות, הוא לעבור מBash ל Z Shell (ידוע גם בתור zsh). מעבר זה יכול להיתו מעט קשה לביצוע, אבל קיים פרויקט הנקרא oh-my-zsh אשר הופך את התקנת zsh לקלה ומהירה, וכלל מספר הגדרות ברירת מחדל, ואף מספר תוספים (plugins). כל הנדרש על מנת לבצע את המעבר הוא להריץ את הפקודה הבאה בטרמינל:
``` terminal wget --no-check-certificate https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh<p> אם לא מותקן אצלינו wget, ניתן להשתמש ב-curl כדי להתקין את zsh באמצעות הפקודה האלטרנטיבית: </p> ``` terminal curl -L https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh | sh
פקודות אלו יעתיקו אלינו את הקוד של oh-my-zsh ויתקין את zsh. בתהליך זה נידרש להכניס את הסיסמה שלנו. לאחר שההתקנה תסתיים, נוכל לפתוח חלון טרמינל חדש, ואנו אמורים לקבל חלון zsh.
הדבר הראשון שנשים לב אליו, הוא שינוי מהותי במראה של שורת הפקודה. ניתן להתאים את המראה דרך הגדרות תמה (theme) ונראה זאת בהמשך. למרות שבמבט ראשון zsh נראה שונה, רוב הזמן הוא מתנהג בדיוק כמו Bash והפקודות אשר פעלו ב-Bash יפעלו ב-zsh בדיוק באותה הצורה.
מבט מהיר על תכונות zsh
אחת התכונות המועילות ביותר של zsh היא השלמה אוטומטית. לדוגמה, אם נקליד ls -
ונלחץ על כפתור טאב במקלדת, נקבל רשימה של כל האופציות שניתן להזין ל-ls
. ניתן אפילו להשתמש בחיצים על מנת לגלול בתוך הרשימה ולהשלים את הפקודה שאני מקישים בשורת הפקודה. תכונה זו הופכת לשימושית במיוחד עבור פקודות סבוכות, כדוגמת git commit
.
? ~ git commit - --all -a -- update all paths in the index file --allow-empty -- allow recording an empty commit --amend -- amend the tip of the current branch --author -- override the author name used in the commit --cleanup -- specify how the commit message should be cleaned up --edit -e -- edit the commit message before committing --file -F -- read commit message from given file --include -i -- update the given files and commit the whole index --interactive -- interactively update paths in the index file --message -m -- use the given message as the commit message --no-verify -n -- do not look for suspicious lines the commit introduc --only -o -- commit only the given files --quiet -q -- suppress commit summary message --reedit-message -c -- use existing commit object and edit log message --reuse-message -C -- use existing commit object with same log message --signoff -s -- add Signed-off-by line at the end of the commit mess --untracked-files -u -- show files in untracked directories --verbose -v -- show unified diff of all file changes
תכונה יעילה נוספת היא היכולת להגדיר אפשרויות נרחבות יותר לשימוש בתו חופשי (wildcard). לדוגמה, אם נרצה לקבל רשימה של כל קבצי ה-ruby בפרויקט שלנו, נוכל להשתמש בכוכבית כפולה (**) על מנת לבצע חיפוש רקורסיבי עמוק בתוך התיקיה, בשונה מחיפוש שטוח ב-Bash.
? railscasts git:(master) ls **/*.rb app/controllers/application_controller.rb app/controllers/comments_controller.rb app/controllers/episodes_controller.rb app/controllers/feedback_messages_controller.rb app/controllers/info_controller.rb app/controllers/users_controller.rb app/controllers/versions_controller.rb app/helpers/application_helper.rb app/helpers/comments_helper.rb app/helpers/episodes_helper.rb app/helpers/error_messages_helper.rb app/helpers/feedback_messages_helper.rb # rest of files omitted.
קיימות תכונות נהדרות נוספות ב-zsh. חלק מהן נתמך רק ב-OS X. לדוגמה - הוספת מידע מורחב לכותרת החלון הכולל את המשתמש הנוכחי, המכונה ותיקיית העבודה.
קיימות תכונות קטנות ויעילות נוספות. למשל, אם נפתח טאב טרמינל חדש, הוא ייפתח באותה תיקייה כמו הטאב הקודם. כמו-כן, אם נתחיל להקליד פקודה ונלחץ על חץ למעלה (במקלדת), נקבל השלמה אוטומטית מהיסטוריית ההקלדה שלנו, מפולטרת על פי הפקודה הנוכחית.
הגדרת zsh
כל התכונות לעיל ניתנות להגדרה והתאמה, ולכן זה הדבר הבא שנסתכל עליו. קיים קובץ הנקרא .zshrc
בתיקיית הבית שלנו והוא נטען בכל פעם שאנו מתחילים סשין חדש של zsh.
# Path to your oh-my-zsh configuration. ZSH=$HOME/.oh-my-zsh # Set name of the theme to load. # Look in ~/.oh-my-zsh/themes/ # Optionally, if you set this to "random", it'll load a random theme each # time that oh-my-zsh is loaded. ZSH_THEME="robbyrussell" # Set to this to use case-sensitive completion # CASE_SENSITIVE="true" # Comment this out to disable weekly auto-update checks # DISABLE_AUTO_UPDATE="true" # Uncomment following line if you want to disable colors in ls # DISABLE_LS_COLORS="true" # Uncomment following line if you want to disable autosetting terminal title. # DISABLE_AUTO_TITLE="true" # Uncomment following line if you want red dots to be displayed while waiting for completion # COMPLETION_WAITING_DOTS="true" # Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/plugins/*) # Example format: plugins=(rails git textmate ruby lighthouse) plugins=(git) source $ZSH/oh-my-zsh.sh # Customize to your needs... export PATH=/Users/eifion/.rvm/gems/ruby-1.9.2-p290/bin:/Users/eifion/.rvm/gems/ruby-1.9.2-p290@global/bin:/Users/eifion/.rvm/rubies/ruby-1.9.2-p290/bin:/Users/eifion/.rvm/bin:/Users/eifion/bin:/usr/local/bin:/usr/local/mysql/bin/:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin
ראשית, הקובץ מגדיר את הנתיב לתיקיית ההגדרות של oh-my-zsh. לאחר מכן הוא קובע את התמה, אשר כרגע היא robbyrussel
. מתחת לזאת, יש מספר אפשרויות אשר מסומנת כרגע כהערות. כך, אם נרצה למשל, לנטרל את השימוש בצבעים בעת הצגת תיקיות ב-zsh, נוכל למחוק את סימן ההערה (#) בראשית השורה DISABLE_LS_COLORS
בהמשך הקובץ קיימת רשימה של כל התוספים המופעלים. כרגע רק git
מופעל, אך נוסיף אחרים בעוד מספר רגעים. מתחת לכך, השורה source $ZSH/oh-my-zsh.sh
טוענת את oh-my-zsh ולסיום הפקודה אשר קובעת את הנתיב שלנו - PATH
. ברירת המחדל לנתיב היא הערך שהיה בשימוש בעת ההתקנה, אולם כנראה עדיף פשוט למשוך זאת מתוך פרופיל ה-Bash שלנו. ניתן לעשות זאת על ידי הסרת השורה המתחילה ב-export PATH
מהקובץ .zshrc
ולאחר מכן הרצת הפקודה הבאה.
? ~ cat ~/.bash_profile >> ~/.zshrc
מן הסתם, הגדרות אלה יהיו שונות עבור המכונה שלך. ברוב המקרים לא אמורה להיות בעיה להעתיק הגדרות אלה ישירות מBash אולם לעיתים יהיה צורך בהתאמות ותיקונים ידניים קלים על מנת שהכל יעבוד.
תמות
כעת נגדיר תמה (theme) חדשה כדי לשנות את המראה של שורת הפקודה. התמות הקיימים נמצאות תחת התיקייה ~/.oh-my-zsh/themes
, ויש לא מעט כאלו בהתקנה הבסיסית. ניתן לראות את רשימת התמות הכלולות בהתקנה יחד עם צילומי מסך, בעמוד ה-Wiki של הפרויקט - oh-my-zsh wiki page. אם נרצה להתאים את oh-my-zsh בצורה מקיפה, נוכל ליצור תמה משלנו, על ידי יצירת קובץ zsh-theme
חדש בתיקיית התמות - וזה מה שנעשה כעת.
PROMPT='%3~$(git_prompt_info)%#' ZSH_THEME_GIT_PROMPT_PREFIX="[" ZSH_THEME_GIT_PROMPT_SUFFIX="]"
התמה שלנו בסיסית למדי כרגע. כל שעשינו הוא לקבוע את פורמט שורת הפקודה ואת הרישא והסיפא שיקיפו את שם הענף הנוכחי שלנו בGit, כאשר אנו נמצאים בתוך תיקייה שהיא פרויקט Git. אם נרצה לבצע הגדרה נרחבת יותר, נוכל להציץ בקוד המקור של שאר התמות לשם השראה. כמו כן, קיים אתר מועיל המתעד את התווים השונים שניתן להעביר כאופציית PROMPT
, ומה תפקידם.
כדי לראות את התמה החדשה שלנו, עלינו לשנות את ההגדרה ZSH_THEME
בקובץ .zshrc
כך שיהיה תואם לתמה הרצויה.
ZSH_THEME="eifion"
תוספים
קל להרחיב את zsh באמצעות תוספים. כמו במקרה של תמות, קיימים תוספים רבים הכלולים בהתקנה הבסיסית, תחת התיקייה ~/.oh-my-zsh/plugins
. לפני שניצור תוסף, כדאי להציץ באחד קיים ולראות כיצד הוא פועל. לשם הדוגמה, נסתכל בתוסף Bundler. התוסף כולל קובץ הנקרא _bundler
. אם לתוסף יש קובץ המתחיל בקו תחתון, זה אומר שהוא כולל השלמה אוטומטית לפקודות מסוימות. התוסף של Bundler עושה מספר דברים נוספים, למשל - יצירת מספר קיצורי דרך (aliases) לפקודות נפוצות של Bundler ובנוסף הוא מוודא שמספר פקודות Rails נפוצות מורצות מתוך bundle exec, כך שלא צריך להקליד זאת בכל פעם מחדש.
יש מספר תוספים שמועיל להיעזר בהם. התוסף של brew
מוסיף תכונות השלמה אוטומטית שימושיות, וכך גם gem
. אחרים, כגון rails3
ו-ruby
מועילים פחות, וכוללים רק מספר קיצורי דרך. על מנת להוסיף תוספים חדשים, עלינו רק לכלול אותם בפקודה plugins
בקובץ .zshrc
באופן הבא:
plugins=(git bundler brew gem)
כמובן שנוכל ליצור גם תוספים משל עצמנו. לדוגמה, נניח ואנו שומרים את כל הפרויקטים שלנו בתיקייה ~/code
, ונאלצים להקליד כל פעם מחדש cd ~/code/<project>
כדי להיכנס לתיקייה של פרויקט ספציפי, מה שקצת מעיק. ניצור כעת פקודה c
אשר תאפשר לנו לעבור לתוך תיקיית פרויקט בקלות רבה יותר. ניצור תוסף משלנו בתיקייה ~/.oh-my-zsh/custom/plugins
. נצטרך ליצור תיקייה לתוסף שלנו וכמו כן את הקובץ .plugin.zsh
.
c() { cd ~/code/$1; } _c() { _files -W ~/code -/; } compdef _c c
השורה הראשונה מגדירה את הפקודה c
ופשוט קובעת את תיקיית העבודה לתת התיקייה של התיקייה code
אשר הועברה כארגומנט. השורה השניה משפעלת לנו השלמה אוטומטית לפקודה. כדי להוסיף השלמה אוטומטית לפקודה, עלינו ליצור פקודה חדשה בעלת שם זהה אך עם רישא של קו תחתון. הפקודה _c
שלנו עושה שימוש בהתנהגות של הפקודה _files
להשלמה אוטומטית של הקבצים והתיקיות תחת התיקייה ~/code
. השורה האחרונה לעיל מגדירה את _c
כהשלמה אוטומטית לפקודה c
.
על מנת שהתוסף החדש שלנו יפעל, עלינו להוסיף אותו לקובץ .zshrc
.
plugins=(git bundler brew gem eifion)
עלינו לפתוח חלון טרמינל חדש על מנת שהשינויים יופעלו, ואז נוכל להתחיל להשתמש בפקודה החדשה שלנו.
זה הכל לפרק זה על oh-my-zsh. אם אתם משתמשים בטרמינל לעיתים קרובות, כדאי לכם לשקול להחליף את מעטפת ברירת המחדל של המערכת שלכם ב-zsh.