MSYS2で快適なターミナル生活

  • 187
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

MSYS2で快適なターミナル生活

Windowsでコマンドラインの環境を整えるには、MSYS2が優秀だ。
デフォルトのターミナルはmintty、シェルはbash、パッケージマネージャとしてpacmanがついている。
Windowsのパッケージ管理ソフトChocolateyをインストールすれば体制は万全だ。
ソフトウェアのインストールをほぼコマンドラインだけで済ませることができる。
つまりシェルスクリプトを組めばバックアップやセットアップも自動化できるということだ。
あとは設定ファイルをgithubなどに格納してインストール用スクリプトを書けば完璧だろう。

MSYS2 - Minimal SYStem 2

MSYS2はWindows上で動くUnixシェル環境だ。
詳しくはWindowsで使えるターミナルとシェルのまとめを参照されたし。

よくMinGWと一緒に語られているが、MinGWはGCCなどの開発ツールをまとめたツールチェインだ。
MinGWのインストーラーを使うと、古いMSYSを導入できるが、minttyはついていない。
古いMSYSはMSYS2ではないことも強調しておく。
なので、MSYS2からpacmanでMinGWをインストールするのが正解だ。

またMSYS2の競合相手としてCygwinが挙げられるが、こちらは使う人を選ぶ。
使いにくいパッケージインストーラー、独特のパス(cygdrive)、cygwin1.dll依存という問題があるからだ。
パッケージインストーラーの問題はapt-cygがあるので緩和されたが、最初にwgetかcurlまたはgitをいれておかないと、apt-cygスクリプトのダウンロードにも手間がかかる。
パスの設定もめんどくさいので、その辺りを自動で行ってくれるMSYS2の方が便利だ。

参考
MSYS - Wikipedia
Cygwin - Wikipedia

MSYS2のインストールと起動

MSYS2 installer

i686が32bit版で、x86_64が64bit版だ。
ここでは32bit版を前提に話をすすめる。

msys2-i686-20160205.exeをダウンロードしてMSYS2をインストールする。
(年月日の記述はバージョンによって変化するので最新版をダウンロードすること)
デフォルトではC:\msys32にインストールされる。

インストールフォルダに幾つか起動用のバッチファイルが見つかるが、それぞれ環境変数やパスの設定が変わるので用途によって使い分けるとよい。

  • msys2_shell.bat
    開発環境(MinGW)が必要でない場合のmintty+bashの起動スクリプト。

  • mingw32_shell.bat
    \mingw32\binのパスなどが通った状態で起動できる。
    MinGW自体はpacmanでインストールが必要となる。

MSYS2ではデフォルトではlnでシンボリックリンクの作成ができないのだが、起動batファイルの中にある行をアンコメントすると、シンボリックリンクの作成ができるようになる。
なお、シンボリックリンクの作成には管理者権限が必要だ。

rem To activate windows native symlinks uncomment next line
set MSYS=winsymlinks:nativestrict

参考
MSYS2 による gcc 開発環境の構築
msys2 + pacmanをproxy環境で使う
MSYS2小ネタ集

minttyの設定

ターミナルはminttyが使用されている。
起動したら早速設定を変更する。
Windows Glassのモダンな見た目を設定することができるのは他にはない特徴だ。
Glass表示は白背景には弱いが、黒背景を使っている場合は、カッコよさが際立つ。
実用優先なら透過率(Transparency)をHighにするのが良いだろう。

オススメは下記のとおりだ。

Looks => Transparency => Glass
Looks => Cursor => Block, Blinking

Text => Font => Select...
Ricty Diminished, 11-point
OR
MyricaM M, 11-point

Text => Locale => ja_JP
Text => Character set => UTF-8

Window => Scrollbar => None

Terminal => Type => xterm-256color

minttyの設定は~/.minttyrc(C:/msys32/home/[user]/.minttyrc)というファイルに保存される。
ファイルを直接編集した方が自由度が高い設定を行える。
下記は実際に使っている.minttyrcの内容だ。

# .minttyrc
BoldAsFont=no
Font=MyricaM M
FontHeight=11

