Make PowerShell great again
Chuyện là mình có một con máy tính chạy Windows lâu nay chỉ để lướt web và đánh Dota2. Nhân sự kiện sắp phải chia tay với macOS sau gần 4 năm gắn bó, mình quyết định chuyển nó thành máy code chính của mình. Mọi thứ đều hoàn hảo đến khi mình mở Windows PowerShell lên để sử dụng, với mình terminal + oh-my-zhs đã là một thứ gì đó không thể thiếu, thì trải nghiệm lúc đó khá là ngán ngẫm.
Muốn ăn thì lăn vào bếp, xắn tay áo lên và “clone” lại những trải nghiệm đã có của mình với terminal + oh-my-zhs qua thôi. Và đây là câu chuyện nâng cấp nhan sắc và điện nước cho PowerShell của mình :)
1. Tổ chức thư mục và thư viện #
Đầu tiên là cách tổ chức các thư mục để lưu phần cấu hình cho PowerShell và custom theme cho nó.
└─ $env:USERPROFILE\.config general folder for library
└─ powershell build powershell
├─ user_profile.ps1 config file
└─ my.omp.json prompt customizations
Tiếp theo là các thư viện mà mình sẽ sử dụng
- Nerd fonts - fonts và symbols
- Scoop - a command line installer
- Oh My Posh - prompt theme engine
- Terminal Icons - file and folder icons
- PSReadLine - cmdlets cho phép custom môi trường edit, dùng cho autocompletion
- z - directory jumper
- Fzf, PSFzf - fuzzy finder
- Neovim - vim
2. Cài đặt Windows Terminal, PowerShell #
Đây là bước quan trọng nhất, mình cần cài Windows Terminal để có thể cấu hình cho PowerShell và chạy đa nhiệm. Hơn nữa Windows Terminal cho phép chúng ta custom giao diện cho terminal. Tiếp sau đó là cài PowerShell, nó giúp mình có thể cài được rất nhiều thư viện bên thứ 3 cũng như có rất nhiều cải tiến so với Windows PowerShell mặc định trong máy. Cả 2 apps này đều có thể tải trực tiếp ở Windows Store.
3. Terminal settings #
Mình lên Nerd font github để tải font đã được custom lại với các symbol đặc biệt. Ví dụ như font Ubuntu Mono mình tải trên trang chủ và tải trên này thì font trên trang chủ mình không thể show được các symbol trong lúc mình custom lại phần giao diện cho terminal cũng như lúc xài các theme có sẵn trên Oh My Posh.
Sau khi đã tải được font đúng với sở thích thì mình mở sẽ bắt đầu custom lại cho Windows Terminal, vào phần settings và chỉnh lại các phần sau:
- Default profile: PowerShell
- Show acrylic in tab row: On
- Font face: font bạn mới tải
- Acrylic: On
- Acrylic opacity: 50%
4. Scoop #
Để có thể cài đặt các thư viện thông qua command line thì mình sử dụng Scoop. Sử dụng lệnh sau để cài đặt Scoop
iwr -useb get.scoop.sh | iex
5. Git #
Thư viện quan trọng nhất mà code nô nào cũng phải có trong máy. Ở đây cài đặt git thì có 2 cách, tải file cài về rồi chạy hoặc tải bằng command line, tất nhiên mình sẽ chọn cách sau rồi. Câu lệnh để cài đặt git
winget install -e --id Git.Git
Trong lúc đợi nó cài đặt thì mình sẽ ghé qua powershell-git-aliases để xem thử có bản cập nhật mới chưa. Đây là thư viện gì, sao mình lại không nói ở trên. Xin đáp đây là thư viện clone lại toàn bộ Oh My Zhs cheatsheet :)
Sau 1 thời gian dài code trên macOS thì Oh My Zsh là shell chính của mình. Khi xài git thì mình toàn sử dụng các lệnh gõ tắt, dần nó thành 1 thói quen. Việc viết tắt này giúp cho mình có thể làm việc với git nhanh hơn, ví dụ bạn muốn sử dụng
git commit -a -m "your commit"
thì chỉ cần gõ
gcam "your commit"
Việc sử dụng thư viện này là tùy theo sở thích của mỗi người nên mình đưa nó vào phần này như một option thêm. Để cài đặt nó thì sử dụng lệnh sau
// Powershell
Install-Module git-aliases -Scope CurrentUser -AllowClobber
// or from Scoop
scoop bucket add extras
scoop install git-aliases
6. NeoVim #
PowerShell mặc định không có hỗ trợ vim nhưng mình cần sử dụng vim để có thể viết các file config cho PowerShell và Git. Cài đặt NeoVim bằng câu lệnh sau
scoop install neovim gcc
Kiểm tra việc cài đặt NeoVim đã thành công hay chưa thì mình gõ nvim
rồi Enter
. Nếu giao diện sau hiện ra thì bước này đã xong.
Với mình nếu chỉ dừng ở đây thì vẫn chưa vừa ý lắm, mình muốn làm sao vim có thể hiển thị số dòng, tùy chỉnh khi xuống dòng và thêm vài thứ nữa. Để có thể custom vim mình tạo folder nvim
và file init.vim
trong folder Local theo cấu trúc sau
└─ $env:USERPROFILE\AppData
└─ Local
└─ nvim
└─ init.vim
Lên trang linode và copy những lệnh để config cho vim. Giờ thì tận hưởng kết quả thôi :)
6. Config PowerShell #
- Từ đoạn này mình nghĩ các bạn nên search nhanh cách làm việc với Vim để đọc dễ dàng hơn
- Restart lại Windowns Terminal sau khi cài thành công NeoVim
- Mình cũng bắt đầu để cấu trúc thư mục để các bạn có thể biết được những thư viện của mình sử dụng sẽ cài vào đâu
- Các câu lệnh ở đây chạy tuần tự, câu lệnh đầu chạy xong rồi mới chạy câu lệnh sau
└─ $env:USERPROFILE\
Bây giờ mình sẽ tạo file user_profile.ps1
để có thể chứa các config thông dụng hay sử dụng. Sử dụng câu lệnh sau
nvim .config/powershell/user_profile.ps1
Trong file này đầu tiên chúng ta sẽ cấu hình các alias, đây là các cách gọi nhanh khác khi sử dụng thư viện.
Set-Alias vim nvim // viết tắt nvim thành vim
Set-Alias ll ls // hiển thị thư mục gõ ll thay cho ls để
Set-Alias g git // viết tắt g cho git
Set-Alias tig 'K:\Program Files\Git\usr\bin\tig.exe' // truy cập nhanh đến tig
Set-Alias less 'K:\Program Files\Git\usr\bin\less.exe' // truy cập nhanh đến less
Tiếp theo, mình sẽ thiết lập môi trường chạy cho file cấu hình này. Sử dụng câu lệnh sau
nvim $PROFILE.CurrentUserCurrentHost
Và cấu hình môi trường bằng câu lệnh
. $env:USERPROFILE\.config\powershell\user_profile.ps1
Khi làm đến bước này mình có 1 issue, đó là không thể tìm thấy folder PowerShell trong Documents. Đó là do trên máy tính mình đường dẫn đến Documents thông qua OneDrive. Vậy đây là cách xử lý cho nó, mình vào trong folder Documents của OneDrive và tạo folder PowerShell, sau đó chạy lại 2 câu lệnh trên.
└─ $env:USERPROFILE\OneDrive
└─ Documents
└─ PowerShell
Gõ ls
, g
test thử coi nó hoạt động có đúng như mong đợi không nào.
7. Oh My Posh #
└─ $env:USERPROFILE\.config
└─ powershell
Để cái terminal có thể lòe loẹt hết mức có thể thì mình sử dụng Oh My Posh :)
Chạy lệnh sau để cài đặt
Install-Module posh-git -Scope CurrentUser -Force
Install-Module oh-my-posh -Scope CurrentUser -Force
Mình sẽ cấu hình nó vào file user_profile.ps1
để lần sử dụng Windows Terminal tiếp theo nó sẽ tự động được kích hoạt.
nvim .config/powershell/user_profile.ps1
Và thêm vào
Import-Module posh-git // chạy posh-git
Import-Module oh-my-posh // chạy oh-my-posh
Set-PoshPrompt M365Princess // sử dụng theme M365Princess
Oh My Posh cung cấp rất nhiều theme khác nữa, nếu bạn thích thì có thể lên themes của Oh My Posh để ngắm và lựa chọn.
Như mình thích vọc vạch thì mình sẽ tự custom lại theme, để làm việc này thì mình tạo file coder7een.omp
để custom lại phần json cho theme. Bạn có thể lên github của từng theme, copy lại phần json rồi tùy chỉnh theo ý muốn của bản thân. Sức mạnh của open source giúp những người thích vọc vạch được phát huy tối đa sở thích của mình :)
Sau khi đã tùy chỉnh xong theme đúng với sở thích của mình thì bạn cần cấu hình nó trong user_profile.ps1
function Get-ScriptDirectory { Split-Path $MyInvocation.ScriptName }
$PROMPT_CONFIG = Join-Path (Get-ScriptDirectory) 'coder7een.omp.json'
oh-my-posh --init --shell pwsh --config $PROMPT_CONFIG | Invoke-Expression
Và nhớ xóa đi dòng lệnh sau để không còn chạy theme chọn từ Oh My Posh
Set-PoshPrompt M365Princess
8. Terminal Icons #
└─ $env:USERPROFILE\.config
└─ powershell
Khi mình xài lệnh ll
để hiển thị danh mục thì nó hơi trơ trọi, để tăng sức lòe loẹt cho terminal thì mình cài vào thư viện icon. Sử dụng câu lệnh sau
Install-Module -Name Terminal-Icons -Repository PSGalery -Force
Cấu hình nó trong user_profile.ps1
Import-Module -Name Terminal-Icons
Kết quả thu được :) Lòe loẹt và rõ ràng hơn cũ nhiều ha.
9. Cài đặt z - directory jumper #
└─ $env:USERPROFILE\.config
└─ powershell
Thư viện z này giúp mình có thể quay lại các folder đã mở lúc trước một cách nhanh chóng mà không cần phải cd
nữa, chỉ cần z <tên thư mục>
là nó tự động nhảy đến. Cài đặt thông qua câu lệnh
Install-Module -Name z -Force
10. PSReadline #
└─ $env:USERPROFILE\.config
└─ powershell
Khi làm việc với zsh của macOS thì thư viện autocompletion của nó đã giúp mình có thể nhanh chóng sử dụng các câu lệnh cũ đã gõ. Việc nhắc lệnh tự động giúp mình làm việc được thoải mái hơn, nhiều lúc không nhớ lúc trước chỗ đó mình đã viết cái gì thì có thư viện này, mọi thứ đều hiện lên lại.
Cài đặt như sau
Install-Module -Name PSReadLine -AllowPrerelease -Scope CurrentUser -Force -SkipPublisherCheck
Thêm cấu hình trong user_profile.ps1
Set-PSReadLineOption -PredictionSource History // lấy câu lệnh từ History
Bây giờ khi gõ lệnh, mình chỉ cần gõ vài kí tự đầu là nguyên câu lệnh đã được nhắc sẵn rồi, cool :)
11. Fuzzy finder #
└─ $env:USERPROFILE\.config
Phần cuối cùng khi custom lại cái PowerShell chính là tìm kiếm thư mục. Nếu macOS mình chỉ cần tab 2 lần là có thể di chuyển đến thư mục mình cần thì ở đây tab chỉ hiển thị thư mục, khá bất tiện. Fuzzy finder sinh ra để giúp mình làm việc này. Cài đặt như sau
scoop install fzf
Install-Module -Name PSFzf -Scope CurrentUser -Force
Update thêm vào user_profile.ps1
Import-Module PSFzf
Set-PSFzfOption -PSReadLineChordProvider 'Ctrl+f' -PSReadLineChordReverseHistory 'Ctrl+r'
Giờ đây chỉ cần nhấn Ctrl + f
là mình đã có thể tìm kiếm nhanh các thư mục và trở đến thư mục mình cần sử dụng. Tuy thao tác phải tốn thêm 1 bước tổ hợp phím nhưng kết quả thì tương đương.
12. Tinh chỉnh thêm cho git-alias #
└─ $env:USERPROFILE\.config
└─ powershell
Ở trên mình đã cài đặt thư viện powershell-git-aliases
nhưng để có thể tự động chạy mỗi lần xài git thì mình cần phải cấu hình nó trong user_profile.ps1
Import-Module git-aliases -DisableNameChecking
13. Kết #
Giờ thì chạy lại PowerShell để có thể tận hưởng thành quả của mình thôi.
Đối với mình, sau khi nâng cấp thành công PowerShell thì cảm hứng làm việc của mình cũng được thêm kha khá. Mình mong bài chia sẻ này có thể giúp các bạn có thể nâng cấp cái terminal đang xài của mình trên Windows lên 1 tầm cao mới, lòe loẹt và tiện dụng hơn :)
14. Tham khảo #
Yup, mình không thể nào tự mò hết tất cả thư viện trong này được, nguồn tham khảo của mình ở đây.
devaslife - How to set up PowerShell prompt with Oh My Posh on Windows 11