Windows TerminalPowerShellを使って、COOLなターミナル環境を構築してみました。

2021-04-11: oh-my-poshのバージョンが上がったためこの記事の手順では動作しない場所があります

手順に変更があった部分は注釈を入れて以下の記事を案内しています。

Table of Contents

はじめに

先日、Windows Terminalのバージョン1.0がリリースされました。

以前は状況に応じてターミナルソフトを使い分けていましたが、Windows Terminalを使うことで全てを統一することができました。

導入後のイメージ

本記事の設定を行うと、どのようになるのか…
実際の動作イメージを動画に収めました。

興味がありましたら是非この先へお進みください😉

Windows Terminal導入前の環境

以前使っていたターミナルソフト 状況
Cmder 一般的なターミナル操作(コマンドプロンプトを使うもの)
git bash Linuxコマンドを使ってShell Scriptを実行するとき
wsl-terminal Linux(SSH含む)の操作

以前の記事

本記事ではCmdergit bashwsl-terminalの説明はしません。
なぜ、それらを利用していたかは過去の記事をご覧ください。

過去の記事はこちら

Cmder

git bash

fish

想定する読者

以下のような方を想定しています。

  • WindowsでLinuxのようにターミナルを快適に使いたい
  • wsl-terminalgit bashCmderを使っているが満足できていない
  • Windows Terminalを使いこなしたい
  • PowerShellを使いこなしたい
  • Windowsのコマンドプロンプトを哀れみの目で見てくるMac/Linuxユーザを見返したい

ターミナルに求める要件

私がターミナルに求める要件はいくつかあります。
今まで使っていたツールで要件を満たせていたかを列挙します。

Cmderはcmd.exeを、git bashwsl-terminalはbashを起動する前提

要件 Cmder git bash wsl-terminal
Windowsのファイルシステムをそのまま使える ▲(重い)
Windowsで動作保証されているコマンドが動く
Linuxコマンドが使える
Linuxサーバで文字化けしない
GitをPowerLine表示できる 〇(重い) ▲(重い) 〇(重い)
Unicode絵文字が表示できる
画面を分割できる × ×
複数タブ表示できる × ×
背景に画像を表示できる × ×
履歴からcdできる ×
リポジトリにcdできる ×

Windows Terminal

まずはWindows Terminalについてです。
導入を決めた理由、インストールや設定の仕方を説明していきます。

なぜWindows Terminalなのか

理由は2つあります。

❶ Microsoftが公式で開発している
❷ 必要な要件をほぼ全て満たしている

❶ Microsoftが公式で開発している

Windows OSを開発しているのはMicrosoftです。
そのMicrosoftが開発しているため、将来性は抜群でしょう😁

別の言い方をすると、リスク回避とも言えます。
数年後には、他のOSSターミナルは軒並み開発が停止している可能性がありますので。

❷ 必要な要件をほぼ全て満たしている

今回試して分かったことでもありますが、私にとって必要な要件をほぼ全て満たしていました。
先ほどの要件表に照らし合わせると、以下のようになります。

要件 Windows Terminal + PowerShell
Windowsのファイルシステムをそのまま使える
Windowsで動作保証されているコマンドが動く
Linuxコマンドが使える
Linuxサーバで文字化けしない
GitをPowerLine表示できる 〇 (Linuxには負けるが実用的速さ)
Unicode絵文字が表示できる
画面を分割できる
複数タブ表示できる
背景に画像を表示できる
履歴からcdできる
リポジトリにcdできる

PowerShellを使う唯一?の弊害として、Linuxコマンドは使いにくくなります。
しかし、それさえ許容出来れば全てが統一できるわけです..🆒!!

※ 他にも問題はありますが、それは後ほど紹介します

インストール

公式が推奨しているので、Microsoft Storeからインストールしました。

設定

GUIのメニューから設定を選ぶと、VS Codeなどのエディタで設定ファイルが開きます。

私は以下のように設定しています。
設定項目のドキュメントは、ファイル内 👀のURLをご覧下さい。