Columns=115
Rows=58
CursorType=block
Scrollbar=none
Transparency=glass
BackgroundColour=0,0,0
ForegroundColour=243,243,243

Locale=ja_JP
Charset=UTF-8
Term=xterm-256color

CopyOnSelect=yes
RightClickAction=paste
BackspaceSendsBS=yes

IMECursorColour=255,0,0

フォントはRictyかMyricaが見やすい。
yascentur/RictyDiminished - GitHub
Inconsolataベース。

Download ZIPボタンまたはreleases内の最新のZIPから入手できる。
解凍するとttfファイルがあるので複数選択して右クリックでインストールできるはずだ。
Discordと付いている方は数字の0がスラッシュではなくドットだったり、小文字のlが片足だったりと微妙な違いがある。

tomokuni/Myrica - GitHub
Inconsolataベース。
濁点・半濁点が大きくて日本語が非常に見やすい。

参考
man mintty
mintty/mintty/Wiki/Tips

pacman

pacmanはMSYS2のパッケージ管理システムだ。
ArchLinux由来でとても使い勝手がいい。
パッケージ管理システムの便利さに慣れてしまえば、もうそれ無しではいられない。
MSYS2(mintty+bash)を起動したら初めにやることはパッケージの更新だ。

update-core
# 更新があれば一度閉じて開き直す
pacman -Su

update-coreスクリプトが導入される以前はpacman --needed -Sy bash pacman pacman-mirrors msys2-runtimeというコマンドが使用されていた。

pacman -Syuで更新するとupdate-coreを忘れた場合、システムがおかしくなる場合があるらしので、pacman -Suを使うべし。(現象は未確認だが、念のため)

以下pacmanコマンドのオプションについて、使用頻度の高い順に並べてみた。
ヘルプのやり方だけ覚えておけば、迷った時に確認できるだろう。

  1. pacman -hでヘルプ。
  2. pacman -S -hで-Sオプションのヘルプ。
  3. pacman -Suでパッケージのアップデート(事前にupdate-coreが必要)。
  4. pacman -Ss [pattern]でパッケージを検索。
  5. pacman -Sl | grep [pattern]でもだいたい分かる。
  6. pacman -S [package]でインストール。
  7. pacman -Rs [package]でアンインストール。
  8. pacman -Sgでパッケージグループの一覧を表示。
  9. pacman -Qqeでインストール済みのパッケージ一覧を表示。
  10. pacman -Si [package]で詳しい情報を表示。
  11. pacman -Scで使っていないキャッシュを削除。

参考
pacman - Wikipedia
pacman - archlinux
Arch Linux - wikipedia

pacmanのリポジトリを制限

MSYS2をそのまま使うとmingw32, mingw64, msysという3つのリポジトリが有効になっている。
このまま使ってもよいのだが、32bit環境だとmingw64というリポジトリは必要ない。
無効にしておいたほうが表示がすっきりするだろう。

/etc/pacman.confというファイルを開き、下記をコメントアウトすればよい。
ついでに#Colorという行をアンコメントしておくとpacmanのメッセージがカラー表示となる。

Color

#[mingw64]
#Include = /etc/pacman.d/mirrorlist.mingw64

MinGWのインストール

MinGWとはWindows上で使えるGNUのツールチェインのひとつだ。
ツールチェインとはmake, gcc, gdb, binutils, ライブラリなどがセットになった開発用パッケージのことだ。
MinGWをインストールするとWindows上でconfigureやmake(mingw32-make)が可能となる。
その他にも役立つコマンドが入っているので入れておくべし。

MSYS2のMinGWはパッケージグループとして提供されている。
pacmans -S [package-group]とパッケージグループを指定すると多数のソフトウェアを一度にインストールすることができて便利だ。
AdaやFortranなど不要なものもあるがひとまず全て入れておけば間違いない。

# パッケージグループの一覧を表示する
pacman -Sg
# ツールチェインをインストールする
pacman -S mingw-w64-i686-toolchain

ツールチェインにこのような長い名前が付いているのは、GNUのツールチェインの命名規則に似せてわかりやすくしているからだ。
MinGW32ツールチェインでインストールされるクロスコンパイラは下記のような名前になっている。

