概要
例えば、ネットワーク関係の、とある機能に問題が生じ
「えーと、あの、ネットワーク関連のパッケージ... 何を使っていたっけ?」
という状況下で当該パッケージを探し当てたい。
- とある機能を実現するには選択肢が複数存在する
- 自分が何を選択したのか完全に失念
- 当然、パッケージ名は不明
目標
- 曖昧なワードから、インストール済みのパッケージを検索したい
- 問題解決の為に当該パッケージの詳細も表示したい
- 割とよくあるので手軽に済ませたい
今まで
検索
インストール済みのパッケージ名と、その説明文を対象に 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
に「検索」部分も任せる事になるが、検索文字列によっては、説明文ばかりがヒットしてしまい使い物にならない。