用 zsh 提高生產力的 5 個技巧
zsh 提供了數之不盡的功能和特性,這裡有五個可以讓你在命令列效率暴增的方法。
Z shell(zsh)是 Linux 和類 Unix 系統中的一個命令解析器。 它跟 sh (Bourne shell) 家族的其它解析器(如 bash 和 ksh)有著相似的特點,但它還提供了大量的高階特性以及強大的命令列編輯功能,如增強版 Tab 補全。
在這裡不可能涉及到 zsh 的所有功能,描述它的特性需要好幾百頁。在本文中,我會列出 5 個技巧,讓你透過在命令列使用 zsh 來提高你的生產力。
1、主題和外掛
多年來,開源社群已經為 zsh 開發了數不清的主題和外掛。主題是一個預定義提示符的配置,而外掛則是一組常用的別名命令和函式,可以讓你更方便的使用一種特定的命令或者程式語言。
如果你現在想開始用 zsh 的主題和外掛,那麼使用一種 zsh 的配置框架是你最快的入門方式。在眾多的配置框架中,最受歡迎的則是 Oh My Zsh。在預設配置中,它就已經為 zsh 啟用了一些合理的配置,同時它也自帶上百個主題和外掛。
主題會在你的命令列提示符之前新增一些有用的資訊,比如你 Git 倉庫的狀態,或者是當前使用的 Python 虛擬環境,所以它會讓你的工作更高效。只需要看到這些資訊,你就不用再敲命令去重新獲取它們,而且這些提示也相當酷炫。下圖就是我選用的主題 Powerlevel9k:
zsh 主題 Powerlevel9k
除了主題,Oh my Zsh 還自帶了大量常用的 zsh 外掛。比如,透過啟用 Git 外掛,你可以用一組簡便的命令別名操作 Git, 比如
$ alias | grep -i git | sort -R | head -10
g=git
ga='git add'
gapa='git add --patch'
gap='git apply'
gdt='git diff-tree --no-commit-id --name-only -r'
gau='git add --update'
gstp='git stash pop'
gbda='git branch --no-color --merged | command grep -vE "^(\*|\s*(master|develop|dev)\s*$)" | command xargs -n 1 git branch -d'
gcs='git commit -S'
glg='git log --stat'
zsh 還有許多外掛可以用於許多程式語言、打包系統和一些平時在命令列中常用的工具。以下是我 Ferdora 工作站中用到的外掛表:
git golang fedora docker oc sudo vi-mode virtualenvwrapper
2、智慧的命令別名
命令別名在 zsh 中十分有用。為你常用的命令定義別名可以節省你的打字時間。Oh My Zsh 預設配置了一些常用的命令別名,包括目錄導航命令別名,為常用的命令新增額外的選項,比如:
ls='ls --color=tty'
grep='grep --color=auto --exclude-dir={.bzr,CVS,.git,.hg,.svn}'
除了命令別名以外, zsh 還自帶兩種額外常用的別名型別:字尾別名和全域性別名。
字尾別名可以讓你基於檔案字尾,在命令列中利用指定程式開啟這個檔案。比如,要用 vim 開啟 YAML 檔案,可以定義以下命令列別名:
alias -s {yml,yaml}=vim
現在,如果你在命令列中輸入任何字尾名為 yml
或 yaml
檔案, zsh 都會用 vim 開啟這個檔案。
$ playbook.yml
# Opens file playbook.yml using vim
全域性別名可以讓你建立一個可在命令列的任何地方展開的別名,而不僅僅是在命令開始的時候。這個在你想替換常用檔名或者管道命令的時候就顯得非常有用了。比如:
alias -g G='| grep -i'
要使用這個別名,只要你在想用管道命令的時候輸入 G
就好了:
$ ls -l G do
drwxr-xr-x. 5 rgerardi rgerardi 4096 Aug 7 14:08 Documents
drwxr-xr-x. 6 rgerardi rgerardi 4096 Aug 24 14:51 Downloads
接著,我們就來看看 zsh 是如何導航檔案系統的。
3、便捷的目錄導航
當你使用命令列的時候,在不同的目錄之間切換訪問是最常見的工作了。 zsh 提供了一些十分有用的目錄導航功能來簡化這個操作。這些功能已經整合到 Oh My Zsh 中了, 而你可以用以下命令來啟用它
setopt autocd autopushd \ pushdignoredups
使用了上面的配置後,你就不用輸入 cd
來切換目錄了,只需要輸入目錄名稱,zsh 就會自動切換到這個目錄中:
$ pwd
/home/rgerardi
$ /tmp
$ pwd
/tmp
如果想要回退,只要輸入 -
:
zsh 會記錄你訪問過的目錄,這樣下次你就可以快速切換到這些目錄中。如果想要看這個目錄列表,只要輸入 dirs -v
:
$ dirs -v
0 ~
1 /var/log
2 /var/opt
3 /usr/bin
4 /usr/local
5 /usr/lib
6 /tmp
7 ~/Projects/Opensource.com/zsh-5tips
8 ~/Projects
9 ~/Projects/ansible
10 ~/Documents
如果想要切換到這個列表中的其中一個目錄,只需輸入 ~#
(#
代表目錄在列表中的序號)就可以了。比如
$ pwd
/home/rgerardi
$ ~4
$ pwd
/usr/local
你甚至可以用別名組合這些命令,這樣切換起來就變得更簡單:
d='dirs -v | head -10'
1='cd -'
2='cd -2'
3='cd -3'
4='cd -4'
5='cd -5'
6='cd -6'
7='cd -7'
8='cd -8'
9='cd -9'
現在你可以透過輸入 d
來檢視這個目錄列表的前10個,然後用目錄的序號來進行切換:
$ d
0 /usr/local
1 ~
2 /var/log
3 /var/opt
4 /usr/bin
5 /usr/lib
6 /tmp
7 ~/Projects/Opensource.com/zsh-5tips
8 ~/Projects
9 ~/Projects/ansible
$ pwd
/usr/local
$ 6
/tmp
$ pwd
/tmp
最後,你可以在 zsh 中利用 Tab 來自動補全目錄名稱。你可以先輸入目錄的首字母,然後按 TAB
鍵來補全它們:
$ pwd
/home/rgerardi
$ p/o/z (TAB)
$ Projects/Opensource.com/zsh-5tips/
以上僅僅是 zsh 強大的 Tab 補全系統中的一個功能。接來下我們來探索它更多的功能。
4、先進的 Tab 補全
zsh 強大的補全系統是它的賣點之一。為了簡便起見,我稱它為 Tab 補全,然而在系統底層,它起到了幾個作用。這裡通常包括展開以及命令補全,我會在這裡用討論它們。如果想了解更多,詳見 使用者手冊。
在 Oh My Zsh 中,命令補全是預設啟用的。要啟用它,你只要在 .zshrc
檔案中新增以下命令:
autoload -U compinit
compinit
zsh 的補全系統非常智慧。它會嘗試唯一提示可用在當前上下文環境中的專案 —— 比如,你輸入了 cd
和 TAB
,zsh 只會為你提示目錄名,因為它知道其它的專案放在 cd
後面沒用。
反之,如果你使用與使用者相關的命令便會提示使用者名稱,而 ssh
或者 ping
這類則會提示主機名。
zsh 擁有一個巨大而又完整的庫,因此它能識別許多不同的命令。比如,如果你使用 tar
命令, 你可以按 TAB
鍵,它會為你展示一個可以用於解壓的檔案列表:
$ tar -xzvf test1.tar.gz test1/file1 (TAB)
file1 file2
如果使用 git
的話,這裡有個更高階的示例。在這個示例中,當你按 TAB
鍵, zsh 會自動補全當前庫可以操作的檔案:
$ ls
original plan.txt zsh-5tips.md zsh_theme_small.png
$ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: zsh-5tips.md
no changes added to commit (use "git add" and/or "git commit -a")
$ git add (TAB)
$ git add zsh-5tips.md
zsh 還能識別命令列選項,同時它只會提示與選中子命令相關的命令列表:
$ git commit - (TAB)
--all -a -- stage all modified and deleted paths
--allow-empty -- allow recording an empty commit
--allow-empty-message -- allow recording a commit with an empty message
--amend -- amend the tip of the current branch
--author -- override the author name used in the commit
--branch -- show branch information
--cleanup -- specify how the commit message should be cleaned up
--date -- override the author date used in the commit
--dry-run -- only show the list of paths that are to be committed or not, and any untracked
--edit -e -- edit the commit message before committing
--file -F -- read commit message from given file
--gpg-sign -S -- GPG-sign the commit
--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
... TRUNCATED ...
在按 TAB
鍵之後,你可以使用方向鍵來選擇你想用的命令。現在你就不用記住所有的 git
命令項了。
zsh 還有很多有用的功能。當你用它的時候,你就知道哪些對你才是最有用的。
5、命令列編輯與歷史記錄
zsh 的命令列編輯功能也十分有用。預設條件下,它是模擬 emacs 編輯器的。如果你是跟我一樣更喜歡用 vi/vim,你可以用以下命令啟用 vi 的鍵繫結。
$ bindkey -v
如果你使用 Oh My Zsh,vi-mode
外掛可以啟用額外的繫結,同時會在你的命令提示符上增加 vi 的模式提示 —— 這個非常有用。
當啟用 vi 的繫結後,你可以在命令列中使用 vi 命令進行編輯。比如,輸入 ESC+/
來查詢命令列記錄。在查詢的時候,輸入 n
來找下一個匹配行,輸入 N
來找上一個。輸入 ESC
後,常用的 vi 命令都可以使用,如輸入 0
跳轉到行首,輸入 $
跳轉到行尾,輸入 i
來插入文字,輸入 a
來追加文字等等,即使是跟隨的命令也同樣有效,比如輸入 cw
來修改單詞。
除了命令列編輯,如果你想修改或重新執行之前使用過的命令,zsh 還提供幾個常用的命令列歷史功能。比如,你打錯了一個命令,輸入 fc
,你可以在你偏好的編輯器中修復最後一條命令。使用哪個編輯是參照 $EDITOR
變數的,而預設是使用 vi。
另外一個有用的命令是 r
, 它會重新執行上一條命令;而 r <WORD>
則會執行上一條包含 WORD
的命令。
最後,輸入兩個感嘆號(!!
),可以在命令列中回溯最後一條命令。這個十分有用,比如,當你忘記使用 sudo
去執行需要許可權的命令時:
$ less /var/log/dnf.log
/var/log/dnf.log: Permission denied
$ sudo !!
$ sudo less /var/log/dnf.log
這個功能讓查詢並且重新執行之前命令的操作更加方便。
下一步呢?
這裡僅僅介紹了幾個可以讓你提高生產率的 zsh 特性;其實還有更多功能有待你的發掘;想知道更多的資訊,你可以訪問以下的資源:
你有使用 zsh 提高生產力的技巧可以分享嗎?我很樂意在下方評論中看到它們。
via: https://opensource.com/article/18/9/tips-productivity-zsh
作者:Ricardo Gerardi 選題:lujun9972 譯者:tnuoccalanosrep 校對:wxy
相關文章
- 提高開發生產力 - 生產力指南篇(之一)
- 5個技巧,讓生產效率翻倍!
- 年輕人的第一個 Docker 應用,大大提高生產力!Docker
- 5 個最具生產力的 Linux 發行版Linux
- 推薦一個可以提高生產力的線上遊戲遊戲
- Github Actions 實戰提高生產力Github
- 提高生產力的 Flutter 開發工具 - bisunajaimeFlutterAI
- 提高 PostgreSQL 插入效能的 5 個技巧SQL
- 提高Python執行效率的5個技巧!Python
- 五種方法CRM提高團隊生產力
- TeamFlowy——結合Teambition與Workflowy提高生產力
- 提高Python執行效率的5個小技巧!Python
- 提高 Laravel Eloquent 查詢的5個小技巧Laravel
- 提高郵件營銷效果的5個技巧
- [譯] 程式設計師該如何提高生產力?程式設計師
- 簡化 Go 開發:使用強大的工具提高生產力Go
- 提高生產力!這10個Lambda表示式必須掌握,開發效率嘎嘎上升!
- ERP系統如何發揮作用,提高企業生產力?
- 5 個可以滿足你的生產力、溝通和娛樂需求的開源手機應用
- 看板專案管理:如何視覺化工作以提高生產力?專案管理視覺化
- 5個Excel實用技巧,幫你大大提高工作效率!Excel
- 盤點 | 提高雲端計算安全性的5個技巧
- 不要重複造輪子?提高生產效率!5個超好用的開源工具庫分享開源工具
- MES改善實時生產跟蹤的7個技巧
- Adobe InCopy (Ic文案編輯軟體)提高生產力的頂 級軟體
- 如何透過時間跟蹤分析,有效提高員工生產力?
- 大大提高我們的構建體驗5個 Vue 技巧Vue
- 良好的編碼習慣 —— 5 個提高程式碼質量的技巧
- 適用於 Fedora 28 的 3 款酷炫生產力應用
- 極狐GitLab怎麼樣?如何利用極狐GitLab CI提高生產力?Gitlab
- 人工智慧在哪裡協助生產力提高(附原資料表) 人工智慧
- 使用 Laravel 和 Serverless ,降低人力成本,提高開發人員生產力LaravelServer
- 提高 MongoDB 運維效率的實用技巧MongoDB運維
- 如何快速評估新產品潛力 街機放置遊戲創意測試的5個技巧遊戲
- 簡單介紹5個python的實用技巧Python
- 牛津大學:研究發現當人快樂時生產力將提高13%
- ERP系統是如何提高生產效率的?
- 精益生產流程最佳化的5個方法