← back to posts

Note/PowerShell 7 커스터마이징하기

색상, 자동완성 제안 적용

powershellPowerShell 7

개요

최근 PowerShell 7을 설치해서 사용하고 있고, 색상 테마를 기본값이 아닌 Solarized Light로 사용 중이다. 기본 색상보다 밝고 화사해서 좋달까나(?)

그런데 베이지색 바탕에 텍스트는 진회색인데, 종류에 구분 없이 전부 같은 회색으로 나타나 가독성이 매우 별로였다.
특히 파워쉘 터미널을 ssh 접속에 가장 많이 사용하는데, PuTTy 같은 툴을 사용할 땐 사용자, 디렉토리, 파일 등이 색상으로 구분되던 것에 반해 파워쉘에서는 시각적으로 아무것도 구분이 안되어 불편했다.

ssh vs local

PowerShell에서 명령어를 실행하는 건 윈도우 명령어를 로컬 환경에서 실행하는거라, 이때의 색상을 커스터마이징하려면 파워쉘 설정만 변경해주면 된다.
기본적인 색상, 폰트, 크기 등은 터미널을 열고 Ctrl + ,를 눌러 설정에서 바꿀 수 있고, 명령어별 색상은 notepad $PROFILE 명령으로 PowerShell 스크립트 파일을 열어 작성해 추가해주면 된다.

윈도우 터미널에서 ssh 접속하는 경우에는 Ubuntu(혹은 다른 가상머신)가 보내준 색상 명령을 "표현"하기만 할 뿐이다.
윈도우 터미널에 입력한 명령이 Ubuntu의 Bash로 전달되고, 그 결과가 색상 코드와 함께 돌아오면 윈도우 터미널이 이걸 표현해주기만 하는 방식이다.
따라서 SSH 접속 상태에서 사용자/디렉토리/파일 등을 색상 설정하려면 .bashrc에서 설정을 수정하면 된다.

Powershell 7 색상 옵션 추가하기

그래서 .bashrc 수정은 여기에서 작업했고, 이제 로컬에서도 색상을 커스터마이징하면 된다.

notepad $PROFILE

여기서 $PROFILEPowerShell이 시작할 때 자동으로 실행하는 스크립트의 경로를 담고 있는 자동 변수다.

PS C:\Users\LimSR> $PROFILE
C:\Users\LimSR\Documents\PowerShell\Microsoft.PowerShell_profile.ps1

위와 같이 출력해보면 Microsoft.PowerShell라는 콘솔 호스트의 .ps1 스크립트 파일 경로임을 알 수 있었다.

참고로 PowerShell 7과 5.1은 스크립트 경로가 다르다!
PowerShell 7 → Documents\PowerShell\
Windows PowerShell 5.1 → Documents\WindowsPowerShell\

그래서 notepad $PROFILE 명령으로 스크립트 파일을 열어서 다음과 같이 입력했다.

# ── PSReadLine 색상 (Solarized Light) ──────────────────
$e = [char]27

Set-PSReadLineOption -Colors @{
    # 구문 요소
    Command                = "$e[34m"        # blue    — 명령어
    Parameter              = "$e[36m"        # cyan    — -i 같은 옵션
    Keyword                = "$e[32m"        # green   — if, foreach
    String                 = "$e[33m"        # yellow
    Number                 = "$e[38;5;9m"    # orange
    Operator               = "$e[38;5;9m"    # orange  — | > =
    Variable               = "$e[38;5;13m"   # violet  — $PROFILE
    Type                   = "$e[38;5;13m"   # violet  — [string]
    Member                 = "$e[34m"        # blue    — .Property
    Comment                = "$e[38;5;10m"   # base01  — 톤다운
    Default                = ''              # 터미널 전경색 그대로

    # 상태 표시
    Error                  = "$e[31m"        # red
    Emphasis               = "$e[35m"        # magenta — 검색 매치
    Selection              = "$e[30;46m"     # cyan 배경
    ContinuationPrompt     = "$e[38;5;10m"

    # 예측(자동완성 힌트)
    InlinePrediction       = "$e[38;5;10m"   # base01
    ListPrediction         = "$e[38;5;10m"
    ListPredictionSelected = "$e[30;46m"
    ListPredictionTooltip  = "$e[38;5;10m"
}

