歡迎光臨
每天分享高質量文章

用 zsh 提高生產力的 5 個技巧 | Linux 中國

zsh 提供了數之不盡的功能和特性,這裡有五個可以讓你在命令列效率暴增的方法。
— Ricardo Gerardi


致謝
編譯自 | 
https://opensource.com/article/18/9/tips-productivity-zsh
 
 作者 | Ricardo Gerardi
 譯者 | Y.C.S.M (tnuoccalanosrep) ??共計翻譯:3.0 篇 貢獻時間:1124 天

zsh 提供了數之不盡的功能和特性,這裡有五個可以讓你在命令列效率暴增的方法。

Z shell(zsh[1])是 Linux 和類 Unix 系統中的一個命令解析器[2]。 它跟 sh (Bourne shell) 家族的其它解析器(如 bash 和 ksh)有著相似的特點,但它還提供了大量的高級特性以及強大的命令列編輯功能,如增強版 Tab 補全。

在這裡不可能涉及到 zsh 的所有功能,描述[3]它的特性需要好幾百頁。在本文中,我會列出 5 個技巧,讓你通過在命令列使用 zsh 來提高你的生產力。

1、主題和插件

多年來,開源社區已經為 zsh 開發了數不清的主題和插件。主題是一個預定義提示符的配置,而插件則是一組常用的別名命令和函式,可以讓你更方便的使用一種特定的命令或者編程語言。

如果你現在想開始用 zsh 的主題和插件,那麼使用一種 zsh 的配置框架是你最快的入門方式。在眾多的配置框架中,最受歡迎的則是 Oh My Zsh[4]。在預設配置中,它就已經為 zsh 啟用了一些合理的配置,同時它也自帶上百個主題和插件。

主題會在你的命令列提示符之前添加一些有用的信息,比如你 Git 倉庫的狀態,或者是當前使用的 Python 虛擬環境,所以它會讓你的工作更高效。只需要看到這些信息,你就不用再敲命令去重新獲取它們,而且這些提示也相當酷炫。下圖就是我選用的主題 Powerlevel9k[5]

zsh 主題 Powerlevel9k

除了主題,Oh my Zsh 還自帶了大量常用的 zsh 插件。比如,通過啟用 Git 插件,你可以用一組簡便的命令別名操作 Git, 比如

  1. $ alias | grep -i git | sort -R | head -10

  2. g=git

  3. ga='git add'

  4. gapa='git add --patch'

  5. gap='git apply'

  6. gdt='git diff-tree --no-commit-id --name-only -r'

  7. gau='git add --update'

  8. gstp='git stash pop'

  9. gbda='git branch --no-color --merged | command grep -vE "^(\*|\s*(master|develop|dev)\s*$)" | command xargs -n 1 git branch -d'

  10. gcs='git commit -S'

  11. glg='git log --stat'

zsh 還有許多插件可以用於許多編程語言、打包系統和一些平時在命令列中常用的工具。以下是我 Ferdora 工作站中用到的插件表:

  1. git golang fedora docker oc sudo vi-mode virtualenvwrapper

2、智慧的命令別名

命令別名在 zsh 中十分有用。為你常用的命令定義別名可以節省你的打字時間。Oh My Zsh 預設配置了一些常用的命令別名,包括目錄導航命令別名,為常用的命令添加額外的選項,比如:

  1. ls='ls --color=tty'

  2. grep='grep  --color=auto --exclude-dir={.bzr,CVS,.git,.hg,.svn}'

除了命令別名以外, zsh 還自帶兩種額外常用的別名型別:後綴別名和全域性別名。

後綴別名可以讓你基於檔案後綴,在命令列中利用指定程式打開這個檔案。比如,要用 vim 打開 YAML 檔案,可以定義以下命令列別名:

  1. alias -s {yml,yaml}=vim

現在,如果你在命令列中輸入任何後綴名為 yml 或 yaml 檔案, zsh 都會用 vim 打開這個檔案。

  1. $ playbook.yml

  2. # Opens file playbook.yml using vim