i686-w64-mingw32-gcc.exe
[architecture]-[vendor]-[system]-gcc.exe
i686: PentiumPRO以降の互換機向けのarchitecture
w64: MinGW64というvendor(制作元)
mingw32: MinGW32(Win32API)

これはMinGW64が作成したi686向けMinGW32用GCCという意味になる。

他のツールチェインの一例も載せておく。

arm-none-eabi-gcc.exe
[architecture]-[vendor]-[system]-gcc.exe
arm: ARM向けのarchitecture
none: なし
eabi: eabiは組み込みベアメタル向け

ARMは組み込み向けで有名なプロセッサだ。
ベンダーがnoneということは、個人または小規模のグループが提供している場合が多い。
eabiとはABIのひとつで、ABIはバイナリにおけるAPIに該当するものだ。
ベアメタルはLinuxOSを使わない場合のシステム構成を指す言葉である。
以上のことからarm-none-eabi-gccはARMプロセッサ向けのベアメタル用GCCということがわかる。

参考
MinGW - Wikipedia
ツールチェーン - Wikipedia
GNUツールチェーン - Wikiepdia

bashの設定

デフォルトのシェルはbashだ。
pacmanでzshやfishもインストールできるが、ここでは応用の効くbashを使うことにする。

他のシェルを使いたい場合は下記を参考にするとよい。
zsh
MSYS2でWindowsにzsh環境を導入する
※現在のバージョンでは履歴ファイルの問題は発生していない。

fish
fishと出会った
Fish-ShellのDesign document読んでみたり、プラグイン試してみたり
詳解 fishでモダンなシェル環境の構築

/etc/fstab

/etcにはMSYS2の設定ファイルが格納されている。
実際のパスはC:/msys32/etcだ。

/etc/fstabファイルは起動時に読み込まれ、自動でマウントを行うことができる。
よく使うディレクトリを登録しておくと便利だろう。

# /etc/fstab
# パスは/でも\でもよい
# スペースは\040に置き換える
C:/workspace /wk
C:/workspace/git /git
C:\Program\040Files /pf
C:\Windows\System32 /sys32

反映させるには再起動が必要となる。
開いているターミナルを一度終了し、もう一度起動させれば/(ルート)以下にマウントされているはずだ。

参考
fstab - Wikipedia
※fstabはfile system tableの略

bashの設定ファイル

cdはカレントディレクトリを変更するコマンドだ。
オプションを省略した場合は、ユーザーのホームディレクトリへ移動する。

cd
# もしくは
cd ~
# もしくは
cd ${HOME}
# もしくは
cd /home/${USER}

bashでは~(チルダ)は展開されてホームディレクトリと同じ意味となる。
実際のパスはC:/msys32/home/[user]だ。

ホームディレクトリ以下には、そのユーザー独自の設定ファイルなどが保存されている。
設定ファイルは.(dot)から始まるものが多く、それらを総称してdotfilesという。

bashの設定を変更する場合は、.bash_profile.bashrcを変更する。
各ファイルの先頭にecho '.bashrc'と自身のファイル名を記述しておけば読み込み順がわかりやすい。

~/.bash_profile
ログイン時に一度だけ読み込まれる設定ファイル。
MSYS2の場合は、mintty(+bash)起動時となる。
exportで環境変数などを設定するとよい。

~/.bashrc
対話モードのbashを起動する度に読み込まれる設定ファイル。
起動時に~/.bash_profileまたは~/.profileから読み込まれる。
設定ファイルに付いているrcとはrun commandsの意味だ。
aliasやfunctionを設定するとよい。

~/.bash_aliases

aliasの設定をまとめたファイル。
デフォルトでは存在しないので作成する。

.bash_aliasesの内容は.bashrcに直接記述してもよい。
ファイルとして分割していると.bashrcに記述する量が減るので見通しが良くなる。
別のシェルから読み込ませて設定を共通化することもできる。

Windowsのエクスプローラー上では.(dot)から始まるファイルを作成できない。
bash上であれば、echo>.bash_aliasesとすれば作成できる。
エクスプローラー上でhoge.txtを作成してから、bashでmv hoge.txt .bash_aliasesと名前を変更してもよい。

