蘋果已經宣佈,在macOS 10.15 Catalina中,默認外殼爲zsh
。html
在本系列中,我將記錄我將bash
設置,配置和腳本移至的經驗zsh
。git
本系列 已發展成一本書:進行了從新設計,並擴展了更多詳細信息和主題。 與其餘書籍同樣,我計劃在發行後也進行更新和添加,以保持其相關性和實用性。您如今 能夠在Apple Books Store上訂購它。
正如我在前面的帖子中所提到的,我知道有不少解決方案能夠爲您提供預先配置的「捷徑」,從而使您zsh
受益不淺。可是我有興趣學習這種沒有捷徑的「艱難方式」。叫我老式。(「上坡!在雪中!雙向!」)github
bash
macOS上的默認提示很是詳盡。它顯示用戶名,主機名_和_當前目錄。shell
Calypso:~ armin$
另外一方面,默認的bash提示符不顯示前一個命令的退出代碼,我發現這條信息很是有用。在從新配置bash
提示以獲取所需信息以前,我已經寫了如下內容:express
固然,我想在中從新建立相同的體驗zsh
。macos
與bash
提示惟一(視覺上)的區別是%
而不是$
。vim
注意:建立文件~/.hushlogin
將在每一個終端會話開始zsh
以及以後bash
(或任何其餘Shell中)禁止顯示狀態消息。
儘管使用不一樣的語法,但基本zsh
提示配置的工做原理與類似bash
。手冊中詳細zsh
描述了不一樣的佔位符。bash
zsh
使用相同的shell變量PS1
存儲默認提示。可是,變量名PROMPT
和prompt
是它們的同義詞PS1
,您將在各類示例中看到這三個變量中的任何一個。我要用PROMPT
。app
中的默認提示zsh
是%m%#
。在%m
示出了主機名的第一個元素,所述%#
示出了#
當電流提示具備超級用戶權限(例如後一sudo -s
)和不然%
符號(默認zsh
提示符號)。佈局
在zsh
默認的提示是遠遠高於短bash
默認,但即便是用處不大。因爲我大部分時間都在本地系統上工做,所以主機名不包含任何有用的信息,所以每行重複一次都是多餘的。
注意:您能夠爭辯說,當您常常有多個終端窗口打開到不一樣的主機時,提示中的主機名頗有用。的確如此,可是提示是由_遠程_外殼程序及其在_遠程_主機上的配置文件定義的。在配置文件中,您能夠測試是否
SSH_CLIENT
設置了變量,並顯示不一樣的遠程會話提示。在遠程Shell會話中有更多顯示主機的方法,例如在「終端」窗口標題欄中或使用不一樣的窗口背景顏色。
在咱們的第一次迭代中,我想顯示當前的工做目錄而不是主機名。當你經過zsh的文檔中的提示佔位符列表中,你會發現%d
,%/
和%~
。前兩個徹底同樣。最後一個替換將顯示一個路徑,該路徑從用戶的主目錄開始,並帶有~
,所以它將縮短/Users/armin/Projects/
爲~/Projects
。
注意:最後,您要PROMPT
在.zshrc
文件中設置變量,這樣它將在全部zsh
會話中生效。可是,對於測試,您能夠只PROMPT
在交互式外殼中更改變量。這將當即爲您提供反饋,說明您當前的設置如何工做。
% PROMPT='%/ %# ' /Users/armin/Projects/dotfiles/zshfunctions % % PROMPT='%~ %# ' ~/Projects/dotfiles/zshfunctions %
請注意提示字符串中的尾隨空格,以將最後一個%
或#
命令條目分隔開。
我更喜歡該%~
選項的較短輸出,可是根據您的工做目錄,它仍然可能很長。zsh
有一個技巧:在和n
之間插入數字時,只會顯示路徑的最後一個元素:%
`~`n
% PROMPT='%2~ %# ' dotfiles/zshfunctions %
當您執行%1~
此操做時,它將僅顯示工做目錄的名稱或~
它是否爲主目錄。(%/
例如,這也適用%2/
。)
在提示中添加一些顏色或灰色陰影可使其更具可讀性。在其中,bash
您須要使用隱蔽的轉義碼來切換顏色。zsh
提供了一種更簡單的方法。要將路徑中的目錄變爲藍色,可使用:
PROMPT='%F{blue}%1~%f %# '
該F
表明「前景顏色」。zsh
理解顏色black
,red
,green
,yellow
,blue
,magenta
,cyan
和white
。%F
或%f
重置爲默認文本顏色。此外,Terminal.app將自身表示爲外殼的256色終端。您可使用
% echo $TERM xterm-256color
您能夠經過訪問256調色板%F{0}
經過%F{255}
。表格顯示哪些數字對應哪一種顏色:
所以,因爲我但願在提示符下爲當前工做目錄添加深灰色,所以我選擇了240
,並使用如下%B
代碼將其設置爲粗體:
PROMPT='%B%F{240}%1~%f%b %# '
我寫了整篇文章,介紹如何bash
顯示最後一個命令的用顏色編碼的退出代碼。事實證實,這在中_要_容易_得多_zsh
。
提示代碼之一提供了「三進制條件」,這意味着它將根據條件顯示兩個表達式之一。您可使用幾種條件。再次能夠在文檔中找到詳細信息。
前面的命令退出代碼有一個條件:
%(?.<success expression>.<failure expression>)
<success expression>
當前一個命令成功退出(退出代碼爲零)和<failure expression>
前一個命令失敗(退出代碼爲非零)時,該表達式將使用。所以,創建條件提示很是容易:
% PROMPT='%(?.√.?%?) %1~ %# ' √ ~ % false ?1 ~ %
您能夠√
在美國或國際macOS鍵盤佈局上使用選項-V得到字符。三元組的最後一部分?%?
看起來使人困惑。第一部分?
將打印文字問號,第二部分%?
將替換爲先前命令的退出代碼。
您也能夠在三元表達式中添加顏色:
PROMPT='%(?.%F{green}√.%F{red}?%?)%f %B%F{240}%1~%f%b %# '
另外一個有趣的條件代碼是!
返回是否對shell授予特權(即以root用戶身份運行)。這使咱們能夠將默認提示符號從更改成其餘提示%
,同時以root身份運行時保持警告功能:
% PROMPT='%1~ %(!.#.>) ' ~ > sudo -s ~ # exit ~ >
這是咱們組裝的完整提示,其中解釋了全部部分:
PROMPT='%(?.%F{green}√.%F{red}?%?)%f %B%F{240}%1~%f%b %# '
%(?.√.?%?)
若是返回碼?
爲0,則顯示√
,不然顯示?%?
%?
上一條命令的退出代碼
%1~
當前工做目錄,縮短到~
,僅顯示最後一個1
元素
%#
#
具備root特權,%
不然
%B
`%b`
開始/中止加粗
%F{...}
文字(前景)顏色,請參見表
%f
重置爲默認文本顏色
zsh
還提供了右側提示。它使用與「普通」提示相同的佔位符。使用RPROMPT
變量設置右側提示:
% RPROMPT='%*' √ zshfunctions % 11:02:55
zsh
鍵入長命令時,光標到達時將自動隱藏右提示。您能夠在左側提示中使用全部其餘替換,包括右側提示中的顏色和其餘可視標記。
zsh
包括版本控制系統的一些基本集成。再次有大量但難以理解的文檔描述。
我在「 Pro git」文檔中找到了一個更好,更具體的示例。此示例將在右側提示中顯示當前分支。
我已經更改了示例,以包括存儲庫名稱和分支,並更改了顏色。
autoload -Uz vcs_info precmd_vcs_info() { vcs_info } precmd_functions+=( precmd_vcs_info ) setopt prompt_subst RPROMPT=\$vcs_info_msg_0_ zstyle ':vcs_info:git:*' formats '%F{240}(%b)%r%f' zstyle ':vcs_info:*' enable git
在這種狀況下%b
,%r
它們是分支機構和存儲庫名稱的VCS(版本控制系統)系統的佔位符。
git
除了內置模塊以外,還有其餘快速解決方案,它們可提供更多信息。存儲庫中有一個腳本git
,而且許多較大的zsh
主題項目,例如「oh-my-zsh」和「prezto」,具備各類git status小部件或模塊或主題,或它們所謂的名稱。
您可能會花費不少時間(或浪費時間)來微調提示。這些修改是否真的能夠提升您的生產率是一個問題。