全域性別名可以讓你創建一個可在命令列的任何地方展開的別名,而不僅僅是在命令開始的時候。這個在你想替換常用檔案名或者管道命令的時候就顯得非常有用了。比如:

  1. alias -g G='| grep -i'

要使用這個別名,只要你在想用管道命令的時候輸入 G 就好了:

  1. $ ls -l G do

  2. drwxr-xr-x.  5 rgerardi rgerardi 4096 Aug  7 14:08 Documents

  3. drwxr-xr-x.  6 rgerardi rgerardi 4096 Aug 24 14:51 Downloads

接著,我們就來看看 zsh 是如何導航檔案系統的。

3、便捷的目錄導航

當你使用命令列的時候,在不同的目錄之間切換訪問是最常見的工作了。 zsh 提供了一些十分有用的目錄導航功能來簡化這個操作。這些功能已經集成到 Oh My Zsh 中了, 而你可以用以下命令來啟用它

  1. setopt  autocd autopushd \ pushdignoredups

使用了上面的配置後,你就不用輸入 cd 來切換目錄了,只需要輸入目錄名稱,zsh 就會自動切換到這個目錄中:

  1. $ pwd

  2. /home/rgerardi

  3. $ /tmp

  4. $ pwd

  5. /tmp

如果想要回退,只要輸入 -:

zsh 會記錄你訪問過的目錄,這樣下次你就可以快速切換到這些目錄中。如果想要看這個目錄串列,只要輸入 dirs -v

  1. $ dirs -v

  2. 0       ~

  3. 1       /var/log

  4. 2       /var/opt

  5. 3       /usr/bin

  6. 4       /usr/local

  7. 5       /usr/lib

  8. 6       /tmp

  9. 7       ~/Projects/Opensource.com/zsh-5tips

  10. 8       ~/Projects

  11. 9       ~/Projects/ansible

  12. 10      ~/Documents

如果想要切換到這個串列中的其中一個目錄,只需輸入 ~# (# 代表目錄在串列中的序號)就可以了。比如

  1. $ pwd

  2. /home/rgerardi

  3. $ ~4

  4. $ pwd

  5. /usr/local

你甚至可以用別名組合這些命令,這樣切換起來就變得更簡單:

  1. d='dirs -v | head -10'

  2. 1='cd -'

  3. 2='cd -2'

  4. 3='cd -3'

  5. 4='cd -4'

  6. 5='cd -5'

  7. 6='cd -6'

  8. 7='cd -7'

  9. 8='cd -8'

  10. 9='cd -9'

現在你可以通過輸入 d 來查看這個目錄串列的前10個,然後用目錄的序號來進行切換:

  1. $ d

  2. 0       /usr/local

  3. 1       ~

  4. 2       /var/log

  5. 3       /var/opt

  6. 4       /usr/bin

  7. 5       /usr/lib

  8. 6       /tmp

  9. 7       ~/Projects/Opensource.com/zsh-5tips

  10. 8       ~/Projects

  11. 9       ~/Projects/ansible

  12. $ pwd

  13. /usr/local

  14. $ 6

  15. /tmp

  16. $ pwd

  17. /tmp

最後,你可以在 zsh 中利用 Tab 來自動補全目錄名稱。你可以先輸入目錄的首字母,然後按 TAB 鍵來補全它們:

  1. $ pwd

  2. /home/rgerardi

  3. $ p/o/z (TAB)

  4. $ Projects/Opensource.com/zsh-5tips/

以上僅僅是 zsh 強大的 Tab 補全系統中的一個功能。接來下我們來探索它更多的功能。

4、先進的 Tab 補全

zsh 強大的補全系統是它的賣點之一。為了簡便起見,我稱它為 Tab 補全,然而在系統底層,它起到了幾個作用。這裡通常包括展開以及命令補全,我會在這裡用討論它們。如果想瞭解更多,詳見 用戶手冊[6]

在 Oh My Zsh 中,命令補全是預設啟用的。要啟用它,你只要在 .zshrc 檔案中添加以下命令:

  1. autoload -U compinit

  2. compinit

