Windows TerminalとCmderとghqとpecoで快適なターミナル環境

# はじめに

最近ようやくWindows Terminalを導入してターミナル回りの環境を整理したのでその内容をまとめます．

メインとなるWindows上のターミナル環境はCmderを使っています．Cmder（Clink）を使うとコマンドプロンプトに補完や履歴機能，カラーリングが対応されたターミナル環境を使うことができて便利です．またMSYS2/MinGWでPOSIXのコマンドやGCCなどを使えるようにしています．
今回はこれにghqやpecoといったツールを利用して，さらに快適な環境になるようにまとめてみました．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/c67fb16e-e59b-9996-b0d0-43ec439f04f3.png)
またWindows Terminalでは，他にも様々な環境をタブページやペイン分割で動かすことができます．下の画像ではCmderとPowerShellとWSL2（Debian）とDcokerコンテナ（Ubuntu）が表示されています．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/3965039d-d14c-2f9e-cf9d-ee9c9c4b53b8.png)

# Windows Terminalのセットアップ

Windows TerminalはMicrosoftがOSSで開発している新しいターミナルアプリ（端末エミュレータ）です．

## Windows Terminalのインストール

Windows TerminalはMicrosoft Storeに公開されています．通常のWindows Terminalの他にPreview版もありますが，今回は通常版をインストールしています．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/798507e0-95cf-20f8-4cfc-b011728ad9e6.png)
インストール後にWindows Terminalを起動すると，初期状態ではPowerShellあたりが起動すると思います．実行ファイル名は`wt.exe`になります．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/cbc92014-7d12-744e-bc95-e6b3d1f3a4e7.png)

## Windows Terminalの簡単な操作

マウス操作なら画面上部のボタンからタブページの追加を行うことができます．この後の手順で，ここでCmderが選択できるように設定します．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/d2fee7df-bcf1-beb5-a9b5-722faca5c9cc.png)
またWindows Terminalはコマンドパレットを使うことができます．こちらを使うとキーボード操作でやれることが増えて便利です．コマンドパレットは`Ctrl`+`Shift`+`P`で表示することができます．コマンドの一覧が表示されますがキーボード入力することでインクリメンタルサーチで項目を絞り込んでいくことができます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/0c7f63cd-e60b-c4fa-14f2-7b7dc8e800f4.png)
新しいタブページの作成`New Tab`やペイン分割の作成`Split Pane`と，タブページの移動`Nex Tab`やペイン分割の移動`Move focus xxx`などの操作に慣れると使いやすくなるともいます．またこれらはショートカットキーが割り当てられているものも多いので，よく使う操作はそちらで操作するとよりよいです．ショートカットキーもコマンドパレットから確認できます．

## Windows Terminalのカスタマイズ

