為 win10 打造 Linux 終端(非 wsl)

xnng發表於2018-10-28

為 win10 打造 Linux 終端(非 wsl)

本文中的部分內容可能過期,最新配置請前往 github 檢視:github.com/xnng/my-git…

1. 前言

由於某些特殊原因,習慣用 Linux Shell 的開發者會在 Windows 上做開發。

這個時候就需要一套好用的 Linux 終端 + Linux 環境

本文只討論 Linux 終端。

至於在 Windows 上使用 Linux 環境,無非就是跑專案的時候想跟別的環境保持一致,或者安裝某些 windows 上不太好用的軟體,比如 Redis、Nginx 等。我認為 Docker for Windows 目前來說是最佳解決方案。當然你也可以在自帶的虛擬機器 Hvper-V 或者第三方虛擬機器 VmWare 上安裝 Linux 作業系統,再或者 Linux 子系統 WSL 你也可以玩一下,不差錢的話伺服器也是一個很棒的選擇。總之只要你想折騰,Windows 上不會缺 Linux 環境。

不缺 Linux 環境,難道缺 Linux 終端嗎?

其實也不缺,Cmder、xShell、ConEmu 這些比較主流的終端我也都玩過一段時間。但是最後發現,其實沒有必要那麼麻煩,Windows 自帶就有一個非常 nice 的終端,只是缺乏改造而已。

我想說的 Windows 自帶的終端其實是 Git Bash,嚴格意義上來說它並非自帶,但它是每個程式設計師必裝的軟體,所以我且當它是自帶的了。

所以這篇文章都是在說怎麼進化它,不用擔心,進化也並不麻煩,幾條甚至一條命令的事。

2. 我喜歡用的終端是什麼樣子的?

Git Bash 基於 mintty,有 Linux 檔案系統,還有常用的一些 Linux 命令。它的效能也很高,還能很方便的嵌入到各種開發工具中。這是我選擇它的理由。

但它也有一些缺點,比如太醜了、不能開多標籤、缺乏某些重要的命令。只要解決這些問題,那麼它就是我心目中的完美終端。

3. 從設定快捷鍵開始

為了能夠快速開啟 Git Bash,我建議下給它設定一個全域性快捷鍵。

  • 按 Win 鍵,然後搜尋 Git Bash,點選「開啟檔案所在位置」

為 win10 打造 Linux 終端(非 wsl)

  • 右鍵快捷方式,點選「屬性」,然後在這裡設定一個快捷鍵,同時點選「高階」,把「以管理員身份執行」勾上,後面會在終端上改檔案,勾選它可以避免很多麻煩。

為 win10 打造 Linux 終端(非 wsl)

  • 解決快捷鍵延遲問題

    這個時候你可能會遇到一個問題,按下快捷鍵終端會延遲 3 秒才開啟。這是某些版本的 windows 上普遍存在的的一個 bug。

    直接按 Win 鍵,搜尋「服務」並開啟,找到 sysMain,禁用它並重啟電腦可解決。

為 win10 打造 Linux 終端(非 wsl)

這個服務如果找不到,就找它的舊名 superFetch,此服務其實是針對機械硬碟的快取服務,對固態沒用,可以放心禁用掉。

4. 修改命令提示符

預設的 Git Bash 長這樣,自帶的一些主題配色倒還能接受,但是這個命令提示符前的那一長串也太礙眼了,先來簡化這個命令提示符吧。

為 win10 打造 Linux 終端(非 wsl)

以下所有命令都需要在 Git Bash 中執行

下面這個檔案是跟命令提示符有關的

$ vim /etc/profile.d/git-prompt.sh
複製程式碼

如果不熟悉 vim,並且電腦上裝了 VSCode,可以用以下命令開啟檔案

$ code /etc/profile.d/git-prompt.sh
複製程式碼

將其修改為如下內容

