Windows PowerShell のプロンプトに色を付ける

はじめに

Windows PowerShell のpromptについて。
プロンプトの文字および文字色は、Prompt関数の上書きで決まる。

具体的には、PS起動読込のファイルprofile.ps1 に、Prompt関数を置き、
中身はWrite-Hostで文字列と属性を書いていく。

場所は下記、それぞれシステム全体かユーザ単位で影響。
システム全体で反映するしないとかで、ごちゃごちゃややこしいけれども、一番最後の
Microsoft.PowerShell_profile.ps1 に書けばおおむね問題なく安全。

%windir%system32WindowsPowerShellv1.0profile.ps1
%windir%system32WindowsPowerShellv1.0Microsoft.PowerShell_profile.ps1
%USERPROFILE%DocumentsWindowsPowerShellprofile.ps1
%USERPROFILE%DocumentsWindowsPowerShellMicrosoft.PowerShell_profile.ps1

Customizing Windows PowerShell command prompt より
http://blog.dabasinskas.net/customizing-windows-powershell-command-prompt/

プロンプトの改造例

Microsoft.PowerShell_profile.ps1


function Prompt
{
$promptString = "PS " + $(Get-Location) + ">"
$isAdmin = '$'
if(([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([System.Security.Principal.WindowsBuiltInRole] "Administrator"))
{
$isAdmin = '#'
}
# Custom color for Windows console
if ( $Host.Name -eq "ConsoleHost" )
{
Write-Host ("[") -nonewline -foregroundcolor DarkGray
Write-Host ($env:username) -nonewline -foregroundcolor DarkCyan
Write-Host ("@") -nonewline -foregroundcolor DarkGray
Write-Host (hostname) -NoNewline -ForegroundColor DarkGreen
Write-Host (" ") -nonewline -foregroundcolor DarkGray
write-host (shorten-path (pwd).Path) -nonewline -foregroundcolor DarkYellow
Write-Host ("]") -nonewline -foregroundcolor DarkGray
Write-Host ($isAdmin) -nonewline -foregroundcolor Magenta
}
# Default color for the rest
else
{
Write-Host $promptString -NoNewline
}

return " "
}
function shorten-path([string] $path) {
$loc = $path.Replace($HOME, '~')
# remove prefix for UNC paths
$loc = $loc -replace '^[^:]+::', ''
# make path shorter like tabs in Vim,
# handle paths starting with \ and . correctly
return ($loc -replace '\(.?)([^\])[^\]*(?=\)','$1$2')
}

※shorten-path というのはディレクトリを短縮させる関数

参考:
atmarkIT -PowerShellのプロンプト文字列をカスタマイズする-
TechNet -Windows PowerShell コンソールをカスタマイズする-
PowerShell HelpFile – about_prompts
Customizing Windows PowerShell command prompt
chooru.code
PowerShell For Fun

カラーディレクトリ

GitHib からget-ChildItemColored.psm1をcloneして、%USERPROFOLE%DocumentsWindowsPowerShellModules 下にディレクトリごとコピー

Import-Module get-ChildItemColored.psm1

lscolorとか短縮で呼びたい場合は、$profileにエイリアスを書く

notepad $profile
Set-Alias lscolor Get-ChildItemColored

参考:
code: Coreutils-style ‘ls’ for Windows Powershell Hacks by Brandon: making it up as I go along.

次に、簡単な改造からステップバイステップで進めていく。

ステップその1 プロンプトを黄色に

元ネタ、PowerShell: Change the Color of the Prompt より。

Set-ExecutionPolicy でスクリプトの実行セキュリティ・ポリシーを変更しておくこと。詳しくはココ

  1. %USERPROFILE%DocumentsWindowsPowerShell
    というディレクトリを作成。
    posh-gitやModuleを過去にインストールした環境では、既存の可能性あり。
  2. 1.にMicrosoft.PowerShell_profile.ps1 というファイルを生成。内容は下記。

Microsoft.PowerShell_profile.ps1

展開

    function Prompt
    {
    $promptString = "PS " + $(Get-Location) + ">"

    # Custom color for Windows console
    if ( $Host.Name -eq "ConsoleHost" )
    {
    Write-Host $promptString -NoNewline -ForegroundColor Yellow
    }
    # Default color for the rest
    else
    {
    Write-Host $promptString -NoNewline
    }

    return " "
    }

(PowerShell: Change the Color of the Prompt のコードをそのまま引用。)

上手く適用されないとき。
Get-ExecutionPolicy でスクリプトの実行セキュリティ・ポリシーが変更されているか確認。
$Profile と打ってPowerShell_profile.ps1 の位置を確認。

Windows PowerShell
PS C:WindowsSystem32WindowsPowerShellv1.0> $Profile
C:((USERPROFILE))DocumentsWindowsPowerShellMicrosoft.PowerShell_profile.ps1

Microsoft.PowerShell_profile.ps1 が想定した位置なら問題ないはず。
【 ((USERPROFILE)) は使用PCの%USERPROFILE%に見立ててください。 】

ステップその2 さらにおしゃれなプロンプトと背景を

Winterdom -My PowerShell Prompt- より
Microsoft.PowerShell_profile.ps1 のprompt関数を書き換え。
(コードは参照先からそのまま引用、先のコードはマルチラインコメントで括った。)

展開

    <# マルチラインコメント
    function Prompt
    {
    $promptString = "PS " + $(Get-Location) + ">"

    # Custom color for Windows console
    if ( $Host.Name -eq "ConsoleHost" )
    {
    Write-Host $promptString -NoNewline -ForegroundColor Yellow
    }
    # Default color for the rest
    else
    {
    Write-Host $promptString -NoNewline
    }

    return " "
    }
    #>

    function prompt {
    # our theme
    $cdelim = [ConsoleColor]::DarkCyan
    $chost = [ConsoleColor]::Green
    $cloc = [ConsoleColor]::Cyan

    write-host "$([char]0x0A7) " -n -f $cloc
    write-host ([net.dns]::GetHostName()) -n -f $chost
    write-host ' {' -n -f $cdelim
    write-host (shorten-path (pwd).Path) -n -f $cloc
    write-host '}' -n -f $cdelim
    return ' '
    }
    function shorten-path([string] $path) {
    $loc = $path.Replace($HOME, '~')
    # remove prefix for UNC paths
    $loc = $loc -replace '^[^:]+::', ''
    # make path shorter like tabs in Vim,
    # handle paths starting with \ and . correctly
    return ($loc -replace '\(.?)([^\])[^\]*(?=\)','$1$2')
    }

さらにVimのカラースキームで有名なMolokaiカラースキーム風Monokai =
Windows PowerShell Monokai Console Color Scheme
も入れる。

手順

  1. ダウンロード
    GitでcloneもしくはZipダウンロード
    git clone git://github.com/ntwb/posh-monokai.git
  2. 展開、使うファイルは次の3つ
    HKCU-Console.reg
    register-console-font.reg
    Call posh-monokai.ps1
  3. フォント Adobe Source Code Proをインストール、.ps1ファイルを書き換えればAdobe Source Code Proでなくてもよい。
  4. レジストリのマージ HKCU-Console.reg
  5. レジストリのマージ register-console-font.reg
  6. Call posh-monokai.ps1 を%USERPROFILE%DocumentsWindowsPowerShell にコピー
  7. 6.のファイルをPowerShellで実行

入れると、こんな感じ。

Windowsのコンソールとは思えぬほどおしゃれな配色に(>□<)

そしてさらにオシャレな背景・フォントにしてみる。

PowerShell + ckw とう選択肢

PowerShellとckw(正確にはckw-modらしい)という組み合わせ。
ckw.cfg

展開

    !
    ! ckw setting
    !

    !Ckw*foreground: white
    !Ckw*background: midnightblue
    !Ckw*cursorColor: green
    !Ckw*cursorImeColor: red
    !Ckw*transp: 220
    !Ckw*backgroundBitmap: ckw_background.bmp
    Ckw*title: ckw[cmd]
    !Ckw*exec: cmd.exe
    Ckw*exec: powershell.exe
    !Ckw*chdir: %HOMEDRIVE%%HOMEPATH%

    Ckw*scrollHide: no
    Ckw*scrollRight: yes
    Ckw*internalBorder: 1
    Ckw*lineSpace: 0
    Ckw*topmost: no

    Ckw*font: Terminus-ja
    !Ckw*font: Source Code Pro
    Ckw*fontSize: 14

    Ckw*geometry: 132x32+0+0
    Ckw*saveLines: 10000

    !Ckw*color0: #000000
    Ckw*color1: #60E9FF
    Ckw*color2: #008000
    Ckw*color3: #008080
    Ckw*color4: #800000
    Ckw*color5: #800080
    Ckw*color6: #808000
    !Ckw*color7: #C0C0C0

    !Ckw*color8: #808080
    Ckw*color9: #0000FF
    Ckw*color10: #00FF00
    Ckw*color11: #00FFFF
    Ckw*color12: #FFA500
    Ckw*color13: #FF00FF
    Ckw*color14: #FFFF00
    !Ckw*color15: #FFFFFF

詳細

展開

    フォントはTerminus-ja にしてみた。
    注意点。今までのネイティブなコンソール改造と併用する場合は、先のMonokaiで変更したレジストリを一部削除する必要がある。消さないと背景が灰色のままでcfgでも変更できない。

    解決法
    HKEY_CURRENT_USERConsole
    ここのColorTable**という名のキーを全て削除。(**は数字)
    ユーザ毎のサブキーも含む。

    PowerSell + ckw

    概ね問題はないのだけれど、いくつか気になることが。

    1. ウインドウズキー+方向キーやWinsplitRevolutionなどでウインドウの位置と大きさを瞬時に変えたとき、スクリーンのバッファが飛ぶ。
    2. PowerShellコマンドに限り、TABキーによる入力補完がネイティブコンソールよりも遅い。
    3. コピペが出来ない?右クリックでペーストは出来るようだけど・・・。ちなみに、ネイティブコンソールはAlt + Space + E → C でコピーAlt + Space + E → P でペースト。
    バッファ位置が飛んだ様子

    左上がPowerShell+ckw、左下がzsh + Cygwin(+mintty) 以下Cygwin、
    右上と右下がPowerShell+改造ネイティブコンソール

そしてたどり着いた結論・・・

ConEmu最強伝説

(プロンプト色のカスタマイズは出来ないので各shellごとに、改造を行う必要あり。)

ConEmuの出来ること。
フォントの種類、サイズ、ウインドウの画面位置や大きさ、背景画像・背景の透過など。
ペーストもCtrl+Vで普通に出来る。しかもConEmuを介してcmd.exe、PowerShell、Cygwinのshellまで呼べちゃう。タブ開き対応。
まさにコンソールの神ツール。

背景を変えてみて遊んでみる。

Zep
VAIO
Eye In The Sky
NASA

フォントのアンチエイリアスは、「なし、内蔵、WinのClearType」 の3つの選択肢がある。内蔵アンチエイリアスは結構品質がいい。

コンソールホストを切り替えるときWinキー+W を使うんだけど、ちょっとレスポンスわるい。ここを除けば文句ない。

コンソール画面ギャラリー

Terminal emulator with split panes for Windows 7 (64 bit) -Stack Exchange-
Get a better font for PuTTY -VCRTICAL-
cnder
MobaXterm
 A USABLE AND GOOD LOOKING SHELL ON WINDOWS

更新

2014/03/15 1st
2014/03/16 2nd ckwによる考察を追記
2014/03/21 3rd Monokaiの説明を更新
2014/11/16 4th ConEmuを追加

2015/01/30 5th 全体の構成を変更