# .bash_aliasesの中身
echo '.bash_aliases'

# Aliases for MSYS2 bash
# alias hogeを一時的に無効にするには\hoge

# 移動しやすく
alias ..='cd ..'
alias ...='cd ../..'
alias -- -='cd -'

# lsを使いやすく
alias ls='ls --color=auto --show-control-chars --time-style=long-iso -FH'
alias ll='ls -lA'
alias la='ls -A'
alias sl=ls

# 設定の読み込み
alias relogin='exec $SHELL -l'
alias re=relogin

# 画面消去
alias c=clear
alias cls=reset

# Windowsっぽく
alias dir=ll
alias path='echo -e ${PATH//:/\\n}'

# ディスクサイズ
alias df='df -h'
alias du='du -h'
alias du1='du -d1'

# grepを使いやすく
# grep -r hogeで./以下のファイルの中身からhogeを検索
# find | grep hogeで./以下のファイル名からhogeを検索
# whereis hogeでコマンドの関連場所を検索(bin, src, man)
# type -a hogeでコマンドを検索
alias grep='grep --color'

# Windowsコマンド文字化け対策
function wincmd()
{
    CMD=$1
    shift
    $CMD $* 2>&1 | iconv -f CP932 -t UTF-8
}
alias cmd='winpty cmd'
alias psh='winpty powershell'
alias ipconfig='wincmd ipconfig'
alias netstat='wincmd netstat'
alias netsh='wincmd netsh'
# pingのコマンド名混同を避けるため絶対パスで指定
alias ping='wincmd /c/windows/system32/ping'

# ネットワーク確認用
alias ping1='ping www.google.com'
alias ping2='ping 192.168.0.1'

# mingw32用
# msysのmakeと被らないようにコマンド名が変えられている
alias make='mingw32-make'
alias m='make -j3'

.bash_aliasを作成したら、読み込む設定を有効化する必要がある。
.bashrc内の該当箇所のコメントを解除するか、記述を追加する。

# .bash_aliasesを読み込むようにする
if [ -f "${HOME}/.bash_aliases" ]; then
  source "${HOME}/.bash_aliases"
fi

変更を保存した後はbashを再起動するか、下記コマンドで設定ファイルを読み込ませれば有効になる。

# 設定を読み込む
source ~/.bashrc
# もしくは
cd;source .bashrc
# もしくは
exec bash -l

# 一度読み込んだあとは下記aliasが有効になるので簡単に再読み込みできる
relogin
# もしくは
re

GitHubなどでbash_aliasesを検索すると参考にできる設定が多数見つかる。
bashrc, dotfiles, zshrcというキーワードでもよい。
.zshrcはzsh用だが、aliasの設定などはそのまま使えることが多い。
インストールされているコマンドは環境によってだいぶ異なるので注意されたし。

参考
Windowsコマンドの文字化け対策
gnupackでCygwin導入した時に最初にすること

~/.bash_functions

aliasと同様にfunctionの設定をまとめたファイル。
デフォルトでは存在しないので.bash_aliasesと同様に作成する。

# .bash_functionsの中身
echo '.bash_functions'

# Functions for MSYS2 bash

# pacman for mingw32
function pinst()
{
    pacman -S "mingw-w64-i686-$1"
}
function puninst()
{
    pacman -Rs "mingw-w64-i686-$1"
}

# others
function snow()
{
    clear;while :;do echo $LINES $COLUMNS $(($RANDOM%$COLUMNS));sleep 0.1;done|gawk '{a[$3]=0;for(x in a) {o=a[x];a[x]=a[x]+1;printf "\033[%s;%sH ",o,x;printf "\033[%s;%sH*\033[0;0H",a[x],x;}}'
}

function matrix()
{
    echo -e "\e[1;40m" ; clear ; while :; do echo $LINES $COLUMNS $(( $RANDOM % $COLUMNS)) $(( $RANDOM % 72 )) ;sleep 0.05; done|gawk '{ letters="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@#$%^&*()"; c=$4; letter=substr(letters,c,1);a[$3]=0;for (x in a) {o=a[x];a[x]=a[x]+1; printf "\033[%s;%sH\033[2;32m%s",o,x,letter; printf "\033[%s;%sH\033[1;37m%s\033[0;0H",a[x],x,letter;if (a[x] >= $1) { a[x]=0; } }}'
}

.bashrc内の該当箇所のコメントを解除するか、記述を追加する。

# .bash_functionsを読み込むようにする
if [ -f "${HOME}/.bash_functions" ]; then
  source "${HOME}/.bash_functions"
fi
pinst, puninst

pacmanはパッケージ名が重複できないという制限がある。
その結果MinGW32のパッケージの場合はmingw-w64-i686-というプレフィックスが必要となる。
毎回打つのは面倒なので省略できるよう関数化しておくと便利。

snow

ターミナル上に雪を降らせるワンライナーを実行する。

matrix

ターミナル上にマトリックスのごとく文字を降らせるワンライナーを実行する。

参考
役には立たないけどちょっとだけ面白いLinuxターミナルでのお遊びコード9個
英和・和英翻訳と今日明日明後日の天気をターミナルから調べる便利コマンドのご紹介

~/bin

ホームディレクトリにbinディレクトリを作成し、そこへオリジナルのスクリプトを追加しておくと便利だ。
.bash_profileでパスを通す必要があるので、該当箇所をアンコメントするか記述を追加する。

# ~/binをPATHに追加
if [ -d "${HOME}/bin" ] ; then
  PATH="${HOME}/bin:${PATH}"
fi

以下、あると便利だと思われるスクリプトなど。
.bash_profileに関数として定義してもよいが、複数の関数を使う場合などは個別にスクリプト化したほうが見通しがよい。

なお、各ファイルの先頭にはシバン(shebang)が必要となるので、追加すること。
/bin/shでもbashが動くが、POSIXオプションがONとなるという違いがある。

#!/bin/sh
# もしくは
#!/bin/bash
# もしくは
#!/usr/bin/env bash
colors

ターミナル上で256色を出力して、表示を確認したい時に使用するスクリプト。
AnsiColors256.ansはConEmuのbinフォルダに付属していたのをコピペしてきた。
minttyを使用している場合はこのスクリプトで確認する必要はないと思われる。

# colors

echo '16 colors and formatting:'
echo ' ^[${attr};${bg};${fg}m'
bg=40
for fg in {30..38} {90..97}; do
    for attr in 0 1 2 4 5 7; do
        echo -en "\e[${attr};${bg};${fg}m ^[${attr};${bg};${fg}m \e[0m"
    done
    echo #Newline
done

echo #Newline
cat "${HOME}/bin/AnsiColors256.ans"
backup

設定ファイルをバックアップしておけば環境の再構築は簡単だ。
git用にdotfilesというフォルダにコピーするようにしているが、環境に合わせてバックアップ先を変更すればよい。

# backup

function backup_()
{
    # バックアップ先の設定
    BAK="${HOME}/dotfiles"
    #BAK="/c/devx/backup/msys2"

    # ディレクトリがなければ作成する(-p)
    mkdir -p ${BAK}/bin
    mkdir -p ${BAK}/etc

    # ユーザーのbinファイルをコピーする
    cp -u ~/bin/* ${BAK}/bin

    # 設定ファイルをコピーする
    cp -u ~/.??* ${BAK}/

    # 起動時マウント設定をコピーする
    cp -u /etc/fstab ${BAK}/etc/
    cp -u /etc/pacman.conf ${BAK}/etc/
}

echo "start backup..."

echo "copy files..."
backup_

#echo "git commit"
#echo "git push"

echo "finished!!"
exit 0
restore

バックアップからの復元。

# restore

function restore_()
{
    # バックアップフォルダを指定
    BAK="${HOME}/dotfiles"
    #BAK="/c/devx/backup/msys2"

    # ユーザーのbinファイルをコピーする
    cp -u ${BAK}/bin/* ~/bin

    # 設定ファイルをコピーする
    cp -u ${BAK}/.??* ~/

    # 起動時マウント設定をコピーする
    cp -u ${BAK}/etc/fstab /etc/
    cp -u ${BAK}/etc/pacman.conf /etc/
}

while true; do
    read -p "Do you want to run the restore?(Enter to yes): " yn
    case $yn in
        "" | [Yy]* ) break;;
        * ) echo "exit!!"; exit;;
    esac
done

echo "start restore..."

#echo "git fetch"

echo "copy files..."
restore_

echo "finished!!"
exit 0
install-msys2-apps

msys2用のソフトウェアを一括でインストールする。
実行前にupdate-corepackman -Suを忘れずに実行しておく。

# install-msys2-apps

function try_pacman()
{
    if type $1 &>/dev/null; then
        echo -e "${1} installed"
    else
        echo "${1} install..."
        pacman -S --noconfirm --color=auto $1
    fi
}

function install_()
{
    ###
    # for packman
    ###

    # パッケージグループは判別できないのでGCCで判定
    if type /mingw32/bin/gcc &>/dev/null; then
        echo -e "mingw-w64-i686-toolchain installed"
    else
        echo "mingw-w64-i686-toolchain install..."
        pacman -S --noconfirm --color=auto mingw-w64-i686-toolchain
    fi

    try_pacman winpty
    try_pacman git

    try_pacman vim
    try_pacman nano

    # makeはMinGW32でmingw32-makeとなっているのでaliasで対応
    #try_pacman make

    # autotoolsをインストール
    try_pacman autoconf
    try_pacman automake

    try_pacman cmake
    try_pacman doxygen
    try_pacman tree
    try_pacman wget
    try_pacman w3m
    try_pacman man

    # キャッシュを消去
    echo
    pacman -Sc --noconfirm
}

echo "start install-msys2-apps...\\n"
install_

echo
echo "finished!!"
exit 0

参考
$HOME/binにあるスクリプトを晒してみる

dotfiles

dotfilesをgitで管理するのが便利だ。
msys2のlnでシンボリックリンクを作成するには起動時に環境変数を設定する必要がある。
管理者権限が必要となるが、MSYS2でもdotfilesのインスールスクリプトがそのまま使えそうだ。

参考
最強の dotfiles 駆動開発と GitHub で管理する運用方法

ConEmu

minttyをそのまま使ってもよいが、他のターミナルをためしてみるのもよい。

ConEmuのインストールと設定

下記からインストーラーをダウンロードして実行する。
256色使いたい場合は、後述するALPHA版をダウンロードすべし。

ConEmu

設定を開いてシェルをmsys32のbashに変更する。
Startupの中のSpecified named taskに{Bash::Msys2-32}という設定がある。
中身を見ればわかるが、/msys32/usr/bin/sh.exe --loginとして起動している。
存在しなければ、Startup - Tasksで追加できる。

参考
ConEmu タスク・起動設定
ConEmuから起動するTasksのオプションを設定するときに参考になる。

ConEmu 突っ込んだら Git for Windows の Git Bash がカッコよくなった
タブのコンテキストメニューに言及している。
Restart系のメニューが地味に便利で、画面分割や管理者権限も可能。

ConEmuで256色を使用する

ConEmuでmsys2やcygwinを利用する場合、そのままでは256色を表示できない問題がある。
詳しくは参考のリンク先で説明されているが、簡単にやり方を載せておく。
ALPHA版の最新版でしか対応していないので注意されたし。

ダウンロード
ConEmu(ALPHA)
cygwin-connector

  1. ConEmuの最新のALPHAバージョンを使用する。
  2. cygwin-connectorの最新版を使用する。
  3. 解凍し、該当するファイルをsh.exeと同じディレクトリに入れる。
  4. ConEmuの起動Taskを追加する。

msys2の32bitを使用する場合はconemu-msys2-32.exeをc:/msys2/usr/binに入れる。

追加するタスク: Bash::Msys2-32(conn)

set CHERE_INVOKING=1 & set MSYSTEM=MINGW32 & %ConEmuDrive%\msys32\usr\bin\conemu-msys2-32.exe -new_console:C:"%ConEmuDrive%\msys32\msys2.ico"

参考
ConEmuで256色が使えない理由
Cygwin and pty related issues
ConEmuで256色を使う方法
cygwin/msys terminal connector
ANSI X3.64 and Xterm 256 colors