LoginSignup
0
0

More than 5 years have passed since last update.

OSのパッケージをリストアップしたい!【Fish編】

Last updated at Posted at 2018-03-30

Atomではapm list --installed --bareコマンドを使うことで、現在使用している拡張機能のリストアップができます。
これをなんとかOSのパッケージマネージャーでも再現できないかな、という試みです。
必要なパッケージの吟味、再セットアップ用のバックアップなんかにきっと役立つと思います。

方針

リスト化する際はコマンドで入力したものだけを出力します。
依存パッケージはとくに知る必要がありませんし、眺めるにしても邪魔でしかありません。見るにも使うにも便利なものが欲しいんです。

さて、そうなると出力までの流れはこんな感じになりそうです。

  1. fish_historyを見る
  2. インストールコマンドとアンインストールコマンドを抽出
  3. 現在使っているパッケージ名だけを残して出力

うーん、シンプル。すばらしい。
ただbashと違ってコマンドの抽出と加工にちょっと手間がかかります。しかたないね。

やってみよう

まずはリソースとなるfish_historyを見てみましょう。

たとえばAntergos(マネージャーはyaourt)におけるfish_historyの中身はこんな感じ。
fish_historyは$HOME/.local/share/fishもしくは$XDG_DATA_HOME/fishの中にあります。

- cmd: yaourt -S vim
  when: 1511092067
- cmd: vim --version 
  when: 1511092088
- cmd: type git
  when: 1511092110
- cmd: yaourt -Ss git
  when: 1511092132

こいつを以下のような関数で処理すれば、うまくリスト化できそうです。

yaourt_file.fish
function yaourt_file
    # 1. fish_historyを探す
    set -l history_dir "$HOME/.local/share/fish"
    set -q XDG_DATA_HOME
        and test -d $XDG_DATA_HOME
        and set history_path "$XDG_DATA_HOME/fish"
    set -l history "$history_path/fish_history"
    if test ! -f $history
        echo "Error: fish_historyが見つかりませんでした。"
        return 128
    end

    # 2. コマンドを抽出する
    set -l commands (cat $history \
                        | grep -E "^- cmd: yaourt ((-S)|(-R)) " \
                         # 置換に使う文字をスペースにしてエラー回避
                        | sed -e 's/[\\\\|\/]/ /g' \
                         # コマンドの簡略化。手順3で使いやすいように
                        | sed -e "s/- cmd: yaourt -S /<S> /g" \
                        | sed -e "s/- cmd: yaourt -R /<R> /g")

    # 3. 現在インストールされているパッケージのみを抽出
    set -l result "|"
    set -l is_install_command 1
    for i in (string split " " $commands)
        switch $i
            case <S>
            set is_install_command 0
            case <R>
                set is_install_command 1
            case "" "-*"
                # 空行もしくはオプションなので無視
            case "*"
                if test $is_install_command -eq 0
                    if string match "*|$i|*" $result > /dev/null
                        # すでに追加済みのパッケージなので無視
                    else
                        # パッケージ名を確認
                        # 正しい名前ならリストに追加
                        yaourt -Q $i > /dev/null
                        and set result "$result$i|"
                    end
                else
                    set result (string replace -a "|$i|" '|')
                end
        end 
    end

    # リスト形式で出力
    test $result = "|"
        and echo "Notice: 該当するパッケージはありませんでした。"
        or  string trim -c "|" $result | string split "|"
end

実際にやってみるとこんな感じ。

Terminal

$ yaourt_file
gvim
clang
python-pip
python2-pip
tig
stack
nim
ruby
julia

(以下略) 

これを使って再インストールするときはこんな風に。

yaourt_unfile.fish
function yaourt_unfile
    set -l list (yaourt_file | string join " ")
    eval "yaourt -S $list"
end

以上、ニッチすぎる内容ですが、ぜひお試しあれ。

パッケージにしました

上記処理を汎用的に使えるようにしたlpkgというパッケージを作りました。ついでに再インストール用のコマンドも付けてます。
興味のある方はぜひご利用くださいませ。

# fishermanでインストールするなら
$ fisher rkbk60/lpkg
0
0
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
0
0