LoginSignup
7
5

More than 5 years have passed since last update.

msys2で(強引に)pecoを使う

Last updated at Posted at 2016-05-08

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"
}

動作イメージ
Animation.gif

概要

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5