iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 8
1
Software Development

Gosh!原來用 Go 寫一個 Unix Shell 這麼簡單系列 第 8

Day08-Prompt 大改造(二)

今日目標

昨天已經幫 Prompt 加上了 username 跟 hostname 等等資訊,但還是不夠漂亮,所以今天要來幫 Shell 加上一點顏色

跳脫序列(Escape Sequence)

因為要在終端機內顯示顏色需要用到跳脫序列,這邊稍微說明一下

大家應該都知道 \n 是換行而 \t 是 Tab,這類型 \ 開頭的字元被稱做跳脫序列,\n 並不是字面上的 \n 兩個字元,而是有特別的功能,所以如果在終端機裡面 echo -e "Hello\nWorld" 會得到這樣的結果

但除了 \n\t 之外其實還有很多跳脫序列,像下面這個例子 \033[1;36m 可以把之後的字變成青色(Cyan),\033[0m 則是把之後的字恢復原狀,所以只有中間的 Hello\nWorld 被上色

CSI 序列

\033[1;36m\033[0m 這種格式被稱作 CSI 序列,他都是 \033[ 開頭、m 結尾,中間填的是 SGR 參數,可以調整字體的粗細、底線、顏色、背景色等等,比較常用的 SGR 參數 有這幾個

  • 0:重置
  • 1:粗體
  • 30-37:前景色(參考下表)
  • 40-47:背景色(參考下表)

所以 \033[ 33 m 意思是黃色(33)、\033[ 0 m 的意思是是重置(0)

如果有很多個的話中間用分號隔開,所以 \033[ 1;33 m 意思就是粗體(1)、黃色(33)

\033[ 1;33;44 m 則是粗體(1)、黃色(33)、藍色背景(44)

很神奇吧~這些懂了之後就能幫 Shell 上色了

實作

// blue 負責把文字著上藍色
func blue(str string) string {
	return "\033[1;34m" + str + "\033[0m"
}

// yellowWithBlueBG 負責把文字變成藍底黃字
func yellowWithBlueBG(str string) string {
	return "\033[1;33;44m" + str + "\033[0m"
}

func showPrompt() {
    u, _ := user.Current()
    host, _ := os.Hostname()
    wd, _ := os.Getwd()

    // 把 user 跟 host 著成藍色
    userAndHost := blue(u.Username + "@" + host)
    
    // 把 Working Directory 變成藍底黃字
    wd = yellowWithBlueBG(wd)
    
    fmt.Printf("%s %s > ", userAndHost, wd)
}

Demo

這樣就完成我們的超酷炫彩色 Prompt 了,酷吧!!!

小結

原來可以用跳脫序列幫文字上色啊!有沒有覺得長知識了呢?今天的 commit 放在這裡,有什麼問題歡迎提出來,沒問題的話就明天見囉

參考資料


上一篇
Day07-Prompt 大改造(一)
下一篇
Day09-內建指令
系列文
Gosh!原來用 Go 寫一個 Unix Shell 這麼簡單30

尚未有邦友留言

立即登入留言