settings.json
// 👀 https://docs.microsoft.com/ja-jp/windows/terminal/customize-settings/global-settings
{
  "$schema": "https://aka.ms/terminal-profiles-schema",
  "defaultProfile": "{574e775e-4f2a-5b96-ac1e-a2962a402336}",

  "theme": "dark",
  "copyOnSelect": false,
  "copyFormatting": false,

  // ダブルクリックでパスを丸ごと選択したいため
  "wordDelimiters": " ",

  // 👀 https://docs.microsoft.com/ja-jp/windows/terminal/customize-settings/profile-settings
  // Azureは使わないので無効化
  "disabledProfileSources": ["Windows.Terminal.Azure"],
  "profiles": {
    "defaults": {
      "startingDirectory": "%USERPROFILE%",
      "closeOnExit": "always",
      "colorScheme": "Tango Dark",

      // Nerd Fontを指定
      "fontFace": "SauceCodePro NF",
      "fontSize": 13
    },

    // 実行するシェルの一覧
    "list": [
      // PowerShell Coreがメイン
      {
        "guid": "{574e775e-4f2a-5b96-ac1e-a2962a402336}",
        "source": "Windows.Terminal.PowershellCore",
        "backgroundImage": "%USERPROFILE%\\git\\github.com\\tadashi-aikawa\\owl-playbook\\mnt\\windows\\power-shell\\fukurou.jpg"
      },
      // WSLは絵文字を入力したいとき
      {
        "guid": "{2c4de342-38b7-51cf-b940-2309a097f518}",
        "source": "Windows.Terminal.Wsl"
      },
      // 『Git Bash』はbashスクリプトの動作確認用に使うことがある
      {
        "guid": "{cbaea444-ca1f-4125-bb6f-5c3f1201b568}",
        "name": "git bash",
        "startingDirectory": "%USERPROFILE%",
        "commandline": "%GIT_INSTALL_ROOT%\\usr\\bin\\bash.exe",
        "icon": "%GIT_INSTALL_ROOT%\\mingw64\\share\\git\\git-for-windows.ico",
        "backgroundImage": "%GIT_INSTALL_ROOT%\\mingw64\\share\\git\\git-for-windows.ico",
        "backgroundImageAlignment": "bottomRight",
        "backgroundImageStretchMode": "none",
        "backgroundImageOpacity": 0.75
      }
    ]
  },

  // 👀 https://docs.microsoft.com/ja-jp/windows/terminal/customize-settings/color-schemes
  "schemes": [],

  // 👀 https://docs.microsoft.com/ja-jp/windows/terminal/customize-settings/key-bindings
  "keybindings": [
    // 基本操作
    { "command": { "action": "copy", "singleLine": false }, "keys": "ctrl+c" },
    { "command": "paste", "keys": "ctrl+v" },
    { "command": "find", "keys": "ctrl+alt+f" },

    // 画面スクロール
    { "command": "scrollUp", "keys": "shift+up" },
    { "command": "scrollDown", "keys": "shift+down" },
    { "command": "scrollUpPage", "keys": "shift+pgup" },
    { "command": "scrollDownPage", "keys": "shift+pgdn" },

    // タブ
    { "command": "newTab", "keys": "ctrl+t" },
    { "command": "closeTab", "keys": "ctrl+w" },
    { "command": "nextTab", "keys": "alt+l" },
    { "command": "prevTab", "keys": "alt+h" },

    // ペインの分割
    { "command": { "action": "splitPane", "split": "auto", "splitMode": "duplicate" }, "keys": "alt+shift+d" },
    // ペイン移動
    { "command": { "action": "moveFocus", "direction": "down" }, "keys": "alt+ctrl+j" },
    { "command": { "action": "moveFocus", "direction": "left" }, "keys": "alt+ctrl+h" },
    { "command": { "action": "moveFocus", "direction": "right" }, "keys": "alt+ctrl+l" },
    { "command": { "action": "moveFocus", "direction": "up" }, "keys": "alt+ctrl+k" },
    // ペインサイズ変更
    { "command": { "action": "resizePane", "direction": "down" }, "keys": "alt+shift+j" },
    { "command": { "action": "resizePane", "direction": "left" }, "keys": "alt+shift+h" },
    { "command": { "action": "resizePane", "direction": "right" }, "keys": "alt+shift+l" },
    { "command": { "action": "resizePane", "direction": "up" }, "keys": "alt+shift+k" }
  ]
}
guidの生成方法について

