Python
powerline
cmder
Windows10
WSL

Windows10での快適なCLI環境の構築 [WSL+Cmder+powerline](Pythoner向け)

WindowsのデフォルトのCLI環境は極めて使いにくいです.
イライラした経験をお持ちの方も多いかと思います.

また,WindowsでPythonを使う時は基本Anacondaを使う羽目になっていました.
Anacondaは"不必要なパッケージのインストール"や"環境変数の勝手な書き換え","ライブラリの管理がcondaとpipで二元化してしまう"など,個人的にはあまり好きではありません.

これらを一挙に解決する方法として,Windows Subsystem for Linuxを用いた環境構築の備忘録を残します.
ゴリゴリにシェルを魔改造する方向けではなく,ライトユーザー向けの設定なのでご了承ください.

1. 概要

before
2018-11-30 (2).png

after
2018-11-30 (3).png

1.1 使用したもの

  • OS: Windows10(バージョン1803)
  • Windows Subsystem for Linux(WSL)
  • Cmder
  • zsh (oh-my-zsh)
  • pyenv
  • powerline-shell

1.2 デフォルトで入っていてほしいもの

  • git (入ってない方はこちらがおすすめです)
  • vim

1.3 本記事で説明しないもの

  • 各アプリケーションの詳しい説明

2. WSLのインストール

  • コントロールパネルを開きます.(ご存知かと思いますが,スタートメニューのWIndows システムツールの中にあります)
  • プログラムWindowsの機能の有効化または無効化をクリックします.
  • Windows Subsystem for Linuxのチェックボックスを入れてOKして,ダウンロードが終わったらPCを再起動します.
    2018-11-30 (6).png
  • 再起動したら,ブラウザからhttps://aka.ms/wslstoreを開きます.
  • 好きなディストリビューション(Ubuntu)を選んでダウンロードし,終わったらUbuntuを開きます.
  • Ubuntuを開いたら,ユーザー名とパスワードを設定して,以下のコマンドを打ちます.
initial_setting_ubuntu
$ sudo apt update
$ sudo apt upgrade
$ sudo apt-get install zsh
  • ホームディレクトリをWindowsのホームディレクトリを一致させたい場合はこちらを参考にしてください.

3. Cmderのインストールと設定

3.0 フォントのインストール

  • 後々,必要なフォントを先にインストールしておいた方が楽なので,ここでインストールします.
  • Myrica-MM.ttfをダウンロードします.(Downloadボタンをクリック)
  • コントロールパネルからデスクトップのカスタマイズフォントを選んで,先程ダウンロードしたMyrica-MM.ttfをドラッグアンドドロップしてインストールを完了します.

3.1 Cmderのインストール

  • Cmderの公式にアクセスして,Download Miniを行います.
  • ダウンロードしたファイルはUsers/<ユーザー名>/cmder等に解凍して配置します.
  • コマンドプロンプトから起動できるようにしたい場合は,配置した場所に環境変数を通します.(オプション)

3.2 設定

  • cmder.exeを起動します.
  • 下にあるタブバーを右クリックしてSettingsを開きます.(Win+Alt+pでもショートカットできます)
  • GeneralFontsを選択し,Main console fontとAlternative fontの双方をMyrica MMに変更します.
  • StartupTasksを選択します.
    • 下部の+ボタンをクリックして新しいTaskを設定します.
    • Default task for new consoleにチェックを入れて
    • 右下の大きな空白の部分にC:\Windows\System32\bash.exe -cur_console:p -c zshと入力します.
    • Save settingsをクリックして設定を保存し,cmderを再起動します.

4. oh-my-zshの導入

  • bashよりもzshの方が補完等がよいので,zshを導入します.プラグイン管理としてoh-my-zshを使用します.
  • ログインシェルをzshに変更します.
zsh_setting
$ which zsh
## /usr/bin/zsh
$ chsh
## Changing the login shell for root
## Enter the new value, or press ENTER for the default
##     Login Shell [/bin/bash]: ここに"$ which zsh"の結果をはりつける
# ここまで設定したらPCを再起動します.
  • このままだと素のzshなので,プラグイン管理としてoh-my-zshを導入します.zplug等もありますが,なんだかんだoh-my-zshがお手軽なのでここはoh-my-zshを利用します.
oh-my-zsh
$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
  • いい感じに.zshrcをいじりましょう.Python使用者のおすすめはこんな感じです.
$ vim ~/.zshrc
.zshrc
export ZSH="/home/user/.zplug/repos/robbyrussell/oh-my-zsh"
ZSH_THEME="candy"
plugins=(
  git pip pyenv virtualenv
)
source $ZSH/oh-my-zsh.sh

5. 細かな設定

  • このままだとbeep音がうるさすぎるのでbeep音を消します.(この設定の記事がなかなか見つからなくて苦労しました.)
  • また,vimで一部キーがうまく動作しないことがあるので,そちらも設定します.