Windows TerminalはJSON形式の設定ファイル`settings.json`を編集することでカスタマイズが可能です．例えば上記で説明したショートカットキーなども独自に設定することができます．詳しくは下記のドキュメントを参照してください．settings.jsonは`Ctrl`+`,`で表示されます．
[https://docs.microsoft.com/ja-jp/windows/terminal/customize-settings/global-settings](https://docs.microsoft.com/ja-jp/windows/terminal/customize-settings/global-settings)

細かな設定は実際に使いながら必要に応じてカスタマイズしていけばよいかと思いますが，まずはじめに配色を好みのものに変更してみるのもよいです．デフォルトでも数パターン用意されていて，上記のドキュメントを参考に簡単に変更できます．
また下記のサイトからより多くのテーマを取得することができるのでおすすめです．お気に入りのテーマが見つかったら`Get theme`ボタンを押すと配色の設定がクリップボードにコピーされます．その内容をsettings.jsonの中の`schemes`に追加することでそのテーマが使用できます．
[https://windowsterminalthemes.dev](https://windowsterminalthemes.dev)

下図はGit Bushに`Hybrid`というテーマを設定している例です．このように動かす環境ごとにテーマを変えると冒頭のイメージのように見た目で分かりやすくなります．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/b79858c5-bab9-a31e-cf11-2ad7729a4aac.png)

# Cmderのセットアップ

CmderはConEmu，CLink，Git for Windowsなどを組み合わせて作られたターミナル環境になります．コマンドプロンプトにUNIXライクな機能が追加された感覚で使用することができます．また見た目もきれいでかっこいいです．

## Cmderのインストール

Cmderは本家のサイトかGitHubのリリースページからダウンロードできます．ダウンロードしたzipを任意の場所に解凍します．
[https://cmder.net](https://cmder.net)

解凍したら中にある`Cmder.exe`を実行するとターミナルが立ち上がります．初回起動時には設定ファイルが数ファイル展開されます．
ただし今回はこれをこのまま使うのではなくWindows Terminalから起動して使えるように後ほど設定します．個人的にはコマンドパレットからの操作感でWindows Terminalのほうが好みでした．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/458a232d-47bf-9f8a-5077-a38da073e899.png)

## Cmderの簡単な操作

基本的な操作は通常のコマンドプロンプトと同じように使用することができますが，入力の補完機能や履歴管理が強化されています．

コマンドの入力や`cd`などでのパスの入力時には`Tab`キーで補完を行ってくれます．毎回すべてを入力するのではなく有効に補完機能を使うことで，ターミナル操作の効率が上がると思います．

また`history`と入力すると，コマンド入力の履歴を確認することができます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/11248041-9412-05ec-0eb2-e7b6e0595cb6.png)
`Ctrl`+`R`でコマンド履歴の検索`reverse-i-search`を使用することもできます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/8db237ff-8e7a-7901-e9ce-337ad8c17e27.png)

## Cmderのカスタマイズ

Cmderの簡単なカスタマイズとして，プロンプトの変更とエイリアスの設定について紹介します．

プロンプトは初期状態で`λ`が表示されます．ただ後述するVSCodeのターミナルでCmderを使用したときに，カーソルの位置がずれて表示されることがあります．プロンプトにマルチバイト文字が使用されていることが原因のようで，`$`などに変更しておくとこの問題が解消されます．
`cmder\vendor\clink.lua`の51行目あたりに`lambda`という変数にプロンプトに使用する文字が定義されているので，ここを修正するとプロンプトの文字を変更することができます．

```diff:clink.lua
-    local lambda = "λ"
+    local lambda = "$"
```

エイリアスの設定は`cmder\config\user_aliases.cmd`で行います．（このファイルは一度Cmderを起動しないと存在しません．）初期設定でいくつかのエイリアスが登録されているので，それらの記述を参考にしてエイリアスの設定を追加することができます．
Cmderではホームディレクトリに簡単に移動する方法がないので，`cd~`でホームディレクトリ（ユーザフォルダ）へ移動するエイリアスの指定を，例として紹介しておきます．

```bat:user_aliases.cmd
cd~=cd %HOMEPATH%
```

# Windows TerminalでCmderを使用する設定

Windows TerminalとCmderのそれぞれの準備ができたので，次はWindows TerminalでCmderを動かすための設定を行います．

## GUIDの発行

まずPowerShellを使ってGUIDを発行します．下記の例だと`d4a9485e-29c1-490a-b668-6e0ed5eda2ba`がGUIDになります．

```powershell
PS C:\> [guid]::NewGuid()
Guid
----
d4a9485e-29c1-490a-b668-6e0ed5eda2ba
```

## Windows TerminalにCmderを追加

Windows TerminalでCmderを動かすための設定も前述している`settings.json`で行います．`profiles`の中の`list`に次のようにCmderの設定を追加します．

```json:settings.json
"list": [
  {
    "guid": "{d4a9485e-29c1-490a-b668-6e0ed5eda2ba}",
    "hidden": false,
    "name": "Cmder",
    "icon": "%USERPROFILE%\\cmder\\icons\\cmder.ico",
    "startingDirectory": "%USERPROFILE%",
    "commandline": "cmd.exe /k %USERPROFILE%\\cmder\\vendor\\init.bat",
    "colorScheme": "Monokai Cmder"
  }
]
```