zsh 的補全系統非常智慧。它會嘗試唯一提示可用在當前背景關係環境中的專案 —— 比如,你輸入了 cd 和 TAB,zsh 只會為你提示目錄名,因為它知道其它的專案放在 cd 後面沒用。

反之,如果你使用與用戶相關的命令便會提示用戶名,而 ssh 或者 ping 這類則會提示主機名。

zsh 擁有一個巨大而又完整的庫,因此它能識別許多不同的命令。比如,如果你使用 tar 命令, 你可以按 TAB 鍵,它會為你展示一個可以用於解壓的檔案串列:

  1. $ tar -xzvf test1.tar.gz test1/file1 (TAB)

  2. file1 file2

如果使用 git 的話,這裡有個更高級的示例。在這個示例中,當你按 TAB 鍵, zsh 會自動補全當前庫可以操作的檔案:

  1. $ ls

  2. original  plan.txt  zsh-5tips.md  zsh_theme_small.png

  3. $ git status

  4. On branch master

  5. Your branch is up to date with 'origin/master'.

  6. Changes not staged for commit:

  7.   (use "git add ..." to update what will be committed)

  8.   (use "git checkout -- ..." to discard changes in working directory)

  9.         modified:   zsh-5tips.md

  10. no changes added to commit (use "git add" and/or "git commit -a")

  11. $ git add (TAB)

  12. $ git add zsh-5tips.md

zsh 還能識別命令列選項,同時它只會提示與選中子命令相關的命令串列:

  1. $ git commit - (TAB)

  2. --all                  -a       -- stage all modified and deleted paths

  3. --allow-empty                   -- allow recording an empty commit

  4. --allow-empty-message           -- allow recording a commit with an empty message

  5. --amend                         -- amend the tip of the current branch

  6. --author                        -- override the author name used in the commit

  7. --branch                        -- show branch information

  8. --cleanup                       -- specify how the commit message should be cleaned up

  9. --date                          -- override the author date used in the commit

  10. --dry-run                       -- only show the list of paths that are to be committed or not, and any untracked

  11. --edit                 -e       -- edit the commit message before committing

  12. --file                 -F       -- read commit message from given file

  13. --gpg-sign             -S       -- GPG-sign the commit

  14. --include              -i       -- update the given files and commit the whole index

  15. --interactive                   -- interactively update paths in the index file

  16. --message              -m       -- use the given message as the commit message

  17. ... TRUNCATED ...

在按 TAB 鍵之後,你可以使用方向鍵來選擇你想用的命令。現在你就不用記住所有的 git 命令項了。

zsh 還有很多有用的功能。當你用它的時候,你就知道哪些對你才是最有用的。

5、命令列編輯與歷史記錄

zsh 的命令列編輯功能也十分有用。預設條件下,它是模擬 emacs 編輯器的。如果你是跟我一樣更喜歡用 vi/vim,你可以用以下命令啟用 vi 的鍵系結。

  1. $ 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 的命令。

最後,輸入兩個感嘆號(!!),可以在命令列中回溯最後一條命令。這個十分有用,比如,當你忘記使用 sudo 去執行需要權限的命令時:

  1. $ less /var/log/dnf.log

  2. /var/log/dnf.log: Permission denied

  3. $ sudo !!

  4. $ sudo less /var/log/dnf.log

這個功能讓查找並且重新執行之前命令的操作更加方便。

下一步呢?

這裡僅僅介紹了幾個可以讓你提高生產率的 zsh 特性;其實還有更多功能有待你的發掘;想知道更多的信息,你可以訪問以下的資源:

◈ An Introduction to the Z Shell[7]
◈ A User’s Guide to ZSH[8]
◈ Archlinux Wiki[9]
◈ zsh-lovers[10]

你有使用 zsh 提高生產力的技巧可以分享嗎?我很樂意在下方評論中看到它們。


via: https://opensource.com/article/18/9/tips-productivity-zsh

作者:Ricardo Gerardi[12] 選題:lujun9972 譯者:tnuoccalanosrep 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

赞(0)

分享創造快樂

© 2021 知識星球   网站地图