轉到zsh,第6部分–自定義zsh提示

轉到zsh,第6部分–自定義zsh提示

蘋果已經宣佈,在macOS 10.15 Catalina中默認外殼爲zshhtml

在本系列中,我將記錄我將bash設置,配置和腳本移至的經驗zshgit

本系列 已發展成一本書:進行了從新設計,並擴展了更多詳細信息和主題。 與其餘書籍同樣,我計劃在發行後也進行更新和添加,以保持其相關性和實用性。您如今 能夠在Apple Books Store上訂購它

正如我在前面的帖子中所提到的,我知道有不少解決方案能夠爲您提供預先配置的「捷徑」,從而使您zsh受益不淺。可是我有興趣學習這種沒有捷徑的「艱難方式」。叫我老式。(「上坡!在雪中!雙向!」)github

bashmacOS上的默認提示很是詳盡。它顯示用戶名,主機名_和_當前目錄。shell

Calypso:~ armin$

另外一方面,默認的bash提示符不顯示前一個命令的退出代碼,我發現這條信息很是有用。在從新配置bash提示以獲取所需信息以前,我已經寫了如下內容:express

固然,我想在中從新建立相同的體驗zshmacos

最小的Zsh提示

bash提示惟一(視覺上)的區別是% 而不是$vim

注意:建立文件 ~/.hushlogin將在每一個終端會話開始 zsh以及以後 bash(或任何其餘Shell中)禁止顯示狀態消息。

基本提示配置

儘管使用不一樣的語法,但基本zsh提示配置的工做原理與類似bash手冊中詳細zsh描述不一樣的佔位符。bash

zsh使用相同的shell變量PS1存儲默認提示。可是,變量名PROMPTprompt是它們的同義詞PS1,您將在各類示例中看到這三個變量中的任何一個。我要用PROMPTapp

中的默認提示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理解顏色blackredgreenyellowbluemagentacyanwhite%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鍵入長命令時,光標到達時將自動隱藏右提示。您能夠在左側提示中使用全部其餘替換,包括右側提示中的顏色和其餘可視標記。

Git集成

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小部件或模塊或主題,或它們所謂的名稱。

摘要

您可能會花費不少時間(或浪費時間)來微調提示。這些修改是否真的能夠提升您的生產率是一個問題。

相關文章
相關標籤/搜索