`guid`には事前に発行していたものを`{}`で囲って記述します．
`commandline`がメインの設定で，このように設定するとWindows TerminalでCmderのシェルを動かすことができます．
その他，`icon`を指定しておくとタブ表示などにアイコンが表示されます．`startingDirectory`は起動時のディレクトリを指定します．`colorScheme`も個別に指定しておくと動かしている環境が分かりやすくておすすめです．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/6fe76df4-5f84-015c-1fb7-deba06f67fdb.png)
また，settings.jsonの上のほうに`defaultProfile`という項目があるので，ここにCmderのGUIDを指定しておくと，Windows Terminalを起動したときにデフォルトでCmderが起動するようになります．Cmderをメインに使っていく場合は指定しておくとよいです．

```json:settings.json
"defaultProfile": "{d4a9485e-29c1-490a-b668-6e0ed5eda2ba}"
```

# ghqとpecoの導入

ghqとpecoを使ってGitのリポジトリに簡単に移動できるようにします．どちらもGo製のコマンドラインツールになります．

* ghqはGitリポジトリの管理を行ってくれるツールです．
* pecoは入力内容をインクリメンタルサーチでフィルタリングして選択できるツールです．

この二つを組み合わせて，Gitリポジトリに簡単に移動できる環境を用意します．
 
## ghqとpecoのインストール

それぞれGitHubのリリースページから実行ファイルをダウンロードして，環境変数のPATHが通ったディレクトリに配置すると使えるようになります．Go製のツールなのでワンバイナリで動くのでお手軽です．