detail_settings
$ echo "setopt no_beep" >> ~/.zshrc
$ echo "set belloff=all" >> ~/.vimrc
$ echo "set term=builtin_ansi" >> ~/.vimrc
$ exec $SHELL

6. Powerlineの導入

Python使用者はPowerline-shellを入れると更に便利です.

6.1 python環境の構築

  • Powerline-shellはPython環境が必須です.
  • Python環境をインストールします.バージョン管理はpyenvとvirtualenvを用いて行います.
  • pyenvとvirtualenvをインストールしましょう.
pyenv
$ apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshenv
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshenv
$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.zshenv
$ exec $SHELL
$ git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
$ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.zshenv
$ exec $SHELL
  • 好きなバージョンをインストールしましょう.例えば,以下のように設定すると良いでしょう.
  • pyenvの使い方はこちらを参考にしてください.
python_initial_installation
$ pyenv install 3.6.0
$ pyenv virtualenv 3.6.0 default_env
$ pyenv global default_env

6.2 Powerline-shellのインストール

  • インストールはpipを使う場合とgitを使う場合があります.詳しくは公式を読んでください.今回はpipを使います.
install_powerline-shell
$ pip install powerline-shell
  • zshrcを変更します.oh-my-zshを入れている場合は,こんな感じにします.ZSH_THEME="candy"をコメントアウトして,その直後に以下の文言を挿入します.
.zshrc
setopt no_beep
export ZSH="/home/user/.zplug/repos/robbyrussell/oh-my-zsh"
# ZSH_THEME="candy"
#--------------- 挿入 ---------------#
function powerline_precmd() {
    PS1="$(powerline-shell --shell zsh $?)"
}
function install_powerline_precmd() {
  for s in "${precmd_functions[@]}"; do
    if [ "$s" = "powerline_precmd" ]; then
      return
    fi
  done
  precmd_functions+=(powerline_precmd)
}
if [ "$TERM" != "linux" ]; then
    install_powerline_precmd
fi
#--------------- 挿入 ---------------#

plugins=(
  git pip pyenv virtualenv
)
source $ZSH/oh-my-zsh.sh
  • やりたければ,表示のカスタマイズをします.私の設定は以下の通りです.
$ mkdir -p ~/.config/powerline-shell && powerline-shell --generate-config > ~/.config/powerline-shell/config.json
$ vim ~/.config/powerline-shell/original_color.py
original_color.py
from powerline_shell.themes.default import DefaultColor


class Color(DefaultColor):
    USERNAME_FG = 15
    USERNAME_BG = 4
    USERNAME_ROOT_BG = 1

    HOSTNAME_FG = 15
    HOSTNAME_BG = 10

    HOME_SPECIAL_DISPLAY = False
    PATH_FG = 15
    PATH_BG = 70
    CWD_FG = 231
    SEPARATOR_FG = 0

    READONLY_BG = 1
    READONLY_FG = 7

    REPO_CLEAN_FG = 14
    REPO_CLEAN_BG = 0
    REPO_DIRTY_FG = 3
    REPO_DIRTY_BG = 0

    JOBS_FG = 4
    JOBS_BG = 8

    CMD_PASSED_FG = 15
    CMD_PASSED_BG = 3
    CMD_FAILED_FG = 15
    CMD_FAILED_BG = 1

    SVN_CHANGES_FG = REPO_DIRTY_FG
    SVN_CHANGES_BG = REPO_DIRTY_BG

    VIRTUAL_ENV_BG = 31
    VIRTUAL_ENV_FG = 231

    AWS_PROFILE_FG = 7
    AWS_PROFILE_BG = 2

    TIME_FG = 15
    TIME_BG = 64
$ vim ~/.config/powerline-shell/config.json
config.json
{
    "segments": [
        "virtual_env",
        "uptime",
        "aws_profile",
        "ssh",
        "cwd",
        "git",
        "git_stash",
        "jobs",
        "newline",
        "set_term_title",
        "svn",
        "root",
        "time"
    ],
    "mode": "patched",
    "theme": "~/.config/powerline-shell/original_color.py"
}

7. 最後に

以上で設定は終わりです.
設定の結果,下のようなCLI環境を構築できます.
あとはお好みでzshのプラグイン等を入れてお試しください!

before
2018-11-30 (2).png

after
2018-11-30 (3).png

8. 追記

新しい仮想環境を設定するとpowerline-shellがないためバグります.
バグってしまった場合は該当ディレクトリにある.python_versionを削除すれば治ります.
バグを防止するためには,一旦bashに避難するのが簡単です.

new_environment
$ pyenv virtualenv <version> new_env
# ここで `$ pyenv local new_env` とするとバグります
# bashに避難
$ bash
$ pyenv local new_env
$ pip install powerline-shell
# もとに戻す
$ exec $SHELL