Atomではapm list --installed --bare
コマンドを使うことで、現在使用している拡張機能のリストアップができます。
これをなんとかOSのパッケージマネージャーでも再現できないかな、という試みです。
必要なパッケージの吟味、再セットアップ用のバックアップなんかにきっと役立つと思います。
方針
リスト化する際はコマンドで入力したものだけを出力します。
依存パッケージはとくに知る必要がありませんし、眺めるにしても邪魔でしかありません。見るにも使うにも便利なものが欲しいんです。
さて、そうなると出力までの流れはこんな感じになりそうです。
- fish_historyを見る
- インストールコマンドとアンインストールコマンドを抽出
- 現在使っているパッケージ名だけを残して出力
うーん、シンプル。すばらしい。
ただ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
こいつを以下のような関数で処理すれば、うまくリスト化できそうです。
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
実際にやってみるとこんな感じ。
$ yaourt_file
gvim
clang
python-pip
python2-pip
tig
stack
nim
ruby
julia
(以下略)
これを使って再インストールするときはこんな風に。
function yaourt_unfile
set -l list (yaourt_file | string join " ")
eval "yaourt -S $list"
end
以上、ニッチすぎる内容ですが、ぜひお試しあれ。
パッケージにしました
上記処理を汎用的に使えるようにしたlpkgというパッケージを作りました。ついでに再インストール用のコマンドも付けてます。
興味のある方はぜひご利用くださいませ。
# fishermanでインストールするなら
$ fisher rkbk60/lpkg