클로드가 제안해준 추가 옵션

추가로 다음과 같이 설정 파일에 추가해두면 좋을 거라고 제안해줘서, 옵션별로 역할과 기능을 알아보았다.

Set-PSReadLineOption -PredictionSource HistoryAndPlugin
Set-PSReadLineOption -PredictionViewStyle ListView
Set-PSReadLineOption -HistoryNoDuplicates
Set-PSReadLineOption -BellStyle None

# 화살표 위/아래로 현재 입력한 접두사에 맞는 히스토리만 탐색
Set-PSReadLineKeyHandler -Key UpArrow   -Function HistorySearchBackward
Set-PSReadLineKeyHandler -Key DownArrow -Function HistorySearchForward

-PredictionSource HistoryAndPlugin

타이핑하는 동안 뒤에 회색으로 붙는 자동완성 제안의 출처를 지정해주는 옵션이다.

동작
None예측 끔
HistoryPSReadLine 히스토리 파일(ConsoleHost_history.txt)에서만
Plug`in예측 플러그인(예: Az.Tools.Predictor, CompletionPredictor)에서만
HistoryAndPlugin둘 다

HistoryAndPlugin으로 설정해도 플러그인을 하나도 설치하지 않았다면 History와 결과가 같다고 한다. 추후에 플러그인 찾아보고 설치할수도 있으니 HistoryAndPlugin으로 해도 될 것 같다.

그리고 제안된 결과를 보고 를 누르면 전체 확정, Ctrl + →를 누르면 단어 단위로 하나씩 받아들인다고 하며, 긴 SSH 명령 같은거 반복 입력할 때 유용할 것 같다.

-PredictionViewStyle ListView

위 예측을 어떻게 보여줄 지 정하는 옵션이다.

옵션동작
InlineView (기본값)커서 뒤에 회색 텍스트 한 줄로 붙음. 후보가 여러 개여도 하나만 보임
ListView입력줄 아래에 후보 목록이 펼쳐짐. ↑/↓로 선택

ListView는 여러 후보를 한눈에 보고 고를 수 있지만, 화면을 4~5줄 차지해 답답하게 느껴질 수도 있을 것 같다.

-HistoryNoDuplicates

히스토리에서 중복 항목은 검색 결과에 한 번만 표시하는 옵션이다.

같은 ssh -i .ssh/limsr12.pem ... 이라는 옵션을 스무 번 실행했는데 이 옵션이 없다면 위 화살표를 스무 번 눌러야 이전 명령으로 넘어가므로, 켜두는 게 좋을 것 같다.

-BellStyle None

탭 완성 실패, 줄 끝에서 더 지울 수 없을 때 등에 나는 경고음/시각 효과를 끄는 옵션이다.

동작
Audible비프음 (기본값)
Visual화면 깜빡임
None아무것도 안 함

Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward

ssh 까지만 치고 ↑ 를 누르면 ssh 로 시작하는 명령만 올라온다. docker 를 치면 docker 로 시작하는 것만 나온다.

옵션동작
PreviousHistory (기본값)입력한 내용과 무관하게 무조건 직전 명령부터 순서대로 거슬러 올라감.
HistorySearchBackward지금 입력한 글자를 접두사로 하는 명령만 걸러서 탐색
DownArrow/HistorySearchForward반대방향

Set-PSReadLineOption -HistorySearchCursorMovesToEnd

이게 없으면 히스토리를 불러왔을 때 커서가 입력했던 접두사 뒤 (ssh 직후)에 머물러서, 바로 수정하려면 end를 눌러야 하는 번거로움이 있다.
그래서 이 옵션을 켜두면 자동으로 줄 끝으로 이동하게 할 수 있다!