DEPRECATED
msys2ではpecoを諦めfzyを使うと幸せになりました。
http://qiita.com/ubnt_intrepid/items/ea6df730e69a0f402cca#_reference-bde7680190061d3dc07b
tldr
すごく無理やりだが以下の方法によりmsys2でpecoを使えるようになる
function peco_ls() {
ls > /tmp/ls.txt
script -qc "winpty peco /tmp/ls.txt" /tmp/typescript
local target="$(col -bx < /tmp/typescript | tail -2 | head -1 | sed s/0K$// | sed s/^0m// )"
echo "$target"
}
概要
- pecoにinputをファイルから与える
- pecoで選択したものを標準出力する(デフォルトの挙動)
- scriptコマンドで標準出力の内容を保存して取得する
what
- pecoはinputを、標準入力かファイルから与えることができる
- msys2で対話的プログラムを実行する場合winptyを挟む必要がある
- しかしwinptyは入出力にパイプを使えないっぽい(input is not a ttyなどのエラーが出る)
- pecoにinputをファイルから与える
応用(ラッパー関数作って使いやすくする)
function _pecowrap_exec() {
eval "$@" > /tmp/cmd.log
script -e -qc "winpty peco /tmp/cmd.log" /tmp/script.log
}
function _pecowrap_result() {
local result="$(col -bx < /tmp/script.log | tr -d '\n' | sed 's/.*0m\(.*\)0K.*$/\1/g' | sed 's/0K//g')" # TODO 強引。特に"0K"が含まれると削除しちゃう
echo "${result}"
}
function c() {
_pecowrap_exec "find $1 -maxdepth 1 -type d | sort" || return
cd $(_pecowrap_result)
}
function v() {
_pecowrap_exec "find $1 -maxdepth 1 -type f | sort" || return
vi $(_pecowrap_result)
}
試行錯誤メモ
以下を試したが全てうまくいかなかった
- peco以外のツールを試す
- fzf
- etc.
- mintty以外のterminalを試す
雑感
- Windows Subsystem for Linuxが来たら、msys2不要にできるかもなので、今はworkaroundで乗り切ろう