guidの生成方法は以下を参考にさせていただきました。
この記事はCmderのexeをWindows Terminalで動かすことがメインです。

当初はPowerShellを使わずに、Windows TerminalでCmderを動かすつもりでした。
Power Shellに乗り換えた一番の理由は、コマンドの反応速度です。

画面イメージはこんな感じです。

GitHubでも設定を公開しています。よろしければご覧下さい。

フォントが見つからないとエラーが出る..
本記事で設定したフォントはデフォルトでインストールされていない特殊なフォントです。
後ほどインストール方法を紹介しますので、そちらをご覧下さい。
アイコンや背景画像が表示されない..
筆者のLocalだけに存在する画像ファイルのパスを指定しているためです。
iconbackgroundImageは自分で使用したい画像ファイルのパスへ置き換えて下さい。

PowerShellのセットアップ

PowerShellのベース環境を作ります。
振り返ってみるとこの記事のメインはPowerShellかもしれません..。

なぜPowerShellなのか

まずは採用した理由について..理由は3つあります。

❶ Windows標準
❷ 見た目をかなりカスタマイズできる
❸ Cmder.exeよりコマンド実行速度が速い

❶ Windows標準

PowerShellはWindowsに標準でインストールされています。
しかも、最近の推奨シェルはPowerShellとなっています。

※ 一昔前はcmd.exeが主流でした

Windowsとの相性を考えると、最もベストな選択肢と言えるでしょう。

❷ 見た目をかなりカスタマイズできる

oh-my-poshというテーマエンジンを使うと、見た目をかなりカスタマイズできます。
これは、コマンドプロンプトと比べて大きなメリットでしょう😄

以下がoh-my-poshを適応して、Gitリポジトリを操作したイメージ画像です。
テーマはSet-Theme Powerlevel10k-Leanを使っています。

絵文字は後ほど紹介する設定でカスタマイズしています。

❸ Cmder.exeよりコマンド実行速度が速い

Windowsではコマンドプロンプト/PowerShell以外のシェルを使うと、exe呼び出しか通信のオーバーヘッドがかなりかかっている気がします。
たとえば、現在のリポジトリ状況を示すPowerlineの表示速度を比較するとこれだけ差が出ます。

ツール 表示速度の目安
Windows Terminal+PowerShell 0.2秒
Windows Terminal+git bash 2秒
Windows Terminal+Cmder 1秒

Enterを押してから情報が表示されるまでのラグを比べてみると一目瞭然です。

私がPowerShellを採用する決め手となったのが、この速度差というわけです👍

PowerShell Coreのインストール

PowerShellという呼び名は、以下2つのエディションをしばしば包括しています。

エディション 概要 Windows標準搭載
Windows PowerShell v5まで. Windows専用 されている
PowerShell Core v6以降. クロスプラットフォーム対応 されていない

今回の記事ではPowerShell Coreを使います。

なぜPowerShell Coreを使うのか?

大きな理由は以下2点です。

❶ Windows PowerShellは開発が事実上凍結している (将来性がない)
❷ PowerShell Coreは標準エンコーディングがUTF-8 BOMなし (Windows PowerShellはUTF-16 BOMあり)

特に❷の問題は、Windows PowerShellで解決することができません。
Encodingを指定しても、UTF-8 BOMありが限界です。

GitHubのリリースページから、最新の安定版をインストールします。

本記事執筆時はPowerShell-7.0.1-win-x64.msiを使いました。

インストールが完了したら起動してみましょう。
起動コマンドはpowershellではなくpwshなので間違えないよう気をつけてください。

Powerlineのセットアップ

Microsoftの公式ページを参考にします。

PowerShellを起動して、以下のコマンドを実行します。

Install-Module posh-git -Scope CurrentUser -Force
Install-Module oh-my-posh -Scope CurrentUser -Force
Install-Module -Name PSReadLine -Scope CurrentUser -Force -SkipPublisherCheck
2021-04-11: oh-my-poshのバージョンが上がったためposh-gitのインストールは不要です

oh-my-poshのv3移行については以下の記事をご覧ください。

フォントのインストール

Powerlineの表示には、アイコンに対応した特殊なフォントが必要です。
メジャーなアイコンほぼ全てに対応済みであるNerd Fontsを使います。

