原文地址
https://zh.opensuse.org/SDB:Zsh
1 為什么要使用 Zsh捧弃?
為什么要使用 Mac OS X篓跛?因?yàn)樗保∷痹谀膬毫顺荩拷K端還不一樣是 Bash歼冰。比 Mac OS X 終端還潮的終端靡狞!要不要?
1.1 Zsh 相比 Bash 的優(yōu)點(diǎn)隔嫡?
要說優(yōu)點(diǎn)甸怕,首先說缺點(diǎn),缺點(diǎn)就是配置上太過復(fù)雜了畔勤。提供了太多的定制選項(xiàng)就會像SDB:字體顯示一樣蕾各,配置得漂亮與否,沒法評價庆揪,因?yàn)槿魏稳硕寄苌鲜謥砀銉上隆penSUSE 是主打易用性的系統(tǒng)妨托,因此本文將盡量的降低難度缸榛,弱化定制選項(xiàng)的作用,而盡量去尋找一些還過得去的預(yù)制腳本兰伤。
根據(jù) Zsh 官方網(wǎng)站的 FAQ, Zsh 相比 Bash 的優(yōu)點(diǎn)(它沒有明說内颗,但很明顯它就是對照著 Bash 開發(fā)的)是:
- 命令行編輯
- 可編程的補(bǔ)全:整合了 zsh 強(qiáng)大的通配和 shell 編程特性,
- 可將多行命令作為一個緩沖區(qū)編輯(文件也可以6厍弧)均澳,
- 變量編輯 (vared),
- 命令緩沖堆棧符衔,
- 直接將文本打印到緩沖區(qū)以立即編輯 (print -z)找前,
- 執(zhí)行未綁定的命令,
- 兩種風(fēng)格的菜單補(bǔ)全判族,
- 變量躺盛,編輯功能和選項(xiàng)名稱的補(bǔ)全,
- 變量和歷史命令的內(nèi)聯(lián)展開形帮。
- 通配 --- 異常強(qiáng)大槽惫,包括:
- 遞歸通配 (對比 find 命令),
- 文件屬性限定符 (大小辩撑,類型界斜,等等,也是對比 find 命令)合冀,
- 完整的變更和否定模式各薇。
- 能處理多重重定向 (比 tee 命令簡單)
- 大量定制選項(xiàng)
- 路徑展開 (=foo -> /usr/bin/foo).
- 拼寫,監(jiān)視 (watch)水慨,時間和提示符消息的適應(yīng)性很強(qiáng)(包括條件表達(dá)式)
- 目錄命名
- 縝密的整形和浮點(diǎn)算法
- 控制矩陣 (包括反向下標(biāo))
- 關(guān)聯(lián)矩陣 [鍵-散列值 (Hash) 映射]
- 拼寫檢查
2 安裝
Zsh 已被 openSUSE 收錄得糜,是默認(rèn)安裝的 shell敬扛,只是大家一直沒有用。如果已經(jīng)卸載的朝抖,可以使用
sudo zypper in zsh
重新安裝啥箭。
3 配置
正常情況下,在一個命令行環(huán)境中運(yùn)行 zsh 就會彈出新手向?qū)е涡瑢?yīng)該向?qū)Ъ纯赏瓿膳渲谩?/p>
但我們不準(zhǔn)備使用這個向?qū)Ъ苯模菧?zhǔn)備使用 oh-my-zsh 這個項(xiàng)目的預(yù)制腳本。
oh my zsh 是一個 zsh 配置交流社區(qū)侮邀,主要通過 Github 來收錄配置坏怪。安裝后還可以每周自動更新(因?yàn)槭?Git 嘛)。
下面以 Konsole 為例绊茧,Gnome terminal 或 Xterm 等可能有所差別铝宵,但原理相同。
3.1 下載 oh-my-zsh
3.1.1 自動安裝
- curl 方法
curl -L [https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh](https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh) | sh
- wget 方法(有些人的系統(tǒng)上沒裝 curl)
wget --no-check-certificate [https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh](https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh) -O - | sh
3.1.2 手動安裝
在 $USER 也就是你的私人主文件夾下:
- 安裝 Git:
sudo zypper in git
- 擷取 oh-my-zsh
git clone [https://github.com/robbyrussell/oh-my-zsh.git](https://github.com/robbyrussell/oh-my-zsh.git) ~/.oh-my-zsh
- 備份現(xiàn)有的 zsh 配置
mv .zshrc .zshrc.orig
- 使用 oh-my-zsh 的配置
cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc
3.2 將 Zsh 設(shè)置為默認(rèn) Shell
常規(guī)方法:
chsh -s /bin/zsh
然后輸入當(dāng)前用戶密碼华畏。不要使用 sudo 執(zhí)行它鹏秋,因?yàn)槟菢幼訐Q掉的是你 root 根用戶的默認(rèn) shell,你的還是 bash亡笑。
但這種方法在 Konsole 中是行不通的侣夷。
3.2.1 Konsole 修改默認(rèn) Shell
“設(shè)置”-“編輯當(dāng)前方案”-“常規(guī)”-“命令”,把 /bin/bash 改成 /bin/zsh仑乌。
順路把圖標(biāo)也換了吧百拓?用 Zsh 就要更個性一點(diǎn)么。
3.2.2Konsole 更換 Zsh 圖標(biāo)
下載這個文件 zsh.svgz晰甚,然后安裝 rsvg-view 或 inkscape衙传。
rsvg-convert -w 256 zsh.svgz -o 256.png
inkscape 是將 svgz 打開后,使用“文件”-“導(dǎo)出”-“頁面”压汪,然后填寫尺寸即可粪牲。
將 256 改為 16,22,24,32,48,64,72,96,128,會制作出各種格式的 png 圖標(biāo)止剖。然后將對應(yīng)格式的圖標(biāo)放到 /usr/share/icons/hicolor/256x256/apps 文件夾下腺阳,例如:
sudo cp -r 256.png /usr/share/icons/hicolor/256x256/apps/zsh.png
將 svgz 復(fù)制到 /usr/share/icons/hicolor/scalable/apps 文件夾下。
然后在 Konsole 的“設(shè)置”-“編輯當(dāng)前方案”-“圖標(biāo)”里面改圖標(biāo)穿香。
3.3 配置 oh-my-zsh
3.3.1 主題
主題目錄在 ~/.oh-my-zsh/themes亭引,下面有好多主題,主題的預(yù)覽在這里可以看到:
https://github.com/robbyrussell/oh-my-zsh/wiki/themes
應(yīng)用主題的方法是:
vi .zshrc
修改 ZSH_THEME="miloshadzic" 為你想要的主題名稱皮获。
注意
有些主題是 256 色的焙蚓,Konsole 默認(rèn)是 16 色。如果顏色與預(yù)覽不對的話,請見下面的 Konsole 256 色章節(jié)购公。
3.3.2 插件
插件目錄在 ~/.oh-my-zsh/plugins萌京,下面有好多插件,默認(rèn)開啟的是 Git 插件宏浩。應(yīng)用插件的方法是:
vi .zshrc
可以看到 plugins=(git opensuse marguerite) 這樣的字段知残,對應(yīng)添加插件文件夾的名稱就可以了。
openSUSE 相關(guān)的插件請見下面比庄,目前主要有 編譯服務(wù) 相關(guān)的插件和 zypper 相關(guān)的插件求妹。
3.4 刪除 oh-my-zsh
進(jìn)入 ~/.oh-my-zsh/tools,下面有個 uninstall.sh佳窑,但是它沒有執(zhí)行權(quán)限制恍,改一下:
chmod +x uninstall.sh
然后執(zhí)行它:
./uninstall.sh
就會自動卸載掉 oh-my-zsh。
3.5 恢復(fù) Bash
不想用 Zsh 了神凑?很簡單:
chsh -s /bin/bash
就換回來了净神。Konsole 一樣要用上面的方法。
3.6 自定義別名(Alias)
在 ~/.oh-my-zsh/custom 下的 example.zsh 中可以定義你自己的別名耙厚,比如將 /home/marguerite/Public/home:MargueriteSu 這種長路徑定義為一個簡短好記的別名强挫,比如:
mrepo=/home/marguerite/Public/home:MargueriteSu
4 定制
以下定制基于 oh-my-zsh,略加調(diào)整后可應(yīng)用于原生的 Zsh薛躬。
4.1 Konsole 256 色
Konsole 原生是 16 色的,也就是只能顯示像煤球黑呆细,瞎眼白這樣的純色型宝。
修改方法是“設(shè)置”-“編輯當(dāng)前方案”-“環(huán)境”,將里面內(nèi)容替換成 TERM=xterm-256color 即可絮爷。
4.2 Konsole 光標(biāo)閃爍
“設(shè)置”-“編輯當(dāng)前方案”-“高級”-“光標(biāo)”-“閃爍光標(biāo)”趴酣。
4.3 Konsole 字體
安裝 M17N 倉庫的 kde-oxygen-fonts 或 ubuntu-fonts,然后在
“設(shè)置”-“編輯當(dāng)前方案”-“外觀”-“字體”中修改坑夯,記得勾選“平滑字體”和“用粗體繪制強(qiáng)調(diào)色”岖寞。
注意
字體須選擇 mono 類型的字體,也就是等寬字體柜蜈。不用考慮漢字仗谆,漢字是用你安裝的中文字體來顯示的,詳情見SDB:字體顯示淑履。
4.4 主題制作
4.4.1 Konsole 主題
oh-my-zsh 不是神隶垮,它設(shè)置不了你的終端顏色,只能使用現(xiàn)有的終端顏色秘噪。因此需要先制作一個 Konsole 主題來規(guī)定顏色狸吞。
“設(shè)置”-“編輯當(dāng)前配置方案”-“外觀”-“新建”,輸入一個名字,“背景透明度”和“背景圖片”自選蹋偏。
4.4.1.1 Linux 終端配色機(jī)制
首先它只有 20 個顏色便斥,前面所謂的 256 色,指的是能夠顯示 256 種顏色威始,而不是可以使用 256 個顏色枢纠。
分別是:前景 (foreground)、背景 (background)字逗、黑 (Black)京郑、紅 (Red)、綠 (Green)葫掉、黃 (Yellow)些举、藍(lán) (Blue)、品紅 (Magenta)俭厚、青 (Cyan)户魏、白 (White) 以及它們分別對應(yīng)的強(qiáng)烈色版本。
這里需要注意的是它們的原始名稱和原始位置挪挤,至于這個名稱代表的名義顏色則不是很重要叼丑,比如你將“紅”(Red) 定義為 #9c0,后者實(shí)際上是 openSUSE 淡綠扛门,但你在下面的 oh-my-zsh 主題中想提到這個 openSUSE 淡綠的時候鸠信,還是要用 %{$fgcolor[red]%} 也就是“紅”而不是“綠”(green) 來提它。
換句話說论寨,你可以將它們理解為 8 個占位符星立,顏色 1 ~ 顏色 8,只是這些占位符的名字就叫做紅、綠等等葬凳。而占位符的位置是非常重要的绰垂,比如強(qiáng)烈藍(lán),實(shí)際上的位置是顏色 13火焰,顏色 9 ~ 顏色 16 都是強(qiáng)烈色(前景背景不算進(jìn)顏色序列中)劲装,用來在加粗、語法高亮昌简、選中等特殊情況下顯示占业。而 KDE 就規(guī)定了使用顏色 13 來顯示文件夾,那么你把藍(lán)江场,也就是顏色 5 定義的再漂亮纺酸,也沒法用于顯示文件夾。
4.4.1.2 配色指南
有很多在線分享配色的網(wǎng)站址否,比較著名的是 colourlovers 和 Adobe kuler餐蔬。
- 10 Resources for Creating Website Color Schemes
- 10 Sites to Play with Colors and Create Color Palettes
這兩個鏈接幾乎囊括了全部類似網(wǎng)站碎紊。自己審美有問題配不好的話,可以使用這些網(wǎng)站上的分享樊诺。
但是有一個缺陷就是它們幾乎都沒有提供強(qiáng)烈色仗考,也就是相近色,折衷的方法是使用 KColorChooser 自己來微調(diào)出強(qiáng)烈色:
在 KColorChooser(內(nèi)嵌在 Konsole 的顏色配置中词爬,不用另開)中輸入了一個獲取到的網(wǎng)頁顏色代碼 (#abcdef) 后秃嗜,界面上有一個條帶,顯示了該顏色的所有強(qiáng)度的顏色顿膨,挑一個就好锅锨。
4.4.1.3 導(dǎo)出配色
保存之后,新建的配色方案放在 $USER 也就是你的個人主文件夾下的 ~/.kde4/share/apps/konsole/ 下恋沃,名稱為 *.colorscheme必搞。將它上傳到比如 kde-look.org 這樣的網(wǎng)站就可以與他人共享你的配色啦。
4.4.2 oh-my-zsh 主題
制作 oh-my-zsh 主題的方法是在 ~/.oh-my-zsh/themes/ 下面放一個名為 主題名.zsh-theme 的純文本文件囊咏。
由于顏色不能在這里定義恕洲,而只能在這里使用,我們需要定義的實(shí)際上只有 oh-my-zsh 特有的一些補(bǔ)全功能的顏色顯示和提示符的格式梅割。比如我的象征第四帝國的萬字提示符 卐 就是在這里定義的霜第。下面是一個樣板:
# Name:
# Version:
# License:
# Author:
# Description:
ZSH_THEME_GIT_PROMPT_PREFIX="%{$reset_color%}%{$fg[blue]%}"
ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%} "
ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[yellow]%}?%{$reset_color%}"
ZSH_THEME_GIT_PROMPT_CLEAN=""
PROMPT='%{$fg[yellow]%}%*%{$reset_color%} %{$fg[magenta]%}%n%{$reset_color%} at %{$fg[green]%}%~%{$reset_color%} $(git_prompt_info)say%{$fg[cyan]%}:
卐 %{$reset_color%}'
以 # 開頭的是注釋,不會顯示户辞。
ZSH_THEME_GIT_PROMPT_PREFIX 這個是在 ~/.oh-my-zsh/lib 下面的定義的宏泌类,具體支持哪些也可以去下面看。定制的這個宏的顯示只有在啟用了相應(yīng)插件的情況下才會有用底燎。
顏色語法:%{$fg[yellow]%} 和 %{$reset_color%} 是一對末誓,中間夾住的文字或符號會用 yellow 代表的顏色來顯示。顏色的說明見上书蚪,必須使用小寫標(biāo)準(zhǔn)英文名稱。
4.4.2.1 提示符變量
除非想顯示固定文字迅栅,否則提示符中都應(yīng)該使用變量:
常用
- %n 用戶名
- %M 主機(jī)名(主機(jī)名可以在“YaST”-“網(wǎng)絡(luò)設(shè)備”-“網(wǎng)絡(luò)服務(wù)”中設(shè)置殊校,比如 marguerite@earth 的 earth 而不用默認(rèn)的 linux)
- %m 主機(jī)名,截取第一個空格前的內(nèi)容(比如主機(jī)名為 the underground world读存,那么只有 the 會顯示)
- %l 當(dāng)前 tty(虛擬終端中沒用为流,只有 init 3 模式下才有用)
- %? 最后使用的命令的返回結(jié)果
- %# 基于用戶權(quán)限的提示符,root 用戶返回 #让簿,其他用戶返回 %敬察。(需要當(dāng)前用戶和根用戶的 Shell 都是 zsh,不然 root 用戶的時候用的還是 bash尔当,就沒有意義)
時間
- %T 系統(tǒng)時間 HH:MM(小時:分鐘 格式)
- %* 系統(tǒng)時間 HH:MM:SS(小時:分鐘:秒 格式)
- %D 系統(tǒng)日期 YY-MM-DD(年-月-日 格式)
路徑
- %~ 當(dāng)前所在工作路徑莲祸,要是用戶根目錄的話則直接顯示 ~
- %d 主要用于顯示特定級數(shù)的文件夾蹂安,比如 %1d 在 /home/marguerite/Downloads 時只會顯示 Downloads,%-1d 則無論何時都顯示成 /
格式化
- %U[文字]%u 下劃線(注意锐帜,前面的字母是大寫田盈,后面的是小寫)
- %B[文字]%b 加粗
- %{[文字]%} 完全不顯示(這回知道顏色語法的意義了吧。)
4.4.2.2 文字符號
你可以使用文字符號來替換 bash 中默認(rèn)的 "~#:"缴阎,一些可用的文字符號可見:
比如我的:
18:28:45 marguerite at ~/Downloads say:
卐
你也可以用 ? ? ? 來美化你的哦允瞧。
4.5 插件制作
制作插件的方法是在 ~/.oh-my-zsh/plugins 下面創(chuàng)建一個名稱叫“插件名”的文件夾,文件夾中是一個名為 插件名.plugin.zsh 的純文本文件蛮拔。
插件主要用到是 Shell 語法的 alias(別名)機(jī)制述暂。也就是說將復(fù)雜命令簡單化。比如這條命令:
osc build openSUSE_12.2 x86_64 presage.spec --local
通過定制 Shell 變量和 alias 機(jī)制:
## Get openSUSE Version
VERSION=`cat /etc/SuSE-release | grep VERSION | cut -d ' ' -f 3`
ARCH=`uname -m`
# work around for i686 kernel.
test "$ARCH" = i686 && ARCH=i586
alias bu="osc build --local openSUSE_$VERSION $ARCH"
就可以簡化為:
bu presage.spec
后面的 presage.spec 是可以自動補(bǔ)全的建炫,你只需要輸入 p + [tab] + s 就可以了畦韭。這樣,原來的 41 個字母(51 - 10 因?yàn)?spec 能自動補(bǔ)全踱卵,如果應(yīng)用了 osc 的自動補(bǔ)全的話還可以少廊驼,但無論如何不會少于 4)就簡化為了 4 個字母。
定義變量沒辦法講惋砂,主要都是基本的終端命令妒挎,比如 ls,grep西饵,cat酝掩,sed,test眷柔,echo 等以及管道也就是 "|" 符號的運(yùn)用期虾。基本語法就是定義變量的等號 "=" 兩邊都必須頂住驯嘱,使用變量要加 $镶苞。然后 ' " ` 標(biāo)點(diǎn)的嵌套使用,以及基本處理原則就是先出現(xiàn)的先處理鞠评,同行的從左到右處理茂蚓。
alias 的語法是:
alias 你要定義的命令="原始命令"
它可以定義任何不沖突的東西,比如:
alias m="marguerite"
4.5.1 沖突檢測
如果你定義的別名和系統(tǒng)中有的相沖突剃幌,那兩者都沒法使用聋涨,所以定義前需要檢測一下 /bin 和 /usr/bin 以及或有的 /usr/local/bin 下有沒有相關(guān)的指令,檢測的方法是到相應(yīng)的文件夾中:
ls | grep 你要檢測的命令
其中 ls 是列出全部內(nèi)容负乡,然后通過一個管道 "|" 把列出的結(jié)果傳遞給 grep牍白,grep 從中提取出你要檢測的命令并最終顯示。
4.6 高級插件
當(dāng)然抖棘,Zsh 的功能不止這些茂腥,它可以配合 Shell 語法或其他腳本語言如 Perl狸涌、Python、Ruby 等做到任何事情础芍,比如電源顯示杈抢,比如網(wǎng)絡(luò)連接強(qiáng)度,可以說是命令行的 Conky 了仑性。具體制作方法要求比較高惶楼,需要懂 Shell 語法或腳本語言,因此不一一贅述诊杆。作為啟蒙歼捐,有興趣的人可以去看參考鏈接三的那篇文章。
4.6.1 歡迎添加
4.7 openSUSE 插件
可從 marguerite's oh-my-zsh 取得該插件晨汹。(因?yàn)楣俜?oh-my-zsh 暫停擴(kuò)容了豹储,合并不進(jìn)去)
目前有 osc 的插件和 zypper 的插件,基本命令如下:
- osc 相關(guān)
命令 | 用法 | 用途 |
---|---|---|
bu | bu example.spec | 本地編譯軟件包 |
change | change | 書寫軟件包修訂日志 |
add | add example-version.tar.gz | 添加文件到編譯服務(wù)上傳序列 |
del | del example.patch | 刪除項(xiàng)目控制的某個文件 |
rdel | rdel example_project example_package | 遠(yuǎn)程從 OBS 上刪除軟件包 |
commit | commit | 上傳編譯服務(wù)上傳序列的內(nèi)容到 OBS 編譯服務(wù)進(jìn)行編譯 |
submit | submit source_project source_package destination_project | 把軟件包提交給某個倉庫 |
status | status | 查看當(dāng)前編譯服務(wù)上傳序列和文件修訂情況 |
viewlog | viewlog | 查看本地編譯日志淘这,用于排錯 |
mkpac | mkpac package | 新建軟件包項(xiàng)目用于制作軟件包 |
fork | fork orig_prj orig_pkg dest_prj | 派生一個軟件包 |
get | get prj pkg | 從服務(wù)器上擷取一個軟件包的編譯環(huán)境 |
kick | kick prj pkg | 會對相應(yīng)軟件包發(fā)送一個 deleterequest |
getrpm | getrpm prj pkg arch | 獲取相應(yīng)的 rpm |
wiperpm | wiperpm prj pkg | 從服務(wù)器上刪除生成的 rpm |
prjmeta | prjmeta project | 修改項(xiàng)目元數(shù)據(jù) |
pkgmeta | pkgmeta package | 修改軟件包元數(shù)據(jù) |
obssearch | osbsearch something | 在 OBS 上搜索軟件包剥扣、項(xiàng)目等 |
restore | restore prj pkg | 恢復(fù)之前刪除的軟件包 |
update | update | 更新當(dāng)前編譯環(huán)境,與服務(wù)器同步 |
list_my | list_my | 列出你介入的 request |
accept | accept ID | 接受某 ID 的請求 |
reject | reject ID | 拒絕某 ID 的請求 |
okrev | okrev ID | 復(fù)核同意 |
norev | norev ID | 復(fù)核拒絕 |
- zypper 相關(guān)
命令 | 用法 | 用途 |
---|---|---|
zpdup | zpdup | 系統(tǒng)升級 |
zpref | zpref | 刷新所有軟件源 |
zpin | zpin package | 安裝軟件包 |
zprm | zprm package | 刪除軟件包 |
zpup | zpup (package) | 更新軟件包或系統(tǒng)更新 |
zpar | zpar repo_url repo_nick | 添加軟件源 |
zprr | zprr repo_nick | 刪除軟件源 |
zplr | zplr | 列出所有軟件源 |
zpmr | zpmr repo | 修改軟件源 |
zppa | zppa patch | 給系統(tǒng)打補(bǔ)丁 |
zplu | zplu | 列出可用的更新包 |
zplp | zplp | 列出需要且可用的補(bǔ)丁 |
zpse | zpse pkg | 搜索軟件包 |
zpal | zpal pkg | 將軟件包鎖定在當(dāng)前版本 |
zprl | zprl pkg | 解除某軟件包的版本鎖定 |
4.7.1 OBS 倉庫全名的自動補(bǔ)全
注意
這是錯的铝穷。會導(dǎo)致 Konsole 瞬間關(guān)閉钠怯。但原理對。只是需要將 complete 移植到 zsh曙聂。
sudo cp -r /usr/lib/osc/complete /etc/zsh_completions.d
5 高級應(yīng)用
- 自動補(bǔ)全 教你使用zsh之=======zsh的文件名替換和自動補(bǔ)全
- 創(chuàng)建自己的自動補(bǔ)全 Easy Zsh Auto Completion