Edited at

ArchLinux の pacman で、うる覚えの導入済みパッケージを楽に探したい

More than 1 year has passed since last update.


概要

例えば、ネットワーク関係の、とある機能に問題が生じ

「えーと、あの、ネットワーク関連のパッケージ... 何を使っていたっけ?」

という状況下で当該パッケージを探し当てたい。


  • とある機能を実現するには選択肢が複数存在する

  • 自分が何を選択したのか完全に失念

  • 当然、パッケージ名は不明


目標


  • 曖昧なワードから、インストール済みのパッケージを検索したい

  • 問題解決の為に当該パッケージの詳細も表示したい

  • 割とよくあるので手軽に済ませたい


今まで


検索

インストール済みのパッケージ名と、その説明文を対象に network で検索する。

$ pacman -Qs network

local/パッケージ名 バージョン
説明文
local/パッケージ名 バージョン
説明文
local/パッケージ名 バージョン
説明文

オプション等

$ pacman <オペレーション> [オプション] ...



  • -Q, --query (オペレーション): ローカルデータベースに問い合わせる


  • -s, --search <正規表現> (オプション): インストール済みパッケージの部分一致検索


詳細表示

先ほどのリストからパッケージ名を手入力で

$ pacman -Qii networkmanager

名前 : networkmanager
バージョン : 1.6.2-3
説明 : Network connection manager and user applications
アーキテクチャ : x86_64
URL : https://wiki.gnome.org/Projects/NetworkManager
ライセンス : GPL2 LGPL2.1
グループ : なし
提供 : なし
... 以下略 ...



  • -i, --info <パッケージ名>: パッケージ情報の表示



    • -ii でバックアップファイル (/etc 以下に置かれる設定ファイルの類?)も表示。




問題点


  • 「検索」と「詳細表示」間の手入力が面倒

  • 「詳細表示」の結果、目当てのパッケージでは無かった場合に、やり直すのがストレスフル


解決策


  • 検索

  • 絞り込み&選択 (今回は peco を使う)

  • 詳細表示

をループさせる。

#! /bin/sh

set -eu

query="${1:-}"

while :; do
# 検索及び選択

# 端末上部に peco を表示
# pkg_name="$(pacman -Qs "${query}" | peco --layout 'top-down')"

# 端末下部に peco を表示
pkg_name="$(pacman -Qs "${query}" | tac | peco --layout 'bottom-up')"

# 空選択 -> 終了
if [ -z "${pkg_name}" ]; then
break
fi

# 選択した文字列が半角スペース4つで始まる場合は説明文
# -> やり直し
if [ -z "${pkg_name## *}" ]; then
continue
fi

# バージョン部分を削る
pkg_name="${pkg_name%% *}"
# ローカルデータベースの接頭辞を削る
pkg_name="${pkg_name##local/}"

# 詳細表示
pacman -Qii "${pkg_name}" | less
done

これに適当なコマンド名を付けて、パスの通った場所に置く。

$ コマンド名 '適当なワード (正規表現可)'

検索結果を peco で選択すると less でパッケージの詳細が表示される。less を閉じると peco での選択に戻る。peco を閉じると終了。

※ パッケージ名と説明文で、2行を 1要素として扱いたいが peco では 1行に付き 1要素なので無理やり解決している。

query 未指定の場合、peco に「検索」部分も任せる事になるが、検索文字列によっては、説明文ばかりがヒットしてしまい使い物にならない。


参考