運(yùn)行跨平臺(tái) shell(例如 Bash 或 zsh)的最大優(yōu)勢(shì)在于你能在多平臺(tái)上使用同樣的語法和腳本。在 Windows 上設(shè)置(替換)shell 挺麻煩的,但所獲得的回報(bào)遠(yuǎn)遠(yuǎn)超出這小小的付出。
-- Peter Mosmans
運(yùn)行跨平臺(tái) shell(例如 Bash 或 zsh)的最大優(yōu)勢(shì)在于你能在多平臺(tái)上使用同樣的語法和腳本。在 Windows 上設(shè)置(替換)shell 挺麻煩的,但所獲得的回報(bào)遠(yuǎn)遠(yuǎn)超出這小小的付出。
zsh shell inside Emacs on Windows
MSYS2 子系統(tǒng)允許你在 Windows 上運(yùn)行 Bash 或 zsh 之類的 shell。使用 MSYS2 很重要的一點(diǎn)在于確保搜索路徑都指向 MSYS2 子系統(tǒng)本身:存在太多依賴關(guān)系了。
MSYS2 安裝后默認(rèn)的 shell 就是 Bash;zsh 則可以通過包管理器進(jìn)行安裝:
pacman -Sy zsh
通過修改 /etc/passwd 文件可以設(shè)置 zsh 作為默認(rèn) shell,例如:
mkpasswd -c | sed -e 's/bash/zsh/' | tee -a /etc/passwd
這會(huì)將默認(rèn) shell 從 bash 改成 zsh。
要在 Windows 上的 Emacs 中運(yùn)行 zsh ,需要修改 shell-file-name 變量,將它指向 MSYS2 子系統(tǒng)中的 zsh 二進(jìn)制文件。該二進(jìn)制 shell 文件在 Emacs exec-path 變量中的某個(gè)地方。
(setq shell-file-name (executable-find "zsh.exe"))
不要忘了修改 Emacs 的 PATH 環(huán)境變量,因?yàn)?MSYS2 路徑應(yīng)該先于 Windows 路徑。接上一個(gè)例子,假設(shè) MSYS2 安裝在 c:\programs\msys2 中,那么執(zhí)行:
(setenv "PATH" "C:\programs\msys2\mingw64\bin;C:\programs\msys2\usr\local\bin;C:\programs\msys2\usr\bin;C:\Windows\System32;C:\Windows")
在 Emacs 配置文件中設(shè)置好這兩個(gè)變量后,在 Emacs 中運(yùn)行:
M-x shell
應(yīng)該就能看到熟悉的 zsh 提示符了。
Emacs 的終端設(shè)置(eterm)與 MSYS2 的標(biāo)準(zhǔn)終端設(shè)置(xterm-256color)不一樣。這意味著某些插件和主題(提示符)可能不能正常工作 - 尤其在使用 oh-my-zsh 時(shí)。
檢測(cè) zsh 否則在 Emacs 中運(yùn)行很簡單,使用變量 $INSIDE_EMACS。
下面這段代碼片段取自 .zshrc(當(dāng)以交互式 shell 模式啟動(dòng)時(shí)會(huì)被加載),它會(huì)在 zsh 在 Emacs 中運(yùn)行時(shí)啟動(dòng) git 插件并更改主題:
# Disable some plugins while running in Emacs
if [[ -n "$INSIDE_EMACS" ]]; then
plugins=(git)
ZSH_THEME="simple"
else
ZSH_THEME="compact-grey"
fi
通過在本地 ~/.ssh/config 文件中將 INSIDE_EMACS 變量設(shè)置為 SendEnv 變量……
Host myhost
SendEnv INSIDE_EMACS
……同時(shí)在 ssh 服務(wù)器的 /etc/ssh/sshd_config 中設(shè)置為 AcceptEnv 變量……
AcceptEnv LANG LC_* INSIDE_EMACS
……這使得在 Emacs shell 會(huì)話中通過 ssh 登錄另一個(gè)運(yùn)行著 zsh 的 ssh 服務(wù)器也能工作的很好。當(dāng)在 Windows 下的 Emacs 中的 zsh 上通過 ssh 遠(yuǎn)程登錄時(shí),記得使用參數(shù) -t,-t 參數(shù)會(huì)強(qiáng)制分配偽終端(之所以需要這樣,時(shí)因?yàn)?Windows 下的 Emacs 并沒有真正的 tty)。
跨平臺(tái),開源真是個(gè)好東西……
via: https://www.onwebsecurity.com/configuration/zsh-shell-inside-emacs-on-windows.html
作者: Peter Mosmans 選題: lujun9972 譯者: lujun9972 校對(duì): wxy
本文由 LCTT 原創(chuàng)編譯, Linux中國 榮譽(yù)推出
在上一篇文章中,我們介紹了如何將 PowerShell 的終端變得漂亮起來。在這一篇文章中,我將為大家介紹如何定制 PowerShell 中的 Prompt 單元,并推薦 5 個(gè)賞心悅目的 Prompt(命令提示符)主題。
開始之前,我先介紹一下 PowerShell 的基本構(gòu)成。PowerShell 等 Shell 的一個(gè)基本的命令單元大致如下:
PowerShell 相對(duì)不人性化的地方在于其默認(rèn) Prompt 只有 PS C:\User\..\folder> 這樣的一部分。所以,我推薦 oh-my-posh 這個(gè) PowerShell 的主題框架。oh-my-posh 是一個(gè)開源、低調(diào)的 PowerShell 主題框架,其 GitHub 項(xiàng)目地址位于:https://github.com/JanDeDobbeleer/oh-my-posh。我們可以利用 oh-my-posh 為我們定制一個(gè)有用且好看的 Prompt。
首先需要注意的是,oh-my-posh 主題使用了一些非 Powerline 字體不支持的字符,因此如果你使用默認(rèn)的等寬字體(比如 Consolas),在顯示過程中就會(huì)出現(xiàn)亂碼、字符顯示不全的現(xiàn)象。
字符顯示不全的問題
Powerline 字體在 GitHub 開源,我們可以在這里: https://github.com/powerline/fonts下載支持相關(guān)字符的字體。(如果你使用的是更紗黑體,那么就不必?fù)?dān)心。)同時(shí),請(qǐng)務(wù)必確認(rèn)你所使用的終端支持你所想應(yīng)用的自定義 Powerline 字體。有關(guān)默認(rèn) PowerShell 終端的字體配置和第三方終端的推薦,請(qǐng)參考 :https://sspai.com/post/52868。
我們通過在 PowerShell 中執(zhí)行下面的命令安裝配置 oh-my-posh。
安裝 posh-git 和 oh-my-posh 這兩個(gè)模塊
Install-Module posh-git -Scope CurrentUser Install-Module oh-my-posh -Scope CurrentUser
讓 PowerShell 主題配置生效
新增(或修改)你的 PowerShell 配置文件
# 如果之前沒有配置文件,就新建一個(gè) PowerShell 配置文件 if (!(Test-Path -Path $PROFILE )) { New-Item -Type File -Path $PROFILE -Force } 用記事本打開配置文件 notepad $PROFILE
在其中添加下面的內(nèi)容
Import-Module posh-git Import-Module oh-my-posh Set-Theme Paradox
其中最后一句 Set-Theme <主題名> 就是配置主題的命令。如果一切順利,你應(yīng)該看到你的 Prompt 部分變成了類似這個(gè)的樣子:
值得注意:如果你發(fā)現(xiàn)后面的日期顯示出現(xiàn)了凌亂的現(xiàn)象(比如本該在同一行顯示的字符卻跑到了下一行),多半是因?yàn)轱@示了中文。目前很多終端都不能正常的顯示中文或 CJK 字符(即:Double-width character),所以你可以通過下面這個(gè)命令將 PowerShell 的環(huán)境設(shè)置為 en-US 的英文環(huán)境:
Set-Culture en-US
一般來說,PowerShell 的用戶配置文件在 C:\Users\<用戶名>\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1,這個(gè)也就是剛剛安裝過程中生成的文件,接下來定制的過程,就修改這個(gè)文件來配置即可。
使用某個(gè)主題很簡單,下面這個(gè)命令就可以讓我們預(yù)覽某個(gè)主題:
Set-Theme <主題名>
比如我想要預(yù)覽 Sorin 這個(gè)主題:
Set-Theme Sorin
注:這個(gè)命令支持 Tab 自動(dòng)補(bǔ)全主題名稱。
配置文件的最后一句 Set-Theme Paradox 的作用就是配置主題。我們可以在配置文件里面修改這個(gè)命令中的 Paradox 即「主題名」來更換主題。oh-my-posh 內(nèi)置有 10 個(gè)主題,下面我來推薦幾個(gè)我比較喜歡的主題:
oh-my-posh 的主題有很多都借鑒了 Linux 世界里相對(duì)更加成熟的主題框架 oh-my-zsh 的主題。Agnoster 這個(gè)主題算是最經(jīng)典的一個(gè)了,長長的箭頭配合上鮮明的色彩讓這個(gè)主題成為經(jīng)典中的經(jīng)典。不僅如此,Agnoster 還能夠更加方便的顯示你的登錄用戶名、設(shè)備名、當(dāng)前文件夾中 git 版本控制的信息等等一系列有用的功能。
Sorin 這個(gè)主題也是我相對(duì)比較喜歡的一個(gè)了。和上面 Agnoster 相比,Sorin 這個(gè)主題簡潔、精致,僅由字符和圖標(biāo)構(gòu)成,沒有華麗的箭頭,但是信息顯示的一點(diǎn)不少。值得推薦。
Avit 是一個(gè)極為簡單的主題,其主 Prompt 是由兩行構(gòu)成的,第一行顯示路徑、git 版本控制信息和日期等等,第二行顯示每次輸入的命令。這樣的設(shè)計(jì)有一個(gè)好處在于:我們可以避免前面部分顯示不支持的字符導(dǎo)致光標(biāo)位置出現(xiàn)錯(cuò)位的問題。很值得嘗試。
熟悉 oh-my-zsh 的同學(xué)一定了解,robbyrussell 這個(gè)主題是 oh-my-zsh 的默認(rèn)主題!如果說哪個(gè)主題能讓 PowerShell 用起來像 zsh 那么一定是這個(gè) robbyrussell 主題了。
oh-my-posh 是相對(duì)比較完善的 PowerShell 主題配置引擎,因此我們也可以魔改某個(gè)主題,來讓它達(dá)到我們想要的效果,甚至自己寫一個(gè)主題配置也可以。在 oh-my-posh 的主題文件夾 C:\Users\<用戶名>\Documents\WindowsPowerShell\Modules\oh-my-posh\<版本號(hào)>\Themes 下新建一個(gè) myTheme.psm1,之后按照其他主題的寫法進(jìn)行修改就可以了。使用 Set-Theme myTheme 這個(gè)命令來讓你的自定義主題生效。
限于篇幅我這里不具體介紹如何寫一個(gè)自定義的主題,感興趣的同學(xué)還請(qǐng)自行進(jìn)行查看 oh-my-posh 的相關(guān)文檔。我自己也有一個(gè)自定義主題在:spencerwooo/dotfiles,有興趣的同學(xué)可以去參考一下。
還有一個(gè)值得注意的地方是:我的自定義主題中涉及到一些 Powerline 字體不支持的字符,需要在這里 ryanoasis/nerd-fonts 下載 Nerd Fonts 來正常使用。想要更多字符支持(比如題圖中的那個(gè) Windows 徽標(biāo) icon 的顯示)可以考慮使用 Nerd Fonts。使用 Scoop 包管理 的同學(xué),也可以利用它來安裝 Nerd Fonts,具體步驟就不贅述了。
自從 2016 年微軟將 PowerShell 和 PowerShell Core 開源,Windows 上的終端體驗(yàn)也有了長足的發(fā)展。經(jīng)過這篇文章的介紹,我相信你在 Windows 上使用 PowerShell 終端的體驗(yàn)會(huì)有所進(jìn)步。
當(dāng)然,為了讓使用 Windows 的同學(xué)們同樣能在原生 Windows 的環(huán)境下體驗(yàn)甚至直接使用 Linux 的終端環(huán)境,在 Windows 10 中 Windows 也正式引入了 Windows Subsystem for Linux,即適用于 Windows 的 Linux 子系統(tǒng)。如果你覺得 PowerShell 依舊糟糕,想使用 Linux 的 bash 或 zsh 等作為默認(rèn)的 Shell 進(jìn)行開發(fā)工作,那么使用 Windows 10 的你現(xiàn)在就可以去微軟商店下載你希望使用的 Linux 發(fā)行版。
有關(guān) PowerShell 等終端的配置指南到這里就結(jié)束了,感謝閱讀。