if test -f /etc/profile.d/git-sdk.sh
then
	TITLEPREFIX=SDK-${MSYSTEM#MINGW}
else
	TITLEPREFIX=$MSYSTEM
fi

if test -f ~/.config/git/git-prompt.sh
then
	. ~/.config/git/git-prompt.sh
else
	PS1='\[\033]0;Bash\007\]'      # 視窗標題
	PS1="$PS1"'\n'                 # 換行
	PS1="$PS1"'\[\033[32;1m\]'     # 高亮綠色
	PS1="$PS1"'➜  '               # unicode 字元,右箭頭
	PS1="$PS1"'\[\033[33;1m\]'     # 高亮黃色
	PS1="$PS1"'\W'                 # 當前目錄
	if test -z "$WINELOADERNOEXEC"
	then
		GIT_EXEC_PATH="$(git --exec-path 2>/dev/null)"
		COMPLETION_PATH="${GIT_EXEC_PATH%/libexec/git-core}"
		COMPLETION_PATH="${COMPLETION_PATH%/lib/git-core}"
		COMPLETION_PATH="$COMPLETION_PATH/share/git/completion"
		if test -f "$COMPLETION_PATH/git-prompt.sh"
		then
			. "$COMPLETION_PATH/git-completion.bash"
			. "$COMPLETION_PATH/git-prompt.sh"
			PS1="$PS1"'\[\033[31m\]'   # 紅色
			PS1="$PS1"'`__git_ps1`'    # git 外掛
		fi
	fi
	PS1="$PS1"'\[\033[36m\] '      # 青色
fi

MSYS2_PS1="$PS1"
複製程式碼

效果如下:

為 win10 打造 Linux 終端(非 wsl)

命令提示符被修改成了,右箭頭 + 當前目錄,這個非常像 oh-my-zsh 的預設主題,文字的顏色也改成了青色,視窗的標題也被簡化了。

改的地方不多,就幾行,都有註釋,如果想自行修改可以參考這篇文章,寫的很詳細。

解決 Unicode 字元顯示異常問題

這裡其實還有個坑。某些版本的 Win 10 存在 Unicode 字元顯示異常的問題,比如 1809,具體的表現是,上面的那個右箭頭會顯示成方框。改編碼方式是無效的,修改字型可解決。

點選這裡下載 DejaVu Sans Mono 字型

執行以下命令,會開啟字型資料夾,將字型託進去會自動安裝,然後將修改 Git Bash 的字型就能正常顯示 Unicode 字元了。(start 是 cmd 所提供的命令)

$ start c://Windows//Fonts
複製程式碼

為 win10 打造 Linux 終端(非 wsl)

5. 修改主題

Git Bash 自帶的那一套主題我是不太喜歡的,所以我自己改了一套,在使用者目錄下建立 .minttyrc 並寫入以下內容即可

注意:這個檔案中的第一行設定了字型,此字型如果上面沒有安裝的話,就把這行刪了,否則會報錯

$ vim ~/.minttyrc
複製程式碼
Font=DejaVu Sans Mono for Powerline
FontHeight=14
Transparency=low
FontSmoothing=default
Locale=C
Charset=UTF-8
Columns=88
Rows=26
OpaqueWhenFocused=no
Scrollbar=none
Language=zh_CN

ForegroundColour=131,148,150
BackgroundColour=0,43,54
CursorColour=220,130,71

BoldBlack=128,128,128
Red=255,64,40
BoldRed=255,128,64
Green=64,200,64
BoldGreen=64,255,64
Yellow=190,190,0
BoldYellow=255,255,64
Blue=0,128,255
BoldBlue=128,160,255
Magenta=211,54,130
BoldMagenta=255,128,255
Cyan=64,190,190
BoldCyan=128,255,255
White=200,200,200
BoldWhite=255,255,255

BellTaskbar=no
Term=xterm
FontWeight=400
FontIsBold=no
複製程式碼

效果如下:

為 win10 打造 Linux 終端(非 wsl)

你也可以在這裡自己設計一套。

6. 使用 alias 強化 Git Bash

alias 是命令的別名,可以把多條命令設定一個簡寫。在使用者目錄建立 .bash_profile 檔案,將 alias 寫在此檔案中。

下面是我列舉的部分 alias,例如鍵盤敲出 gitauto 就能自動提交一次程式碼、敲出 e 然後回車就能退出終端,節省了很多時間。

可以把自己的常用操作放到這裡面來可以大大提高效率。

$ vim ~/.bash_profile
複製程式碼
alias bashalias='code ~/.bash_profile'
alias bashcolor='code ~/.minttyrc'
alias bashconfig='code /etc/profile.d/git-prompt.sh'
alias gitconfig='code ~/.gitconfig'

alias .='cd ~'
alias ..='cd ..'
alias ...='cd ../..'
alias e='exit'
alias cls='clear'

alias gs='git status'
alias ga='git add .'
alias gc='git commit -m'
alias gp='git push'
alias gitauto='git add . && git commit -m "auto deploy" && git push'

alias sysoff='shutdown -s -t 0'
alias sysre='shutdown -r -t 0'

alias host='code /c/Windows/System32/drivers/etc/hosts'
複製程式碼

7. 使用 tmux 打造高效終端

tmux 是終端複用神器,可以解決 Git Bash 沒有多標籤功能的問題

首先感謝 hongwenjun 提取的 tmux for windows,讓 windows 安裝 tmux 變得如此簡單,只需要執行以下幾條命令即可:

$ git clone https://github.com/xnng/bash.git
$ cd bash
$ cp tmux/bin/* /usr/bin
$ cp tmux/share/* /usr/share -r
複製程式碼

建立配置檔案支援滑鼠拖動視窗分隔線

$ vim ~/.tmux.conf
複製程式碼
setw -g mouse
set-option -g history-limit 20000
set-option -g mouse on
bind -n WheelUpPane select-pane -t= \; copy-mode -e \; send-keys -M
bind -n WheelDownPane select-pane -t= \; send-keys -M
複製程式碼

如果你還不瞭解 tmux,建議看下掘金的這篇文章學習下。

我在這裡演示下 tmux 的兩個重要操作,來看下使用它的好處:

  • 首先是使用會話代替多標籤功能,只需要幾個快捷鍵就能完成

為 win10 打造 Linux 終端(非 wsl)

  • 然後是分屏功能,還支援滑鼠自由拖動和點選

為 win10 打造 Linux 終端(非 wsl)

8. 擴充命令

Git Bash 有時可能沒有自己需要的某些命令,比如 treewget

我的建議是,如果能找到這些命令的 windows 版,就儘量找一下。把命令的 exe 檔案放到 /usr/bin 目錄下即可。

可以通過下面的方式快速安裝我找的這兩個命令

$ git clone https://github.com/xnng/bash.git
$ cd bash
$ cp tools/* /usr/bin
複製程式碼

如果沒找到某些命令的 windows 版怎麼辦?我不建議安裝一個包管理器,例如 Chocolatey,它在國內的網路環境上並不好用,反而徒增煩惱。

微軟推出的 Linux 子系統 WSL 是一個很好的選擇。這裡就不介紹怎麼安裝 WSL 了。

擁有了 WSL 就相當於擁有了一個 Linux 作業系統的包管理器,間接的就相當於擁有了一切 Linux 命令。

執行以下命令可以進入到 WSL:

$ winpty wsl
複製程式碼

為 win10 打造 Linux 終端(非 wsl)

我個人認為 WSL 適合用來擴充 Git Bash 的命令,但不適合用來做為開發環境使用,效能跟不上是一方面,坑多又是另一方面。

9. 在開發工具中使用 Git Bash

  • 在 VSCode 中使用

    settings.json 中新增如下配置,其中 bash.exe 的路徑 要改成自己的。

    {
      "terminal.integrated.shell.windows": "C:\\Program Files\\Git\\bin\\bash.exe",
      "terminal.integrated.shellArgs.windows": ["--login", "-i"],
    }
    複製程式碼

    效果如下:

為 win10 打造 Linux 終端(非 wsl)

  • 如果你用的是 JetBrain 家的軟體,那也很簡單,在設定裡把 shell 的路徑改一下就可以了。

為 win10 打造 Linux 終端(非 wsl)

其它的就不一一列舉了。

相關文章