彩色的Shell


我常在命令行下工作,以前老被同事說"你整天在那個黑窗口上倒騰什么?" 現在這個問題變成了"你這個花花綠綠的窗口是什么東西?"

其實都是同一個東西:一個兼容於xterm的終端窗口,要么是PuTTY/KiTTY,要么是GNOME Terminal/Xfce Terminal/LXTerminal.不過我這半年將很多東西配上了顏色.

倒不是說我想搞得很花哨,而是有彩色的文字夾雜其中的話,文字的辨識度要高一些--你是不是有很多時候在一大段輸出當中找尋提示符上一次出現的位置? 是不是在里面找有沒有某個單詞?

1. Shell本身

1.1 提示符

bash

通過修改環境變量 PS1 實現,只要里面包含適當的ANSI color sequence即可實現彩色.Debian/Ubuntu上bash提示符號默認有一份彩色配置,但要求自己編輯 ~/.bashrc,設置 force_color_prompt=yes 即可(找到 force_color_prompt=yes 這一行並刪除前面的注釋符號).

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
force_color_prompt=yes

CentOS默認沒有彩色配置,可以用這兩個在線工具來配置: .bashrc generator: create your .bashrc PS1 with a drag and drop interface 和 Bash $PS1 Generator 2.0 (后面這個好像被薔了).不過我在一些不想"深度定制"的機器上都是用下面的zsh方法來快速搞定.

zsh

沒仔細研究怎么配置,好像是通過修改環境變量PROMPT實現.不過用zsh的人一般都會用oh-my-zsh或者prezto套件,里面都提供了豐富的配置模板.

不過zsh自帶的也不少(效果參見 Zsh themes for prompts screenshots | blog post ),我在不特別常用的機器上一般都是如下幾行:

autoload -Uz promptinit
promptinit
prompt adam2
# 用 prompt -l 可以列出所有的提示符配置,有興趣可以逐個體驗

我比較喜歡adam2這個,因為它可以醒目地將一次次的輸入輸出分隔開來.

圖片來自: Zsh themes for prompts screenshots | blog post

1.2 命令行語法高亮

曾經試過用 fish 作為日常shell,但最后因為跟bash差異太大而放棄了(太多東西不兼容了,而zsh在兼容bash這方面就非常好),不過fish彩色的命令行給我留下了很深的印象:

但bash上面是搞不了這個功能了,zsh倒是有一個zsh-syntax-highlighting,安裝方法如下:

mkdir -p ~/.zsh/plugins
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ~/.zsh/plugins/zsh-syntax-highlighting
echo "source ~/.zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" >> ~/.zshrc
source ~/.zshrc

2. ls

2.1 ls --color

大多數情況下,你執行 ls --color 就可以了,它會用彩色來區分不同的文件類型.

(此圖來自: More than just colors: My bash settings | blogginess )

你可以添加 alias ls='ls --color=auto' 到你的 ~/.bashrc . auto 這個值可以確保你將 ls 的輸出重定向到一個文件時不會產生問題.

如果你想要詳細了解這個功能,可以閱讀 coreutils 文檔里面的相應章節: GNU Coreutils: General output formatting, GNU Coreutils: dircolors invocation (注意配置文件的詳細說明其實在 dircolors --print-database 這個命令的輸出里面).這里還有一個在線配置工具: LSCOLORS Generator --不過我從來沒去配過細節.

2016/06/02 補充: 默認配置下主要文件類型的對應顏色如下(另外默認配置里面還有不少按擴展名配置的顏色,這里不詳細說明了)

2.2 k

ls --color 基本上是按照文件類型來確定顏色的.如果你想按照文件大小,新舊乃至git 狀態來顯示不同顏色,那么可以用這個針對zsh的小腳本: https://github.com/supercrabtree/k

wget -c https://github.com/supercrabtree/k/archive/master.zip -O k.zip
unzip k.zip
mkdir ~/.zsh/plugins
cp k-master/k.sh ~/.zsh/plugins
source ~/.zsh/plugins/k.sh

