msys2で(強引に)pecoを使う


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で乗り切ろう