【bash/zsh】検索付きリスト表示をターミナルで

iptv でテレビを見る。


モバイル、パソコンを問わずいろいろなOSで見ることができる。

ざっくり1分遅れで、気の利いた動画クライアントで見ることができるのだが、

GUI アプリでは、不具合時の状況が掴みづらい。

なので、ターミナル経由で見てみる。

👉 Roshan-R/termv: A terminal iptv player written in bash

この termv というアプリ。

ターミナル上の検索付き選択肢一覧リスト表示。

どうやって作ってるのか。

コードを見てみます。


SHELL="${BASH_BINARY}" \
            fzf -e -i --reverse --cycle --with-nth="1..-2"\
                --bind "enter:execute(_play {})"\
                --bind "double-click:execute(_play {})"\
                --header="Select channel (press Escape to exit)" -q "${*:-}" \
            < <( printf '%s\n' "${CHANNELS_LIST}" )

https://github.com/Roshan-R/termv/blob/0b7468d1bba239e50adc7e7693035f3652b9bec4/termv#L210

「fzf」というやつ。




多くの人が集まっています。


👉️ junegunn/fzf: :cherry_blossom: A command-line fuzzy finder

先人先生、今回も勉強になります。

いつもありがとうございます。


【SwiftUI】吹き出しを作りたい

Instagram のこれ。

作ってみようと。

 

🧑🏻‍💻 popover で作る

使えそうなのでやってみました。

👉 popover(isPresented:attachmentAnchor:arrowEdge:content:) | Apple Developer Documentation



struct AnimatedSpeechBubble: View {
  @State private var show = false

  var body: some View {

    HStack {
      Text("お知らせ")
        .popover(isPresented: $show, arrowEdge: .trailing) {
          Text("横に出せないの?")
            .padding(.horizontal)
            .foregroundStyle(.background)
            .presentationBackground(.red)
            .presentationCompactAdaptation(.popover)
        }
      Spacer()
    }
    .frame(width: 250, height: 50)

    Button(show ? "hide" : "show") {
      show.toggle()
    }
    .buttonStyle(.borderedProminent)

  }
}

#Preview("animated") {
  AnimatedSpeechBubble()
    .padding()
    .frame(maxWidth: .infinity)
}

なぜか横 ( .trailing ) 方向に出すことができません。

GIFにしてみたら背景色もなんかあやしい。

あと、ボタンの色も勝手に変わる。

 

🧑🏻‍💻 手作りで

基本の組み合わせで作ります。

まず、吹き出しを作ります。

Path() は使いません。


struct SpeechBubble: View {
  var count: Int

  var body: some View {
    HStack(spacing: 0) {
      Rectangle()
        .fill(.red)
        .rotationEffect(.degrees(45))
        .frame(width: 20, height: 20)
        .offset(x: 14)
        .clipShape(.rect) // *
      HStack {
        Image(systemName: "heart.fill")
        Text("\(count)")
      }
      .foregroundStyle(.background)
      .padding()
      .background(.red, in: .rect(cornerRadius: 8))
    }
  }
}

#Preview("bubble") {
  SpeechBubble(count: 999)
}

アニメーションな部分は scaleopacity のトランジションを使います。


if show {
  SpeechBubble(count: 999)
    .transition(.scale(scale: 0.25).combined(with: .opacity))
}

いい感じです。

 

🧑🏻‍💻 まとめ

手作りでまあいけそうです。

以上のソースコード一式です。


【macOS】アプリのインストーラーを create-dmg で作る

macOS アプリを作ったら、

dmg 形式にしてインストールできるようにしましょう。

ツールを使います。


👉 create-dmg/create-dmg: A shell script to build fancy DMGs hatena-bookmark

Homebrew でインストールしました。


brew install create-dmg

👉 create-dmg — Homebrew Formulae hatena-bookmark

するといくつかエラーとなりました。

 

🧑🏻‍💻 execution error: Not authorized to send Apple events to Finder. (-1743)

以下のようなエラーが表示されて.dmgファイルは作成されませんでした。

(途中の一時的なファイルは作成された。)

execution error: Not authorized to send Apple events to Finder. (-1743)

設定から、以下で権限を付与すればいいそうです。


Security & Privacy
  ↓
Automation
  ↓
Terminal (or iTerm)
  ↓
Finder ✅


👉 macOS 11: execution error: Not authorised to send Apple events to Finder. (-1743) · Issue #113 · create-dmg/create-dmg hatena-bookmark

 

🧑🏻‍💻 hdiutil does not support internet-enable. Note it was removed in macOS 10.15.

以下のような警告?のようなものが表示されました。

hdiutil does not support internet-enable. Note it was removed in macOS 10.15.

これは、オプションに、


--no-internet-enable

を付ければ消えました。

👉 hdiutil internet-enable · Issue #76 · create-dmg/create-dmg hatena-bookmark

 

🧑🏻‍💻 まとめ

以上を含めて、必要最小限なオプションで、

以下のように実行することで、

dmg インストーラーを作ることができました。


test -f Sample-Installer.dmg && rm Sample-Installer.dmg
create-dmg \
--window-pos 0 0 \
--icon "Sample.app" 175 125 \
--app-drop-link 325 125 \
--volname "Sample-Installer" \
"Sample-Installer.dmg" \
"Sample 2024-08-05 22-20-23/" \
--no-internet-enable \
--hdiutil-verbose

他にも、オプション記述はたくさんあるので、

さらに調整して使いやすものにしていくことができるようです。

 

🧑🏻‍💻 関連記事