* [https://github.com/x-motemen/ghq/releases](https://github.com/x-motemen/ghq/releases)
* [https://github.com/peco/peco/releases](https://github.com/peco/peco/releases)

下記のように入力してバージョンが表示されればOKです．

```console
$ ghq --version
ghq version 1.1.5 (rev:f5ac3e5)
$ peco --version
peco version v0.5.8 (built with go1.14.2)
```

## リポジトリ管理するディレクトリの設定

ghqを使って管理されるディレクトリはデフォルトで`%USERPROFILE%/ghq`となりますが，設定で変更することもできます．
下記のように`git config`で指定すると`ghq root`でパスが設定されたことが確認できます．

```console
$ git config --global ghq.root /path/to/dev
$ ghq root
/path/to/dev
```

## Gitリポジトリのクローン

ghqを使ってGitリポジトリをクローンします．クローンはどのディレクトリから実行しても`ghq root`に指定したディレクトリにクローンされます．またこの時にクローするURLに合わせたディレクトリ階層が自動的に作成されて，そこにクローンされます．

```console
$ ghq get git@github.com:/path/to/repo.git  # github.com/path/to/repoというディレクトリ階層が作成される
```

## Gitリポジトリの一覧表示と移動

`ghq list -p`とすると，Gitリポジトリの一覧が絶対パスで表示されます．これとpecoを組み合わせてリポジトリを選択し`cd`に渡すことで簡単にGitリポジトリに移動することができます．
次のようなbatファイルを用意して，PATHの通ったディレクトリに配置するかCmderのエイリアスを使って呼び出しやすいようにしておくと便利です．

```bat:peco-ghq.bat
for /f "tokens=*" %%x in ('ghq list -p ^| peco') do (
  cd %%x
  break
)
```

このような感じに使うことができます．どこからでも簡単にGitリポジトリに移動できて便利です．
![peco-ghq.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/1346c870-244d-49a8-8daa-6ffad4a750fc.gif)

# その他いろいろ

最後にここまでで紹介していないWindows Terminalの設定，pecoの別の活用法，VSCodeでCmderを使う方法，MSYS2/MinGWのセットアップ方法を紹介します．

## Windows Terminalのその他の設定

フォントの設定に以下のようなものがあります．お好みで設定をするとよいです．

* `fontFace`：フォント名
* `fontSize`：フォントサイズ
* `fontWeight`：フォントの太さ

フォントはデフォルトでは`Cascadia Mono`が使われています．Microsoftがターミナルやプログラミング用テキストエディタでの使用を想定して開発したフォントです．`Cascadia Code`の合字を外したものが`Cascadia Mono`になります．
[https://docs.microsoft.com/ja-jp/windows/terminal/cascadia-code](https://docs.microsoft.com/ja-jp/windows/terminal/cascadia-code)

ウィンドウの背景を透過することもできます．こちらもお好みで設定をしてください．

* `useAcrylic`：透過（true/false）
* `acrylicOpacity`：不透明度（0～1）

カーソルの形もお好みで指定できます．

* `cursorShape`："bar"，"vintage"，"underscore"，"filledBox"，"emptyBox"

このあたりの設定は動かす環境ごとに`profiles.list`の中で個別に指定してもいいですが，`defaults`の中で指定すると共通の設定内容を指定することができます．

```json:settings.json
"profiles": {
  "defaults": {
    "comment": "SETTINGS TO APPLY TO ALL PROFILES"
  },
  "list": [
    {
      "comment": "PROFILE OBJECTS"
    }
  ]
}
```

また，実用性はあまりありませんがCRTディスプレイ風に文字を表示する機能もあります．気分転換にどうぞ．

* `experimental.retroTerminalEffect`：レトロ表示（true/false）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/5d9860dd-7320-afde-b63c-2fe0dfaf74ff.png)

## pecoでコマンド履歴検索

pecoはghqとの組み合わせの他にも便利に使うことができます．ここでは`history`との組み合わせを紹介します．historyの結果には先頭に番号が振ってあるので`sed`でそれをはずしてからpecoに渡すようにしています．また逆順で表示するほうがよければ`tac`を使用するとよいです．

```bat:peco-history.bat
set history=%CMDER_ROOT%/vendor/clink/clink history
for /f "tokens=*" %%x in ('call %history% ^| sed -e "s/^ *[0-9]\+ \+\(.\+\)$/\1/g" ^| tac ^| peco') do (
  %%x
  break
)
```

また，選択したコマンドを直接実行するのではなく，いったんクリップボードにコピーしたほうがよければ，次のようにするとよいです．

```bat:peco-historyc.bat
set history=%CMDER_ROOT%/vendor/clink/clink history
for /f "tokens=*" %%x in ('call %history% ^| sed -e "s/^ *[0-9]\+ \+\(.\+\)$/\1/g" ^| tac ^| peco') do (
  set /P ="%%x"< nul | clip
  break
)
```

## VSCodeのターミナルでCmderを使う方法

CmderはVSCodeのターミナルでも使用することができます．VSCodeの設定で下記のように指定すると動きます．`CMDER_ROOT`にはCmderを配置したパスを指定します．

```json:settings.json
{
  "terminal.integrated.shell.windows": "cmd.exe",
  "terminal.integrated.env.windows": {
    "CMDER_ROOT": "${env:HOMEPATH}\\cmder"
  },
  "terminal.integrated.shellArgs.windows": [
    "/K",
    "%CMDER_ROOT%\\vendor\\bin\\vscode_init.cmd"
  ]
}
```

このような感じにCmderのシェルをVSCodeのターミナルで動かすことができます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/101c1d27-569d-3b6f-9fe5-80593a2c6448.png)

## MSYS2/MinGWのセットアップ

MSYS2/MinGWでPOSIXのコマンドやGCCなどの環境をインストールしておきます．MSYS2のインストーラを取得してインストールしてください．
[https://www.msys2.org](https://www.msys2.org)

MSYS2の環境を扱うには，同梱されているターミナルを使ってもいいですが，MSYS2のインストール場所を環境変数のPATHに追加するとCmderからでも扱うことができます．

* `C:\msys64\mingw64\bin`
* `C:\msys64\usr\bin`

PATHを設定すると`pacman`（パッケージマネージャ）を扱うことができます．pacmanを使って必要なパッケージをインストールします．

```console
$ pacman -Syuu
$ pacman -S base-devel msys2-devel mingw-w64-x86_64-toolchain
```

例えば`ls`，`mv`，`cp`，`rm`，`cat`，`grep`などが使えるほかに，`gcc`，`make`などの開発用のコマンドも使えるようになります．`pacman -Syuu`でインストール済みのパッケージを一括で更新できるのでおすすめです．

# おわりに

Windows TerminalとCmderとghqとpecoを使って，そこそこ快適なターミナル環境をWindowsでも作ることができたのではないかと思います．WSL2やDockerが普及してWindowsでもターミナルを使いたいシーンは増えてくると思います．Windwosでのターミナル環境に困っている方がいれば，参考にしてもらえると幸いです．