Windowsで快適なターミナル環境を作る

WindowsでもMacのようなターミナル環境がほしいと思い試行錯誤したが, やっと落ち着いた. 
ほしい機能は以下の通り. 

- Linuxコマンドが使える
- タブが使える
- Emacsで不便にならない
- Anacondaのpythonを呼べる

~~※pyenv版の設定は[こちら](https://qiita.com/birdwatcher/items/acbc79005d24616de5b6)~~

![fatty.png](https://qiita-image-store.s3.amazonaws.com/0/294661/c8f6318a-3935-6ebe-4ac8-87e23da757e9.png)
※ユーザ名はモザイクかけてあります. 

**2024年1月 追記: Windows TerminalにCygwinを設定するのが素直な方法になった**
以下は`settings.json`の変更メモ
```json
        {
            "command": "newTab",
            "keys": "alt+t"
        },
        {
            "command": "closeTab",
            "keys": "alt+w"
        }
```

```json
            {
                "commandline": "C:\\cygwin64\\bin\\bash.exe --login -i",
                "icon": "C:\\cygwin64\\Cygwin-Terminal.ico",
                "name": "Cygwin"
            }
```

# ターミナル環境を作る
Cygwin, Fatty, Winptyにより自分の満足する環境を作る. 

## Cygwin
[Cygwin](https://www.cygwin.com/)はLinuxコマンドを使えるようにするもの. 

今回必要なものは以下の通り. 

- make
- gcc-core
- gcc-g++
- gdb
- mingw64-x86_64-gcc-g++
- mingw64-i686-gcc-g++

これらはCygwinインストーラーから導入できる. 
Cygwinの環境構築に関しては, [こちら](https://qiita.com/birdwatcher/items/891ebe41a5e80d080171)を参照. 

## Fatty
[Fatty](https://github.com/juho-p/fatty)は, Cygwinをタブ化するもの. 
https://github.com/juho-p/fatty からzipをダウンロードしてコンパイルする. 
zip展開後, `make`と打てば`src`内に`fatty.exe`が作成される. 

Fattyのタブに関するデフォルトのコマンドはやや使いにくく, 
`Shift + 矢印`がEmacsで使えなくなるのは痛いので, 下記の通り変更. 

|機能|元コマンド|変更後|
| ---- | ---- |----|
|新規タブ       | Ctrl + Shift + T    | Alt + T           |
|タブ終了       | Ctrl + Shift + W    | Alt + W           |
|タブ切り替え   | Shift + →, ←        | Alt + →, ←        |
|タブ移動       | Ctrl + Shift + →, ← | Ctrl + Alt + →, ← |

変更方法は, どこを探しても見当たらなかったため, `src/wininput.c`を直接書き換えた. 
エディタで`win_tab_change`や`win_tab_create`で検索をかければ変更箇所はすぐにわかる. 

(変更箇所1) Before
<img alt="before1.png" src="https://qiita-image-store.s3.amazonaws.com/0/294661/c76d66c6-93e9-95dd-b299-b07aeb585728.png">
(変更箇所1) After
<img alt="after1.png" src="https://qiita-image-store.s3.amazonaws.com/0/294661/3f15419f-a01f-4f2b-4530-9111791ecd8b.png">

(変更箇所2) Before
<img alt="before2.png" src="https://qiita-image-store.s3.amazonaws.com/0/294661/eed84e71-ba78-ad64-e92e-0325006c0a5d.png">
(変更箇所2) After
<img alt="after2.png" src="https://qiita-image-store.s3.amazonaws.com/0/294661/8afd3637-4ee8-c9bd-d9f8-ad2f7a886ed6.png">


コンパイル後, Windowsのショートカット作成機能から, 
`C:\fatty-master\src\fatty.exe -e bash --login -i`
を作成する. (fatty.exeへのパスは人それぞれ)
(注意) `--login`が無いと, Cygwinの`.bashrc`を読んでくれない. 

## Winpty
上記の設定のままでは, `python`を呼んだときにCygwinのpythonが呼ばれてしまう. 
Anacondaのパスを通しても, cygwinから呼ぶと応答が返ってこない. 
そこで[Winpty](https://github.com/rprichard/winpty)でwrapしてやる必要がある. 

https://github.com/rprichard/winpty からzipをダウンロード後, 展開して, `./configure`して`make`. 
`build`内の`winpty.exe`を適当なところに移動. 

`.bashrc`に以下を追加. (winptyへのパスは人それぞれ)

```bash
ANA_PATH=/cygdrive/c/Users/(ユーザ名)/Anaconda3
export PATH=$ANA_PATH:$ANA_PATH/Library/bin:$ANA_PATH/Scripts:$PATH
alias 'python'='/cygdrive/c/winpty-master/build/winpty.exe python'
alias 'ipython'='/cygdrive/c/winpty-master/build/winpty.exe ipython'
```

また, `Octave`も同様に`octave-cli.exe`を`winpty`でwrapしてやることで, `octave`と打つだけで使えるようになる. 

```bash
alias 'octave'='/cygdrive/c/winpty-master/build/winpty.exe /cygdrive/c/Octave/Octave-4.4.0/bin/octave-cli.exe'
```

### 2022/12/30追記
cygwin最新版でwinptyがコンパイルエラーになるようになった。
エラー部分をコメントアウトしても正常に動かなかったため、使用をやめた。
[普通のwindows版python](https://www.python.org/downloads/windows/)ではwinptyを使わずとも.bashrcにパスを与えるだけで動くことを確認した。
(現CygwinバージョンでAnacondaを動かすとどうなるかは確認していない)
```bash
PY_PATH="/cygdrive/c/Users/(ユーザー名)/AppData/Local/Programs/Python/Python39"
export PATH=$PY_PATH:$PY_PATH/Scripts:$PATH
```

なお、cygwin同梱のpythonでは、psutilのpip installがうまくいかず、jupyterを入れることはできなかった。

# 参考URL

- [cygwinをタブ化するfattyで少し快適](https://qiita.com/k-shimoji/items/2698c46a9d6c77a47211)
- [cygwinからanacondaのpythonコマンドをたたく](https://qiita.com/iiou16/items/d4b6ddb03e06f527759b)

こういう解決法を最初に思いつく人ってすごい. 

# おまけ
この環境にたどり着くまでに試したこと

- WSL (Windows Subsystem for Linux)
 - Windows側との連携がいまいち
 - タブがない
- Cmder
 - Emacsで→でキャレットを移動中テキストが消えていく