Downloadをクリックしてダウンロードします。
私はSource Code Proが好きなので、Sauce Code Pro Nerd Fontにしました。

解凍をしたら、インストールしたいフォントをダブルクリックします。
私はWindows Compatible版をすべてインストールしました。

Windows Terminalでフォントを指定する方法

Windows Terminalの設定でfontFaceに指定します。 先ほど紹介したsettings.jsonの例では以下のようにしています。

"fontFace": "SauceCodePro NF"

プロファイルの作成

PowerShellの設定はプロファイルで設定します。

プロファイルの場所は$PROFILEで出力されるパスです。
まずは空ファイルを作成しましょう。

notepad $PROFILE

先ほどインストールしたPowerline関連のModuleをインポートする設定を追加します。

2021-04-11: oh-my-poshのバージョンが上がったため手順が変わっています
  • Import-Moduleは不要
  • $PROFILEPowerlineに関する設定が変更

oh-my-poshのv3移行については以下の記事をご覧ください。

Import-Module posh-git
Import-Module oh-my-posh

私のprofileファイルは以下です。

~\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
#-----------------------------------------------------
# General
#-----------------------------------------------------

# PowerShell Core7でもConsoleのデフォルトエンコーディングはsjisなので必要
[System.Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("utf-8")
[System.Console]::InputEncoding = [System.Text.Encoding]::GetEncoding("utf-8")

# git logなどのマルチバイト文字を表示させるため (絵文字含む)
$env:LESSCHARSET = "utf-8"

# 音を消す
Set-PSReadlineOption -BellStyle None

#-----------------------------------------------------
# Key binding
#-----------------------------------------------------

# Emacsベース
Set-PSReadLineOption -EditMode Emacs

#-----------------------------------------------------
# Powerline
#-----------------------------------------------------

Import-Module posh-git
Import-Module oh-my-posh
Import-Module z

Set-Theme Powerlevel10k-Lean

# Prompt
$ThemeSettings.Colors.DriveForegroundColor = "Blue"
# Git
$ThemeSettings.GitSymbols.LocalStagedStatusSymbol = ""
$ThemeSettings.GitSymbols.LocalWorkingStatusSymbol = ""
$ThemeSettings.GitSymbols.BeforeWorkingSymbol = [char]::ConvertFromUtf32(0xf040)+" "
$ThemeSettings.GitSymbols.DelimSymbol = [char]::ConvertFromUtf32(0xf040)
$ThemeSettings.GitSymbols.BranchSymbol = [char]::ConvertFromUtf32(0xf126)
$ThemeSettings.GitSymbols.BranchAheadStatusSymbol = [char]::ConvertFromUtf32(0xf0ee)+" "
$ThemeSettings.GitSymbols.BranchBehindStatusSymbol = [char]::ConvertFromUtf32(0xf0ed)+" "
$ThemeSettings.GitSymbols.BeforeIndexSymbol = [char]::ConvertFromUtf32(0xf6b7)+" "
$ThemeSettings.GitSymbols.BranchIdenticalStatusToSymbol = ""
$ThemeSettings.GitSymbols.BranchUntrackedSymbol = [char]::ConvertFromUtf32(0xf663)+" "

#-----------------------------------------------------
# fzf
#-----------------------------------------------------

# fzf
$env:FZF_DEFAULT_OPTS="--reverse --border --height 50%"
$env:FZF_DEFAULT_COMMAND='fd -HL --exclude ".git" .'
function _fzf_compgen_path() {
    fd -HL --exclude ".git" . "$1"
}
function _fzf_compgen_dir() {
    fd --type d -HL --exclude ".git" . "$1"
}

#-----------------------------------------------------
# Linux like commands
#-----------------------------------------------------

# パイプラインを受けつけないLinux標準コマンド
Remove-Item alias:cp
function cp() { uutils cp $args}
Remove-Item alias:mv
function mv() { uutils mv $args}
Remove-Item alias:rm
function rm() { uutils rm $args}
Remove-Item alias:ls
function mkdir() { uutils mkdir $args}
function printenv() { uutils printenv $args}

# パイプラインを受けつけるLinux標準コマンド
Remove-Item alias:cat
function cat() { $input | uutils cat $args}
function head() { $input | uutils head $args}
function tail() { $input | uutils tail $args}
function wc() { $input | uutils wc $args}
function tr() { $input | uutils tr $args}
function pwd() { $input | uutils pwd $args}
function cut() { $input | uutils cut $args}
function uniq() { $input | uutils uniq $args}
# ⚠ readonlyのaliasなので問題が発生するかも..
Remove-Item alias:sort -Force
function sort() { $input | uutils sort $args}

# 代替コマンドを使用
Set-Alias grep rg
function ls() { exa --icons $args }
function tree() { exa --icons -T $args}

# Linuxコマンドのエイリアス
function ll() { uutils ls -l $args}

#-----------------------------------------------------
# Useful commands
#-----------------------------------------------------

# cd
function cdg() { gowl list | fzf | cd }
function cdr() { fd -H -t d -E .git -E node_modules | fzf | cd }
function cdz() { z -l | oss | select -skip 3 | % { $_ -split " +" } | sls -raw '^[a-zA-Z].+' | fzf | cd }

# vim
function vimr() { fd -H -E .git -E node_modules | fzf | % { vim $_ } }

# Copy current path
function cpwd() { Convert-Path . | Set-Clipboard }

# git flow
function gf()  { git fetch --all }
function gd()  { git diff $args }
function ga()  { git add $args }
function gaa() { git add --all }
function gco() { git commit -m $args[0] }

# git switch
function gb()  { git branch -l | rg -v '^\* ' | % { $_ -replace " ", "" } | fzf | % { git switch $_ } }
function gbr() { git branch -rl | rg -v "HEAD|master" | % { $_ -replace "  origin/", "" } | fzf | % { git switch $_ } }
function gbc() { git switch -c $args[0] }
function gbm()  { git branch -l | rg -v '^\* ' | % { $_ -replace " ", "" } | fzf | % { git merge --no-ff $_ } }

# git log
function gls()   { git log -3}
function gll()   { git log -10 --oneline --all --graph --decorate }
function glll()  { git log --graph --all --date=format:'%Y-%m-%d %H:%M' --pretty=format:'%C(auto)%d%Creset\ %C(yellow)%h%Creset %C(magenta)%ae%Creset %C(cyan)%ad%Creset%n%C(white bold)%w(80)%s%Creset%n%b' }
function glls()  { git log --graph --all --date=format:'%Y-%m-%d %H:%M' --pretty=format:'%C(auto)%d%Creset\ %C(yellow)%h%Creset %C(magenta)%ae%Creset %C(cyan)%ad%Creset%n%C(white bold)%w(80)%s%Creset%n%b' -10}

# git status
function gs()  { git status --short }
function gss() { git status -v }

GitHubでも設定を公開しています。よろしければご覧下さい。

プロファイルの中身は次章で詳しく説明します。

PowerShellのカスタマイズ

プロファイルでカスタマイズした内容を詳しく説明します。

文字化けを解消する

PowerShell Coreは$OutputEncodingのデフォルトがUTF-8です。
しかし、その他の設定はsjisのものが多数あります。

これらについて、すべてUTF-8を指定しなくてはなりません。

# PowerShell Core7でもConsoleのデフォルトエンコーディングはsjisなので必要
[System.Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("utf-8")
[System.Console]::InputEncoding = [System.Text.Encoding]::GetEncoding("utf-8")

# git logなどのマルチバイト文字を表示させるため (絵文字含む)
$env:LESSCHARSET = "utf-8"

以下の回答に大変助けられました..🙇

git statusのファイル名が文字化けする場合..

こちらの場合はgitの設定変更で解決できます。

git config --global core.quotepath false

キーバインドをbashに寄せる

PowerShellはターミナルで使えるショートカットキーがbashと異なります。
PSReadLineの設定をEmacsベースにすることで、bashのようなショートカットキーが使えるようになります。

Set-PSReadLineOption -EditMode Emacs

Powerlineをカスタマイズする

2021-04-11: oh-my-poshのバージョンが上がったため手順が変わっています

oh-my-poshのv3移行については以下の記事をご覧ください。

主にGitのステータス表示で使われるアイコンをカスタマイズします。

profileの以下で設定しています。

Set-Theme Powerlevel10k-Lean

# Prompt
$ThemeSettings.Colors.DriveForegroundColor = "Blue"

# Git
$ThemeSettings.GitSymbols.LocalStagedStatusSymbol = ""
$ThemeSettings.GitSymbols.LocalWorkingStatusSymbol = ""
$ThemeSettings.GitSymbols.BeforeWorkingSymbol = [char]::ConvertFromUtf32(0xf040)+" "
$ThemeSettings.GitSymbols.DelimSymbol = [char]::ConvertFromUtf32(0xf040)
$ThemeSettings.GitSymbols.BranchSymbol = [char]::ConvertFromUtf32(0xf126)
$ThemeSettings.GitSymbols.BranchAheadStatusSymbol = [char]::ConvertFromUtf32(0xf0ee)+" "
$ThemeSettings.GitSymbols.BranchBehindStatusSymbol = [char]::ConvertFromUtf32(0xf0ed)+" "
$ThemeSettings.GitSymbols.BeforeIndexSymbol = [char]::ConvertFromUtf32(0xf6b7)+" "
$ThemeSettings.GitSymbols.BranchIdenticalStatusToSymbol = ""
$ThemeSettings.GitSymbols.BranchUntrackedSymbol = [char]::ConvertFromUtf32(0xf663)+" "

[char]::ConvertFromUtf32(...)の引数に好きなアイコンを設定しましょう。
アイコンのコードポイントはNerd FontsのCheat Sheetで確認できます。

[char]::ConvertFromUtf32(...)のあとに+" "しているのは、ターミナルが全角/半角を誤認してレイアウトが崩れるのを防ぐためです。

ステータスのアイコンは$ThemeSettings.GitSymbolsで確認できます。

fzfとの連携

Cmderを使っていたときは、独自Luaスクリプトでfzfと連携するコマンドを使っていました。
下記のcdg, cdz, cdr, vimd, vimf相当のことをできるようにします。

fzf以外にも、コマンドによってツールのインストールが必要です。

コマンド 依存しているツール インストール方法の一例
cdr fd Scoop
cdz z PowerShell Gallery
cdg gowl go get
vimr fd / vim Scoop

profileにワンライナーのfunctionを定義すればOKです。

Import-Module z

# fzf
$env:FZF_DEFAULT_OPTS="--reverse --border --height 50%"
$env:FZF_DEFAULT_COMMAND='fd -HL --exclude ".git" .'
function _fzf_compgen_path() {
    fd -HL --exclude ".git" . "$1"
}
function _fzf_compgen_dir() {
    fd --type d -HL --exclude ".git" . "$1"
}

# Command
function cdg() { gowl list | fzf | cd }
function cdr() { fd -H -t d -E .git -E node_modules | fzf | cd }
function cdz() { z -l | oss | select -skip 3 | % { $_ -split " +" } | sls -raw '^[a-zA-Z].+' | fzf | cd }
function vimr() { fd -H -E .git -E node_modules | fzf | % { vim $_ } }

実際にコマンドを実行している動画です。

Linuxコマンドをできるだけ使えるようにする

日本語の扱いやパイプ、ビルドコマンドの制約などあるため完璧な設定は難しいです。
できるだけ違和感なくなるよう、頻出するコマンドだけカスタマイズしてみました。

以下はこれから設定するコマンドを組み合わせた動画です。

uutils/coreutilsのコマンドを使用する

Rustで書きかえられたクロスプラットフォーム対応のcoreutilsであるuutils/coreutilsを使います。
Scoopでインストールできます。

uutils/coreutilsuutils コマンド名という構文です。
パイプが必要なものと不要なものでそれぞれ設定します。

# パイプラインを受けつけないLinux標準コマンド
Remove-Item alias:cp
function cp() { uutils cp $args}
Remove-Item alias:mv
function mv() { uutils mv $args}
Remove-Item alias:rm
function rm() { uutils rm $args}
Remove-Item alias:ls
function mkdir() { uutils mkdir $args}
function printenv() { uutils printenv $args}

# パイプラインを受けつけるLinux標準コマンド
Remove-Item alias:cat
function cat() { $input | uutils cat $args}
function head() { $input | uutils head $args}
function tail() { $input | uutils tail $args}
function wc() { $input | uutils wc $args}
function tr() { $input | uutils tr $args}
function pwd() { $input | uutils pwd $args}
function cut() { $input | uutils cut $args}
function uniq() { $input | uutils uniq $args}
# ⚠ readonlyのaliasなので問題が発生するかも..
Remove-Item alias:sort -Force
function sort() { $input | uutils sort $args}

他に必要なコマンドがあれば追加してください。
既にエイリアスが存在するものはRemove-Itemで削除が必要です。

代替コマンドを使う

uutils/coreutilsで置き換えられないもの、他コマンドの方が良いものをそれぞれ設定します。 すべてScoopでインストールできます。

コマンド 依存しているツール インストール方法の一例
grep ripgrep Scoop
ll lsd Scoop
tree lsd Scoop

それらを使ってAliasやfunctionを設定します。

# grep
Set-Alias grep rg

# ll
function ll() { lsd -l --blocks permission --blocks size --blocks date --blocks name --blocks inode $args}

# tree
function tree() { lsd --tree $args}

lsdlsより見た目も格好良くて🆒ですね😄

lsdで特定ファイル、ディレクトリ、ドライブを表示しようとしたときエラーになる場合は..

lsdは環境によって表示されない場合があるようです。
同じくlsの代替ツールであるexaは上記ケースをケアするようです。

exaは今のところWindows未対応ですが、サポートの兆しがあります。
実際に以下Issue内で-lオプションを除く動作に成功しています。

lsdが使えない場合はexaのWindows対応を待つか、上記開発中のソースでビルド/インストールしてみてはいかがでしょうか。
以下のコメントに記載されたビルドコマンドでビルドできました。

exaを使う場合、関連する設定は以下のようになります。

function ls() { exa --icons $args }
function tree() { exa --icons -T $args}

# exa -lは未完成のためuutils lsを使う
function ll() { uutils ls -l $args}

課題

見た目もパフォーマンスも素晴らしいWindows Terminal x PowerShellですが課題もあります。

Linuxコマンドを呼び出すと文字化けすることがある

文字コードやコマンド設計のズレから、文字化けして表示できないことがあります。
先ほど紹介したように、パイプを利用するコマンドは代替コマンドを検討しましょう。

絵文字が入力できない

PowerShellの問題だと思います。

絵文字の表示はほぼ完璧ですが、入力は全くできません。
絵文字の入力が必要な場合はPowerShellではなくWSLを利用してみましょう。

トラブルシューティング

profileに記載された設定が部分的に反映されない

profileが CRLF改行 になっていることを確認してください。
LF改行の場合は正しく認識されないことがあります。

sshすると posix_spawn: No such file or directory

.ssh/configProxyCommandを設定している場合、ssh.exeのパスを絶対パスにしてください。

ProxyCommand    C:\Windows\System32\OpenSSH\ssh.exe -W %h:%p server

参考: https://serverfault.com/questions/956613/windows-10-ssh-proxycommand-posix-spawn-no-such-file-or-directory

Vimの文字コード/改行コードが推論されない

.vimrcに以下を記載してください。

" 文字コード自動判別
:set encoding=utf-8
:set fileencodings=iso-2022-jp,euc-jp,sjis,utf-8
" 改行コード自動判別
:set fileformats=unix,dos,mac

VimのBEEP音を消したい

.vimrcに以下を記載してください。

" 音を鳴らさない
:set belloff=all

Vimのクリップボードとyankが同期しない

.vimrcに以下を記載してください。

" Clipboard同期
set clipboard+=unnamed

総括

Windows TerminalPowerShellを使ってCOOLなターミナル環境を構築する手順を説明しました。
文字コード問題やLinuxにどこまで思考をあわせるか..という点でとても苦労しましたが、満足できるクオリティに仕上がったのでは..と感じています🤗

先日リリースされたWSL2をメインに考えている方も多いと思います。
しかし、結局のところWSL2はLinuxであり、1つの技術に依存するのはリスクだと思います。

PowerShell Coreもクロスプラットフォームを意識することで、標準的な仕様が増えてきました。
Windows Terminalの登場で、ターミナルソフト面でも優位性もあります。

この記事で1人でも多くの方がPowerShellを導入し、Windows環境での開発を楽しんでほしい..
と 心から願っております😊