然后執行 k 就可以了(不過跟 ls --color  不同的是,顏色不是顯示在文件名上的,而是大小/時間等列.

2016/06/02 補充: 看到兩個ls的彩色版

exa https://github.com/ogham/exa

ls++ https://github.com/trapd00r/ls--

3. 彩色的文檔閱讀

3.1 彩色的manpage閱讀器:

第一個辦法如下,不用安裝任何其它東西(前提是采用 less 作為pager -- 雖然一般情況下默認都是用這個):

	export LESS_TERMCAP_mb=$(tput bold; tput setaf 2) # green
	export LESS_TERMCAP_md=$(tput bold; tput setaf 6) # cyan
	export LESS_TERMCAP_me=$(tput sgr0)
	export LESS_TERMCAP_so=$(tput bold; tput setaf 3; tput setab 4) # yellow on blue
	export LESS_TERMCAP_se=$(tput rmso; tput sgr0)
	export LESS_TERMCAP_us=$(tput smul; tput bold; tput setaf 7) # white
	export LESS_TERMCAP_ue=$(tput rmul; tput sgr0)
	export LESS_TERMCAP_mr=$(tput rev)
	export LESS_TERMCAP_mh=$(tput dim)
	export LESS_TERMCAP_ZN=$(tput ssubm)
	export LESS_TERMCAP_ZV=$(tput rsubm)
	export LESS_TERMCAP_ZO=$(tput ssupm)
	export LESS_TERMCAP_ZW=$(tput rsupm)

然后用 man date  就可以看到彩色的manpage了.

如果覺得這個麻煩,不太容易記得住的話,可以用另一個方法:安裝 most ,然后執行 PAGER=most man date 就能看到彩色的mapage了(你也可以將 export MANPAGER=most 添加到 ~/.bashrc ,這樣以后 man date 就能直接調用這個 most 來閱讀 manpage).

出處: Unix / Linux: Display Color Man Pages

3.2 彩色的texinfo閱讀器

安裝 pinfo 就可以了.

參考: pinfo Linux / Unix Command: Read Info Documentation in Colors

4. git與mercurial的彩色配置

4.1 git

比較新一點的git  (>= 1.8.4,因為該版本中將 ''color.ui'' 的默認值改為了 ''auto'' )都會自動在 git status , git log , git diff 等等地方采用顏色.

如果你的git比較老,可以用下面的方法來開啟顏色支持:

git config --global color.ui auto

當然也可以詳細設置各個子命令是否要啟用顏色支持:

	git config --global color.status always
	git config --global color.grep auto
	git config --global color.diff auto
	git config --global color.branch never
	git config --global color.interactive auto
```sh

詳細的說明請參考 [git -config 的手冊](https://git-scm.com/docs/git-config#_variables)(或者運行  `git config --help `)

參考:
- [Git顯示漂亮日志的小技巧](http://www.coolshell.cn/articles/7755.html)
- [讓Git的輸出更友好: 多種顏色和自定義log格式](https://www.pureweber.com/article/git-pretty-output/%20)

#### 4.2 mercurial

啟用 [Color 擴展](http://mercurial.selenic.com/wiki/ColorExtension) 可以給  `hg status ` ,   `hg log `和  `hg diff ` 添加顏色.

**配置方法**: 編輯  `~/.hgrc `

	[extensions]
	color =

**效果**:  

![](https://bytebucket.org/bamanzi/notes-zim/raw/default/blog/2016/04/colorful-shell/hg-diff-color.png)

具體顏色還可以自行定義,詳情請參考 [ColorExtension 的說明](https://www.mercurial-scm.org/wiki/ColorExtension).


參考: [mercurial的幾個易用性小技巧 - 巴蠻子 - 博客園](http://www.cnblogs.com/bamanzi/p/mercurial-a-few-tips.html)


### 5 高亮輸出中的指定文字

有時候我們需要在一個程序的輸出中找到某個單詞,  `grep --color ` 是比較常用的一個方法:

 `grep --color ` 雖然挺不錯(尤其是不需要另行安裝),但它是一個 **過濾** 工具.然后有些時候我們只是要 **高亮** 輸出中的某些文字,而 **不想過濾** 掉其它行,但很奇怪這樣的訴求沒有在基本工具集里面提供。

#### 5.1 hhighlighter (bash插件)

<<https://github.com/paoloantinori/hhighlighter>>

這是一個bash腳本,它提供了一個h()函數(shell函數也是一種命令),可以用來高亮

安裝:

```sh
	  apt-get install ack-grep
	  # or: curl http://beyondgrep.com/ack-2.14-single-file > ~/bin/ack && chmod 0755 ~/bin/ack
	  mkdir -p ~/.bash/plugins/
	  wget 'https://github.com/paoloantinori/hhighlighter/raw/master/h.sh' -O ~/.bash/plugins/h.sh
	  echo "source ~/.bash/plugins/h.sh"
	  source ~/.bash/plugins/h.sh

使用:

  $ h
  usage: YOUR_COMMAND | h [-i] [-d] pattern1 pattern2...
  	-i : ignore case
  	-d : disable regexp
  	-n : invert colors

說明: hhighlighter傳遞多個參數時,每個參數會自動采用不同的顏色來高亮

5.2 colorex

<https://github.com/Scopart/colorex/>

這個小工具跟 hhighlighter 功能差不多,區別主要在實現層面: colorex是采用python實現的,而且是個獨立腳本,比較容易在其它shell下面用.另外,它也不需要其它工具(比如hhighlighter需要ack)

安裝:

  wget 'https://github.com/Scopart/colorex/raw/master/colorex' -O ~/bin/colorex
  chmod a+x ~/bin/colorex

使用:

	  # to display every word "ERROR" in red of foo.txt
	  colorex --red ERROR foo.txt
	
	  # to watch logfile.txt displaying "WARNING" in yellow and "INFO" in green
	  tail -f logfile.txt | colorex -y WARNING --green INFO
	
	  # to display "(" and ")" contained in foo.txt in blue
	  colorex -b '\(|\)' foo.txt

略微有點不爽的是,必須指定顏色參數,多個關鍵字時得指定多個顏色參數(不要被 colorex --help 顯示的 -N 參數誤導了,雖然它說是 " display with random colors  ",但並不是我們通常理解的隨機選用一個顏色 😦)

參考: https://inconsolation.wordpress.com/2014/08/03/colorex-i-might-as-well-include-them-all/

6. 支持語法高亮的編輯器

6.1 vim

首先確認你的vim是支持語法高亮的.確認方法是執行 :version 查看里面 syntax 一項是 +syntax 還是 -syntax ,如果是后者就說明語法支持沒有編譯進來(另一種方法是執行 :syn ,如果得到錯誤信息 E319: Sorry the command is not available in this version  也說明不支持),你得安裝其它版本(比如Ubuntu默認安裝的 vim-tiny 版本是一個精簡版不支持語法高亮,得再用 apt-get install vim 安裝功能比較全的版本)或者重新編譯.

然后就是開啟語法高亮,打開文件之后執行 :syn on 即可.

如果你想默認開啟此項,則可以把 syn on 放到 ~/.vimrc 里面(如果你從來沒有編輯過 .vimrc , 那么我推薦你拷貝一個vim推薦配置: cp /usr/share/vim/vim7x/vimrc_example.vim ~/.vimrc

vim能夠根據文件擴展名或者shebang (即文件頭部的 #!/usr/bin/python )來識別文件類型,如果沒有正確識別的話,你可以用 :set filetype=python 這個命令來強制vim 按python語法高亮當前文件(如果你期望vim下次打開時還是按python語法來對待當前文件,可以在文件頭部或者尾部添加一行 # vim: set filetype=python (這一個包含了vim選項的行在vim里面稱為modeline))

參考: Vim參考手冊: 語法高亮 Vim參考手冊: 文件類型

6.2 nano

我一直以為 nano 是不支持語法高亮的,所以對於為什么Cannonical會選擇nano作為默認的編輯器感到奇怪:一個這么弱的編輯器居然還...不過后來才發現我錯了(主要是我一直只用vim和emacs,程序用其它編輯器打開文件后我就趕緊退出來設置環境變量 EDITOR 了之后再進去 😃

nano 自帶了十來種常見編程語言的語法高亮配置,配置文件在 /usr/share/nano 目錄下,但需要你將它們 include 到你的 ~/.nanorc 才能起作用(Debian和Ubuntu在 /etc/nanorc 里面已經默認包含了,但CentOS里面沒有)

6.3 joe

joe 是我很喜歡的編輯器,因為僅僅1M的體積,但可以模擬一個微型的Emacs來用(joe可以模擬好幾種編輯器: Emacs, WordStar, Pico--而nano其實是模仿了Pico),而且屏幕上會顯示常用快捷鍵提示,另外 F1/F2/F3/F4 調用shell很方便(這個功能需要4.0版本以上).

當然,它還支持語法高亮,支持40多種編程語言和(這是Debian 7/8, Ubuntu 12.04/14.04和CentOS 6 (epel)里面所帶的3.7版本的情況,而到了4.1版本已經增長了70多種.joe的編譯安裝相當簡單,所以推薦使用最新版本,不想自己編譯的也可以自己添加一些新的語法高亮配置: https://github.com/cmur2/joe-syntax


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM