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のインストールと起動
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コマンドのオプションについて、使用頻度の高い順に並べてみた。
ヘルプのやり方だけ覚えておけば、迷った時に確認できるだろう。
-
pacman -h
でヘルプ。 -
pacman -S -h
で-Sオプションのヘルプ。 -
pacman -Su
でパッケージのアップデート(事前にupdate-coreが必要)。 -
pacman -Ss [pattern]
でパッケージを検索。 -
pacman -Sl | grep [pattern]
でもだいたい分かる。 -
pacman -S [package]
でインストール。 -
pacman -Rs [package]
でアンインストール。 -
pacman -Sg
でパッケージグループの一覧を表示。 -
pacman -Qqe
でインストール済みのパッケージ一覧を表示。 -
pacman -Si [package]
で詳しい情報を表示。 -
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-core
とpackman -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
dotfiles
dotfilesをgitで管理するのが便利だ。
msys2のln
でシンボリックリンクを作成するには起動時に環境変数を設定する必要がある。
管理者権限が必要となるが、MSYS2でもdotfilesのインスールスクリプトがそのまま使えそうだ。
参考
最強の dotfiles 駆動開発と GitHub で管理する運用方法
ConEmu
minttyをそのまま使ってもよいが、他のターミナルをためしてみるのもよい。
ConEmuのインストールと設定
下記からインストーラーをダウンロードして実行する。
256色使いたい場合は、後述するALPHA版をダウンロードすべし。
設定を開いてシェルを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
- ConEmuの最新のALPHAバージョンを使用する。
- cygwin-connectorの最新版を使用する。
- 解凍し、該当するファイルをsh.exeと同じディレクトリに入れる。
- 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