Windows
Terminal
Cygwin
Linuxコマンド

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

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

ほしい機能は以下の通り.


  • Linuxコマンドが使える

  • タブが使える

  • Emacsで不便にならない

  • Anacondaのpythonを呼べる

fatty.png

※ユーザ名はモザイクかけてあります.


ターミナル環境を作る

Cygwin, Fatty, Winptyにより自分の満足する環境を作る.


Cygwin

CygwinはLinuxコマンドを使えるようにするもの.

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


  • make

  • gcc-core

  • gcc-g++

  • gdb

  • mingw64-x86_64-gcc-g++

  • mingw64-i686-gcc-g++

これらはCygwinインストーラーから導入できる.

Cygwinの環境構築に関しては, こちらを参照.


Fatty

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_changewin_tab_createで検索をかければ変更箇所はすぐにわかる.

(変更箇所1) Before

before1.png

(変更箇所1) After

after1.png

(変更箇所2) Before

before2.png

(変更箇所2) After

after2.png

コンパイル後, Windowsのショートカット作成機能から,

C:\fatty-master\src\fatty.exe -e bash --login -i

を作成する. (fatty.exeへのパスは人それぞれ)

(注意) --loginが無いと, Cygwinの.bashrcを読んでくれない.


Winpty

上記の設定のままでは, pythonを呼んだときにCygwinのpythonが呼ばれてしまう.

Anacondaのパスを通しても, cygwinから呼ぶと応答が返ってこない.

そこでWinptyでwrapしてやる必要がある.

https://github.com/rprichard/winpty からzipをダウンロード後, 展開して, ./configureしてmake.

build内のwinpty.exeを適当なところに移動.

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

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.exewinptyでwrapしてやることで, octaveと打つだけで使えるようになる.

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


参考URL

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


おまけ

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


  • WSL (Windows Subsystem for Linux)


    • Windows側との連携がいまいち

    • タブがない



  • Cmder


    • Emacsで→でキャレットを移動中テキストが消えていく